簡體   English   中英

為什么在C ++ std :: string中將Unicode字符視為相同?

[英]Why are unicode characters treated the same in C++ std::string?

這是一個Ideone: http ://ideone.com/vjByty。

#include <iostream>
using namespace std;
#include <string>

int main() {
    string s = "\u0001\u0001";
    cout << s.length() << endl;
    if (s[0] == s[1]) {
        cout << "equal\n";
    }
    return 0;
}

我在很多層面上都很困惑。

當我在C ++程序中輸入轉義的Unicode字符串文字時,這是什么意思?

2個字符不占用4個字節嗎? (假設utf-16)

為什么s的前兩個字符(前兩個字節)相等?

因此,C ++ 11標准草案對窄字符串文字中的通用字符作了以下說明( 我的重點是向前發展 ):

非原始字符串文字中的轉義序列和通用字符名稱與字符文字中的含義相同(2.14.3),只是在窄字符串文字中的單引號可以映射通用字符名稱。由於多字節編碼,導致不止一個char元素

並包括以下注意事項:

窄字符串文字的大小是轉義序列和其他字符的總數, 再加上每個通用字符名的多字節編碼至少一個 ,再加上一個終止符'\\ 0'。

上文提到的第2.14.3節說:

通用字符名將轉換為適當的執行字符集中所命名字符的編碼。 如果沒有這樣的編碼,則將通用字符名稱轉換為實現定義的編碼。

如果我嘗試這個示例( 現場觀看 ):

string s = "\u0F01\u0001";

第一個通用字符確實映射到多個字符。

當我在C ++程序中輸入轉義的Unicode字符串文字時,這是什么意思?

引用標准:

通用字符名將轉換為適當的執行字符集中所命名字符的編碼。 如果沒有這樣的編碼,則將通用字符名稱轉換為實現定義的編碼。

通常,執行字符集將為ASCII,其中包含值為1的字符。因此, \將被轉換為值為1的單個字符。

如果要指定非ASCII字符(例如\☺ ,則每個字符可能會看到多個字節。

2個字符不占用4個字節嗎? (假設utf-16)

如果是UTF-16,是的。 但是string不能用UTF-16編碼,除非char具有16位(通常不是)。 UTF-8是一種更可能的編碼,其中值最大為127(即整個ASCII集)的字符用單個字節編碼。

為什么s的前兩個字符(前兩個字節)相等?

基於以上假設,它們都是具有值1的字符。

暫無
暫無

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

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