【问题标题】:Encoding of Latin 2 signs in VS2015VS2015中拉丁2符号的编码
【发布时间】: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,您需要考虑是要压缩字节还是字符)

标签: c++ visual-c++ visual-studio-2015


【解决方案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;
    }
    

    另见文档:

    【讨论】:

      猜你喜欢
      • 2011-01-27
      • 1970-01-01
      • 2013-08-28
      • 1970-01-01
      • 2012-11-12
      • 2017-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多