这是一个编码问题。如果您逐字节读取数据,您可以正确轻松地处理单字节编码(如ISO-8859“系列”等等),前提是您可以根据需要使用目标编码正确转换它们。但通过UTF-8等编码,您不那么幸运,因为要获得正确的代码,您需要读取1个字节,或者2个或3个字符......如果将它们串入字符串中,并将字符串打印出来,输出设备的预期编码与输入编码相同,无论如何你都会得到正确的字符。
如果没有发生,并且您不打印每个字节就好像它确实是一个符号一样,那么输出设备的预期编码与写入字符串的编码不匹配。
如果输出,一旦你打印字符串“完全”看起来没问题,那么问题是你正在将每个字节解释为单个字符,而不是(你有一个字符的多字节编码像特殊字符你提到过;可能是UTF-8,但它可能不是)。
如果在两种情况下(当您逐个打印每个字节并输出保留整个字节序列的字符串时)得到相同的结果,则输出设备的预期编码是单字节编码,如输入编码,但它们不匹配。
进一步的细节将需要知道如何收集您阅读的字节,以便打印它们并说它们看起来很神秘。
一个例子。
const char *string = "\xc3\xa8\xc3\xb2\xc3\xa0";
int i;
for(i = 0; string[i] != 0; i++)
{
printf("%c\n", string[i]);
// using \n is important; if you "sequence" the chars and the output enc is
// utf-8, you obtain the right output
}
printf("%s", string);
如果输出设备编码为UTF-8,则获得不同的结果;如果它是一个单字节编码,你会得到相同的输出(除了换行符),但就我写的内容而言,它是“错误的”,即èòà。
“相同的”文本在Latin1中是“\ xe8 \ xf2 \ xe0”。 Latin1是单字节编码,因此上述语音适用。如果打印在了解UTF-8的终端上,您可以获得类似以下内容的东西:...
因此,编码很重要,设备/格式输出编码也很重要,并且您必须知道两者以便处理和显示正确的文字。 (关于格式,一个例子可能是html,你可以指定内容的编码......你必须是连贯的,你会看到一切正常)
这是一个字符编码问题。网站使用什么编码以及您在内部使用什么编码? (UTF-8?ISO 8559-1/Latin-1?Windows 1252?) – Rup
您使用的表格是错误的。它的标题是“ASCII”,但它不是:ASCII只能达到127.看起来更像Windows-1252,它是ASCII的超集。 –