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符号的编码的主要内容,如果未能解决你的问题,请参考以下文章

常见编码方式(码表)

字符编码

JavaScript 字符编码

我需要在拉丁语 1 --> UTF-8 中修复隐藏的编码错误吗?

字符编码与二进制

004-python基础-字符编码与转码