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

C++ c++;:获取宽字符的ascii值,c++,c,ascii,multibyte,C++,C,Ascii,Multibyte,假设我有一个像“a”这样的字符数组。 有没有办法获取第一个字符的ascii值(例如228),这是一个多字节? 即使我将数组强制转换为wchar_t*数组,也无法获得ascii值“ä”,因为它有2个字节长。 有没有办法做到这一点,我现在尝试了两天:( 我正在使用gcc 谢谢!你自相矛盾。像ä这样的国际字符(根据定义)不在ASCII字符集中,因此它们没有“ASCII值” 这取决于两个字符数组的精确编码,是否可以获得单个字符的代码点,如果可以,它将采用哪种格式。您需要的是音译-将一种语言的字母转换为另

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

我正在使用gcc


谢谢!

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


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

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

e非常混乱。ASCII只有小于128的值。值228对应于8位字符集ISO-8859-1、CP1252和其他一些字符集中的ä。它也是Unicode系统中ä的UCS值。如果使用字符串文字“ä”得到一个由两个字符组成的字符串,该字符串实际上是用UTF-8编码的,您可能希望解析UTF-8编码以获取Unicode UCS值


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

取决于字符数组中使用的编码

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

  • 0xE4(小写字母a umlaut)
  • 0x61(小写a)
请注意,拉丁语1不是ASCII,0xE4不是ASCII值,而是拉丁语1(或Unicode)值

您将得到如下值:

int i = (unsigned char) my_array[0];
如果您的字符数组是UTF-8编码的,那么它有三个字节长,这些字节是:

  • 二进制11000011(UTF-8编码0xE4的第一个字节)
  • 二进制10100100(UTF-8编码0xE4的第二个字节)
  • 0x61(小写a)
要恢复使用UTF-8编码的字符的Unicode值,您需要根据自己的实现(通常在生产代码中是个坏主意),否则您需要使用平台特定的unicode到wchar_____________________________________________________________

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

如果是SHIVET-JIS,那么这就不起作用了…

< P>有一个标准的C++模板函数来进行转换,它是其中的一部分。如果可能的话,它会将宽字符转换成当前字符的等价字符值。获取一个默认字符,如果没有映射,它将返回该字符。

ascii范围内字符的unicode代码与ascii编码中的相同。因此,在wchar的情况下,您可以获取最低有效字节并使用ascii代码。我在回答中解释说,实际上作者的意思不是这样的