簡體   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