簡體   English   中英

為什么字符數組(char 類型)與 unicode 字符(c++)一起使用?

[英]Why is array of characters(char type) working with unicode characters (c++)?

當我寫這段代碼時:

using namespace std;

int main(){
    char x[] = "γεια σας";
    cout << x;
    return 0;
}

我注意到編譯器給了我輸出,我排除了γεια σας雖然數組的類型是char ,也就是說,它應該只接受 ASCII 字符。

那么為什么編譯器沒有給出錯誤呢?

雖然數組的類型是char,也就是說,它應該只接受ASCII字符。

你猜錯了。

Unicode 有幾種轉換格式。 一種流行的此類格式是 UTF-8。 正如名稱所暗示的那樣,UTF-8 的代碼單元是 8 位寬。 總是可以使用char來表示 UTF-8 的代碼單元,因為char保證至少有 8 位寬。

您以 99.99% 的可能性得到的是以 UTF-8 格式存儲的 Unicode 代碼點。 每個代碼點都變成一到四個字符。

ASCII 范圍內的 Unicode 被轉換為 0x00 到 0x7f 的一個 ASCII 字節。 有 2048 個碼位轉換為兩個字節,二進制模式為 110x xxxx 10yy yyyy,65536 個碼位轉換為三個碼位 1110 xxxx 10yy yyyy 10zz zzzz,剩下的變成四個字符 1111 0xxx 10yyy 10zzuzzuyy

大多數 C 和 C++ 字符串函數與 UTF-8 一起工作得很好。 一個例外是 strncpy 或 strncat,它們可能會創建不完整的代碼點。 舊的面試問題“反轉字符中的字符串”變得更加復雜,因為反轉代碼點內的字節會產生廢話。

下面是一些代碼,顯示了 C++ 的真正作用:

#include <iostream>
#include <iomanip>

using namespace std;

int main(){
    char x[] = "γεια σας";
    cout << x << endl;
    
    auto len = strlen(x);
    cout << "Length (in bytes): " << len << endl;
    for (int i = 0; i < len; i++)
        cout << "0x" << setw(2) << hex << static_cast<int>(static_cast<unsigned char>(x[i])) << ' ';
    cout << endl;
    return 0;
}

輸出是:

γεια σας
Length (in bytes): 15
0xce 0xb3 0xce 0xb5 0xce 0xb9 0xce 0xb1 0x20 0xcf 0x83 0xce 0xb1 0xcf 0x82 

因此該字符串占用 15 個字節並編碼為UTF-8 UTF-8 是一種 Unicode 編碼,每個字符使用 1 到 4 個字節(就您可以使用文本光標選擇的最小單位而言)。 UTF-8 可以保存在一個char數組中。 盡管它被稱為char ,但它基本上對應於一個字節,而不是我們通常認為的字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM