C:转换特殊的ASCII字符ÄÖÜ

时间:2011-06-30 14:26:43

标签: c ascii character diacritics

我正在使用Curl从网站上读取文字。所有的原始数据都是按字符返回

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

我的问题是,所有特殊人物如ÄÖÜäöüß等都是错的,看起来非常神秘。我目前正在通过使用此表调整其值来手动更正它们:

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

我现在想知道,如果有更优雅的方式来做这件事,以及其他人如何解决这些问题。

2 个答案:

答案 0 :(得分:1)

我猜你必须使用像iconv之类的外部库来创建一个包含数据的wchar_t字符串。这取决于使用的字符编码。

答案 1 :(得分:1)

这是编码问题。如果你逐字节读取数据,你可以正确,轻松地处理单字节编码(如ISO-8859“系列”等等),前提是你有办法在目标编码中正确转换它们,如果你需要的话。但是使用像UTF-8这样的编码你不太幸运,因为要获得正确的代码,你需要读取1个字节,或者2个,或者三个......如果你将它们串流成一个字符串,并完全打印字符串,输出设备的编码与输入编码相同,无论如何都会显示正确的字符。

如果没有发生,并且您没有打印每个字节就好像它是一个符号,那么输出设备的编码与编写字符串的编码不匹配。

如果输出,一旦你打印字符串“altogether”看起来没问题,那么问题是你将每个字节解释为单个字符,而它不是(你有一个多字节编码的char就像特殊的你一样)提到;可能是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,则会得到不同的结果;如果它是单字节编码,你获得相同的输出(除了换行符),但就我所写的内容而言是“错误的”,即èòà。

“Latin”中的“相同”文字是“\ xe8 \ xf2 \ xe0”。 Latin1是单字节编码,因此上述语音适用。如果在了解utf-8的终端上打印,你可以获得类似 ...

的内容

因此,编码很重要,设备/格式输出编码也很重要,您必须知道两者,以便正确处理和显示文本。 (关于格式,一个例子可能是html,你可以在其中指定内容的编码......你必须是连贯的,你会看到一切都很好)