0

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

我正在使用 gcc。

谢谢!

4

5 回答 5

4

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

这取决于您的两个字符数组的确切编码,是否可以获得单个字符的代码点,如果可以,它将采用哪种格式。

于 2010-03-05T12:43:29.773 回答
2

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

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

于 2010-03-05T12:54:59.770 回答
1

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

于 2010-03-05T12:59:55.590 回答
1

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

如果您的 char 数组是拉丁 1 编码的,那么它的长度为 2 个字节(加上可能是 NUL 终止符,我们不在乎),这 2 个字节是:

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

请注意,Latin 1 不是 ASCII,0xE4 不是 ASCII 值,它是 Latin 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 上这是mbstowcsor iconv,尽管对于单个字符,mbtowc只要为当前语言环境定义的多字节编码实际上是 UTF-8,您就可以使用:

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

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

于 2010-03-05T12:58:06.027 回答
0

您想要的称为音译-将一种语言的字母转换为另一种语言。它与 unicode 和 wchars 无关。你需要有一个映射表。

于 2010-03-05T12:45:04.613 回答