对 unicode 文件使用 getline 时出现问题

2023-12-25

更新:感谢 @Potatoswatter 和 @Jonathan Leffler 的评论 - 相当尴尬的是,我被调试器工具提示发现没有正确显示 wstring 的值 - 但它仍然不太适合我,我已经更新了问题以下:

如果我有一个小的多字节文件,我想读入一个字符串,我使用以下技巧 - 我使用getline分隔符为'\0' e.g.

std::string contents_utf8;
std::ifstream inf1("utf8.txt");
getline(inf1, contents_utf8, '\0');

这会读入整个文件,包括换行符。
但是,如果我尝试用宽字符文件做同样的事情,它就不起作用 - 我的wstring只读到第一行。

std::wstring contents_wide;
std::wifstream inf2(L"ucs2-be.txt");
getline( inf2, contents_wide, wchar_t(0) ); //doesn't work

例如,如果 unicode 文件包含由 CRLF 分隔的字符 A 和 B,则十六进制如下所示:

FE FF 00 41 00 0D 00 0A 00 42

基于这样的事实,使用带有“\0”的多字节文件 getline 读取整个文件,我相信getline( inf2, contents_wide, wchar_t(0) )应该读取整个 unicode 文件。然而事实并非如此 - 在上面的示例中,我的宽字符串将包含以下两个 wchar_t:FF FF

(如果我删除 wchar_t(0) ,它会按预期读取第一行(即FE FF 00 41 00 0D 00)

为什么 wchar_t(0) 不能用作定界 wchar_t 以便 getline 停止00 00(或者读到我想要的文件末尾)?
谢谢


您的 UCS-2 解码器行为不正常。的结果getline( inf2, contents_wide ) on FE FF 00 41 00 0D 00 0A 00 42应该0041 0000 = L"A"。假设您使用的是 Windows,则应正确转换行结尾,并且字节顺序标记不应出现在输出中。

建议仔细检查操作系统文档以了解如何设置区域设置。

EDIT:你设置了区域设置吗?

locale::global( locale( "something if your system supports UCS-2" ) );

or

locale::global( encoding_support::ucs2_bigendian_encoding );

其中encoding_support是某个库。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对 unicode 文件使用 getline 时出现问题 的相关文章

随机推荐