在VS2015中编码拉丁文2标志

时间:2016-05-18 23:03:41

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

我正在尝试启用我的C ++程序来接受这两者 来自CP852(拉丁文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 ?如何处理这个问题?这样我就无法打印并接受带有比较的符号,因为它们的代码不同,即使文件中的内容与控制台窗口中的内容完全相同。

2 个答案:

答案 0 :(得分:0)

首先使用十六进制编辑器检查text.txt文件,它应包含字节0x6F和0x88(111和136)。从C ++程序读取此文件时,将值输出为int而不是char,以确定正确的值。将其输出为char需要输出代码页与您期望的一致使用。请参阅运行C ++应用程序的命令提示符中的“属性”,“选项”选项卡,“当前代码”页面。这不是CP852它不会像你期望的那样显示字符。

答案 1 :(得分:0)

尝试使用不同版本的 fopen

FILE* plik= NULL;
int err= _tfopen_s(&plik, _T("Text.txt"), _T("rt"));

if(err != 0 || plik == NULL)
{
    ASSERT(FALSE);
    return 1;
}

另见文件: