首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >排版撇号+宽字符串文字中断了我的wofstream (C++)

排版撇号+宽字符串文字中断了我的wofstream (C++)
EN

Stack Overflow用户
提问于 2009-05-03 01:59:37
回答 3查看 1.1K关注 0票数 1

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

这段代码可以工作

代码语言:javascript
复制
ofstream file("test.txt");
file << "A’B" ;
file.close();

==> A‘B

这段代码可以工作

代码语言:javascript
复制
wofstream file("test.txt");
file << "A’B" ;
file.close();

==> A‘B

此代码失败

代码语言:javascript
复制
wofstream file("test.txt");
file << L"A’B" ;
file.close();

==> A

此代码失败...

代码语言:javascript
复制
wstring test = L"A’B";
wofstream file("test.txt");
file << test ;
file.close();

==> A

有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-05-03 08:54:14

在使用wofstream之前,您应该“启用”locale:

代码语言:javascript
复制
std::locale::global(std::locale()); // Enable locale support 
wofstream file("test.txt");
file << L"A’B";

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

代码语言:javascript
复制
wofstream file("test.txt");
file << "A’B" ;
file.close();

这段代码之所以有效,是因为"A’B"实际上是utf-8字符串,您可以将utf-8字符串逐字节保存到文件中。

注意:我假设您使用的是类似于OS的POSIX,并且您的默认区域设置与默认区域设置"C“不同。

票数 1
EN

Stack Overflow用户

发布于 2009-05-03 02:05:01

你确定不是你的编译器对源文件中unicode字符的支持被“破坏”了吗?如果使用\x或类似的方法对字符串文字中的字符进行编码,该怎么办?你的源文件是不是以任何可能的编码方式转换成你的编译器的wchar_t

票数 0
EN

Stack Overflow用户

发布于 2009-05-03 07:05:44

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/816092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档