c ++:获取宽字符的ascii值

时间:2010-03-05 12:40:51

标签: c++ c ascii multibyte

假设我有一个像“äa”这样的字符数组。 有没有办法获得第一个字符的ascii值(例如228),这是一个多字节? 即使我将我的数组转换为wchar_t *数组,我也无法获得“ä”的ascii值,因为它的长度为2个字节。 有没有办法做到这一点,我现在尝试2天:(

我正在使用gcc。

谢谢!

5 个答案:

答案 0 :(得分:4)

你自相矛盾。像ä这样的国际字符(根据定义)不是中的ASCII字符集,因此它们没有“ascii值”。

这取决于你的双字符数组的确切编码,如果你能得到单个字符的代码点,如果是,那么它将采用哪种格式。

答案 1 :(得分:2)

你很困惑。 ASCII仅具有小于128的值。值228对应于8位字符集ISO-8859-1,CP1252和其他一些中的ä。它也是Unicode系统中ä的UCS值。如果您使用字符串文字“ä”并获得两个字符的字符串,则该字符串实际上以UTF-8编码,您可能希望解析UTF-8编码以获取Unicode UCS值。

你真正想要做的就是从一个字符集转换到另一个字符集。如何做到这一点在很大程度上取决于您的操作系统,因此需要更多信息。您还需要指定您想要的内容?可能是ISO-8859-1的std :: string或char *?

答案 2 :(得分:1)

取决于char数组中使用的编码。

如果你的char数组是拉丁文1编码的,那么它长2个字节(加上可能是NUL终结符,我们不关心),那2个字节是:

  • 0xE4(小写一个变音符号)
  • 0x61(小写a)。

请注意,Latin 1不是ASCII,0xE4不是ASCII值,它是拉丁语1(或Unicode)值。

你会得到这样的价值:

int i = (unsigned char) my_array[0];

如果你的char数组是UTF-8编码的,那么它是三个字节长,那些字节是:

  • 二进制11000011(UTF-8的第一个字节编码为0xE4)
  • 二进制10100100(UTF-8的第二个字节编码为0xE4)
  • 0x61(小写a)

要恢复使用UTF-8编码的字符的Unicode值,您需要根据http://en.wikipedia.org/wiki/UTF-8#Description自己实现它(通常是生产代码中的一个坏主意),否则您需要使用平台 - 特定的unicode-to-wchar_t转换例程。在linux上,这是mbstowcsiconv,但对于单个字符,您可以使用mbtowc,前提是为当前语言环境定义的多字节编码实际上是UTF-8:

wchar_t i;
if (mbtowc(&i, my_array, 3) == -1) {
    // handle error
}

如果它是SHIFT-JIS那么这不起作用......

答案 3 :(得分:1)

有一个标准的C ++模板函数可以进行转换,ctype::narrow()。它是localization library的一部分。如果可能的话,它会将宽字符转换为当前本地的等效字符值。正如其他答案所指出的那样,并不总是有一个映射,这就是为什么ctype :: narrow()接受一个默认字符,如果没有映射它将返回它。

答案 4 :(得分:0)

你想要的是音译 - 将一种语言的字母转换成另一种语言。它没有关于unicode和wchars的东西。你需要有一个映射表。