文件字符编码
C++ File character encoding
好的,所以我试图读取json格式的文本文件与口音(法语),在W8下,使用c++ (Visual Studio 2012 Express)。
这是文件:
{"products": [{"id": 125, "label": "Billél"}, {"id": 4, "label": "Rùbin"}]}
一行,以UTF-8编码(无BOM),保存为D:/p.txt
这是c++中的读取代码:
std::ifstream in("D:/p.txt", std::ios::binary | std::ios::in);
std::string content( (std::istreambuf_iterator<char>(in) ), (std::istreambuf_iterator<char>() ) );
得到的输出:
{"products": [{"id": 125, "label": "Bill├®l"}, {"id": 4, "label": "R├╣bin"}]}
尝试使用CharToOemA:
{"products": [{"id": 125, "label": "Billél"}, {"id": 4, "label": "Rùbin"}]}
我的代码页应该允许我在控制台中显示重音(我尝试了这样的重音,产生了一个完美的显示)。我的c++控制台的输入和输出代码页都是CP850 (IBM international Latin-1)。
如何让我的代码在控制台中输出正确的重音?如果可能的话,我最终需要一个跨平台的解决方案。
如果有UTF-8,并且您输出到期望ISO 8859-1的窗口,这是行不通的。如果您有UTF-8(它将是(如果全局语言环境仍然是默认的"C"
),那么您是否可以将窗口更改为代码页65001,还是必须更改在输出前转换编码。
关于可移植性,没有真正的解决方案;你要做什么取决于目的地如何解释字节你的输出。在Windows下,您可以更改代码页;下Unix系统(X Windows),它是字体的编码窗口使用很重要。在这两种情况下,它们可能是不同的对于同一台机器上的不同Windows。
您是否尝试过使用chcp 65001
,它应该将代码页切换到UTF-8,根据MSDN。还要注意,默认的控制台字体可能无法显示所有的UTF8字形,我建议使用Lucida Console
代替。
相关文章:
- 是否有任何区域设置会影响宽字符编码?
- CP1251:从字符* 转换为 wchar_t* 时的编码失真
- 使用C++将越南语字符从ISO88591、UTF8、UTF16BE、UTF16LE和UTF16编码为十六进制,反之亦然
- 将二进制编码的无符号字符转换为整数
- 如何C++ WCOUT UTF-16 编码的字符数组?
- 字符编码和带有C++的文件名
- 如何在没有wchar_t的情况下在 c++ 中解码/编码 UTF-8 字符
- 如何定义一个从任何编码空间解析单个字符的精神 x3 解析器?
- C 14:UTF-8/UTF-16与本机字符编码之间的转换
- qt base64编码/decode添加逃脱字符
- 比较UTF8编码的字符
- 从键盘读取 UTF-8 编码的字符
- 如何获取 json 文件的字符编码类型
- 哪种方法更适合霍夫曼编码 我想读取字符及其频率
- Base64 在编码特殊字符时不起作用
- 编码一个字符
- C 和卷曲,发送电子邮件时编码奇怪的字符
- C 日食控制台编码纯文本作为其他字符
- 用于 pbm 文件的预编码字符和数字资源(便携式位图)
- 通过boost::asio传输多编码字符的最佳方式