簡體   English   中英

C ++ 11:普通字符串文字和UTF-8字符串文字之間的區別示例?

[英]C++11: Example of difference between ordinary string literal and UTF-8 string literal?

不以encoding-prefix開頭的字符串文字是普通的字符串文字,並使用給定的字符進行初始化。

以u8開頭的字符串文字,例如u8“asdf”,是一個UTF-8字符串文字,並使用UTF-8編碼的給定字符進行初始化。

我不明白普通字符串文字和UTF-8字符串文字之間的區別。

有人可以提供一個他們不同的情況的例子嗎? (導致不同的編譯器輸出)

(我的意思是從標准的POV,而不是任何特定的實現)

字符文字或字符串文字中的每個源字符集成員,以及字符文字或非原始字符串文字中的每個轉義序列和通用字符名稱,都將轉換為執行字符集的相應成員。

C和C ++語言在其實現中允許大量的自由度。 在UTF-8是“以單字節編碼文本的方式”之前很久就編寫了C:不同的系統具有不同的文本編碼。

那么C和C ++中字符串的字節值究竟取決於編譯器。 'A'是編譯器為字符A選擇的編碼,可能與UTF-8不一致。

C ++增加了編譯器必須支持真正的UTF-8字符串文字的要求。 u8"A"[0]的位值由C ++標准通過UTF-8標准確定,無論編譯器所針對的平台的首選編碼如何。

現在,就像大多數平台C ++目標使用2的補碼整數一樣,大多數編譯器都具有大多數與UTF-8兼容的字符編碼。 因此,對於像"hello world"這樣的字符串, u8"hello world"幾乎肯定會是相同的。

舉一個具體的例子,來自man gcc

-fexec-字符集的字符集=

設置執行字符集,用於字符串和字符常量。 默認值為UTF-8。 charset可以是系統的iconv庫例程支持的任何編碼。

-finput-字符集的字符集=

設置輸入字符集,用於從輸入文件的字符集轉換為GCC使用的源字符集。 如果區域設置未指定,或GCC無法從區域設置獲取此信息,則默認值為UTF-8。 這可以通過語言環境或此命令行選項覆蓋。 目前,如果存在沖突,命令行選項優先。 charset可以是系統的iconv庫例程支持的任何編碼。

是一個能夠更改C / C ++的執行和輸入字符集的示例。

暫無
暫無

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

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