我正在尝试启用我的C ++程序来接受这两者 来自CP852(拉丁文2)的标志以控制台中写入的文本形式,以及从简单的文本文件加载。 我无法弄清楚什么是默认编码,因为任何一种方式都给我不同的ANSI代码。 我已将CP设置为中欧(DOS)852 在高级保存选项中。
1)使用(int)ł
投射给我的数字 136
2)分配给变量unsigned char sign = 'ł'
并使用cout
在屏幕上打印它给了我
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 ?如何处理这个问题?这样我就无法打印并接受带有比较的符号,因为它们的代码不同,即使文件中的内容与控制台窗口中的内容完全相同。
答案 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;
}
另见文件: