【问题标题】:C: Convert special ASCII characters ÄÖÜC: 转换特殊的 ASCII 字符 ÄÖÜ
【发布时间】:2011-09-26 01:16:18
【问题描述】:

我正在使用 Curl 从网站中读出文本。所有原始数据都使用

逐个字符地返回
return memEof(mp) ? EOF : (int)(*(unsigned char *)(mp->readptr++));

我的问题是,ÄÖÜäöüß 等所有特殊字符都是错误的,而且看起来很神秘。我目前正在通过使用此表调整它们的值来手动更正它们:

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

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

【问题讨论】:

  • 这是一个字符编码问题。网站使用什么编码以及您在内部使用什么编码? (UTF-8?ISO 8559-1 / Latin-1?Windows 1252?)
  • 您使用的表格有误。它的标题是“ASCII”,但它不是:ASCII 最多只能达到 127。看起来更像是 Windows-1252,ASCII 的超集。

标签: c ascii character diacritics


【解决方案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,则会得到不同的结果;如果它是单字节编码,您将获得相同的输出(换行符分开),但就我所写的内容而言,它是“错误的”,即èòà。

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多