2011-06-30 78 views
0

我正在用Curl从网站上读取文本。所有RAWDATA正在返回逐个字符与C:转换特殊的ASCII字符ÄÜÜ

return memEof(mp) ? EOF : (int)(*(unsigned char *)(mp->readptr++)); 

我的问题是,所有的特殊字符,如ÄÖÜäöüß等都是错误的,显得很神秘。我目前手动修正他们通过使用此表调整它们的值:

http://www.barcoderesource.com/barcodeasciicharacters.shtml

我现在想知道,如果有一个更优雅的方式来做到这一点,其他人如何处理这类问题。

+3

这是一个字符编码问题。网站使用什么编码以及您在内部使用什么编码? (UTF-8?ISO 8559-1/Latin-1?Windows 1252?) – Rup

+1

您使用的表格是错误的。它的标题是“ASCII”,但它不是:ASCII只能达到127.看起来更像Windows-1252,它是ASCII的超集。 –

回答

1

这是一个编码问题。如果您逐字节读取数据,您可以正确轻松地处理单字节编码(如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,你可以指定内容的编码......你必须是连贯的,你会看到一切正常)

1

我想你必须使用外部库,如iconv来创建一个wchar_t字符串,其中包含的数据。这取决于使用的字符编码。