1

在处理不祥的印刷撇号(')时,我刚刚遇到了一些奇怪的行为——而不是打字机撇号(')。与宽字符串文字一起使用时,撇号会中断 wofstream。

此代码有效

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

==> A'B

此代码有效

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

==> A'B

此代码失败

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

==> 一个

此代码失败...

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

==> 一个

任何想法 ?

4

3 回答 3

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 字符串逐字节保存到文件中。

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

于 2009-05-03T08:54:13.807 回答
0

您确定这不是您的编译器对源文件中“损坏”的 unicode 字符的支持吗?如果您使用\x或类似的方法对字符串文字中的字符进行编码怎么办?wchar_t您的源文件是否即使在您的编译器中可能采用任何编码?

于 2009-05-03T02:05:00.717 回答
0

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

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

于 2009-05-03T07:05:43.707 回答