繁体   English   中英

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

[英]c++: getting ascii value of a wide char

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

我正在使用gcc。

谢谢!

你自相矛盾。 像国际字符(顾名思义)非ASCII字符集,所以他们没有一个“ASCII值”。

它取决于两个字符数组的确切编码,是否可以获取单个字符的代码点,以及是否可以使用哪种格式。

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

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

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

如果您的char数组是Latin 1编码的,则它的长度为2个字节(也许还有NUL终止符,我们不在乎),而这2个字节是:

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

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

您将获得像这样的值:

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

如果您的char数组是UTF-8编码的,则它的长度为3个字节,这些字节为:

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

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

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

如果是SHIFT-JIS,则此方法不起作用...

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM