VS2015中拉丁2符号的编码
Posted
技术标签:
【中文标题】VS2015中拉丁2符号的编码【英文标题】:Encoding of Latin 2 signs in VS2015 【发布时间】:2016-05-18 23:03:40 【问题描述】:我正在尝试让我的 C++ 程序同时接受 CP852(Latin 2) 以文本形式在控制台中写入的标志,以及从简单的文本文件加载。 我无法弄清楚默认编码是什么,因为任何一种方式都会给我不同的 ANSI 代码。 我已将 CP 设置为中欧 (DOS) 852 在高级保存选项中。
1) 使用(int)ł
投射给我的号码是136
2) 分配给变量unsigned char sign = 'ł'
并用cout
将其打印在屏幕上给了我数字136
3) 使用“添加监视”控件到包含 ł 的变量,它显示数字 179
4) 从文本文件加载时,再次179,使用这个简单的代码
int x;
FILE* plik;
plik= fopen("Text.txt", "r"); // It contains 2 signs, "oł"
while ((x = fgetc(plik)) != EOF)
cout << (char)x;
fclose(plik);
输出:“o|”
我的主要问题是,为什么它处理相同的符号(或者我错了?)“ł”一次是 136 而另一次是 179?如何处理这个问题?这样我就无法打印并接受带有比较的符号,因为它们的代码不同,即使文件中的内容与控制台窗口中的内容完全相同。
【问题讨论】:
除非您尝试支持 90 年代之前的代码库,否则为什么不使用 Unicode?span> 我目前正在编写一个霍夫曼方法文本压缩程序,这就是为什么我的第一个想法是使用适合一个字节的编码。 ANSI 似乎是显而易见的选择,因为我的需求只包括标准字母 + 特定的 Latin2 符号。 使用 UTF-8。这是显而易见的选择。如果您不了解字符集是什么,ANSI 将变得一团糟 @Mr_Max:在您编写压缩程序时,真的并不重要。霍夫曼编码根据其频率将可变长度代码分配给ł
。源编码真的无关紧要,只要您的压缩器知道如何获取正确的输入标记(即使用 UTF-8,您需要考虑是要压缩字节还是字符)
【参考方案1】:
首先使用十六进制编辑器检查您的 text.txt 文件,它应该包含字节 0x6F 和 0x88(111 和 136)。从 C++ 程序中读取此文件时,将值输出为 int,而不是 char,以确定正确的值。将其输出为 char 需要使用与您期望的一致的输出代码页。请参阅运行 C++ 应用程序的命令提示符中的“属性”、“选项”选项卡、“当前代码”页面。如果这不是 CP852,它不会像您期望的那样显示字符。
【讨论】:
【参考方案2】:尝试使用不同版本的 fopen:
FILE* plik= NULL;
int err= _tfopen_s(&plik, _T("Text.txt"), _T("rt"));
if(err != 0 || plik == NULL)
ASSERT(FALSE);
return 1;
另见文档:
fgetc, fgetwc _fgetchar, _fgetwchar【讨论】:
以上是关于VS2015中拉丁2符号的编码的主要内容,如果未能解决你的问题,请参考以下文章