[英]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个字节是:
请注意,拉丁1不是ASCII,而0xE4不是ASCII值,而是拉丁1(或Unicode)值。
您将获得像这样的值:
int i = (unsigned char) my_array[0];
如果您的char数组是UTF-8编码的,则它的长度为3个字节,这些字节为:
要恢复使用UTF-8编码的字符的Unicode值,您要么需要根据http://en.wikipedia.org/wiki/UTF-8#Description自己实现它(通常在生产代码中是个坏主意),否则,您需要使用特定于平台的unicode到wchar_t转换例程。 在linux上,这是mbstowcs
或iconv
,尽管对于单个字符,您可以使用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.