打字撇号+宽字符串文字打破了我的wofstream(C ++)

时间:2009-05-03 01:59:37

标签: c++ unicode widestring wofstream

我在处理不祥的印刷撇号(')时遇到了一些奇怪的行为 - 而不是打字机撇号(')。与广泛的字符串文字一起使用,撇号打破了wofstream。

此代码有效

ofstream file("test.txt");
file << "A’B" ;
file.close();

==&GT; A'B

此代码有效

wofstream file("test.txt");
file << "A’B" ;
file.close();

==&GT; A'B

此代码失败

wofstream file("test.txt");
file << L"A’B" ;
file.close();

==&GT;甲

此代码失败......

wstring test = L"A’B";
wofstream file("test.txt");
file << test ;
file.close();

==&GT;甲

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

在使用wofstream之前,您应该“启用”语言环境:

std::locale::global(std::locale()); // Enable locale support 
wofstream file("test.txt");
file << L"A’B";

因此,如果您有系统区域设置en_US.UTF-8,则文件test.txt将包含 utf8编码数据(4个字节),如果你有系统区域设置en_US.ISO8859-1,那么它会将其编码为8位编码(3个字节),除非ISO 8859-1错过了这样的字符。

wofstream file("test.txt");
file << "A’B" ;
file.close();

此代码有效,因为"A’B"实际上是utf-8字符串并且您保存utf-8 字符串到字节逐字节。

注意:我假设您使用的是类似操作系统的POSIX,并且您的默认语言环境与默认语言环境“C”不同。

答案 1 :(得分:0)

你确定你的编译器不支持源文件中的unicode字符被“破坏”吗?如果使用\x或类似字符串对字符串文字中的字符进行编码,该怎么办?您的源文件甚至是编译器的wchar_t可能的编码吗?

答案 2 :(得分:0)

尝试将流插入字符包装在try-catch块中,并告诉我们抛出的异常(如果有)。

我不确定这里发生了什么,但无论如何我都会骚扰猜测。印刷撇号可能具有适合一个字节的值。这适用于"A’B",因为它盲目地复制字节而不必担心底层编码。但是,对于L"A’B",依赖于实现的编码因子起作用。它可能找不到正确的UTF-16(如果你在Windows上)或UTF-32(如果你在* nix / Mac上)值来存储这个特定字符。