2014-04-01 28 views
6

我一直在挖掘規範一段時間,並找不到任何決定性的條款來支持是/否。必須char16_t字符串使用UTF-16編碼嗎?

執行以下語句:

char16_t *s = u"asdf"; 

意味着/強制執行字符串 「ASDF」 必須以UTF-16編碼?

從我可以推論,這是一個是的。

然而,這一提議n2018它只是說,當「__STDC_UTF_16__」被定義char16_t文字是UTF-16編碼,使葉片打開門,當「__STDC_UTF_16__」是不確定的,char16_t文字可無論如何編碼的編譯器想。

畢竟,該標準只保證char16_t的大小,符號和底層表示,它沒有提到編譯器必須如何編碼文字或字符串文字。

在規範,它說

一個char16_t字符串文字的大小是轉義 序列,萬向字符名稱和其它字符的總數目,加上一個 用於需要每個字符代理對,加上一個用於終止u'\ 0'的 。 [注意:char16_t字符串文字的大小是 代碼單元的數量,而不是字符數。末端注]

這似乎意味着它隱含地假設char16_t字符串文字是UTF-16編碼,因爲「代理對」是一個概念UTF16。

讓我知道是否有任何模糊的問題。

回答

5

該標準是與底層編碼技術上漠不關心,並且指定僅單個char16_t的值必須對應於UCS碼點在範圍0〜0xFFFF的

§2.14.3

2以字母u開頭的字符文字,如u'y',是字符文字char16_t的 。包含一個c-char的char16_t文字 的值等於其ISO 10646代碼點值 ,條件是代碼點可用單個16位 代碼單元表示。在另一方面

字符串可以包括代理對

§2.14.5

10字符串文字開頭,其中u,如U 「ASDF」,是一種char16_t 串文字。char16_t字符串常量的類型爲「array of n const char16_t」,其中n是下面定義的字符串的大小;它有 靜態存儲持續時間,並使用給定的字符進行初始化。 單個c-char可能在代理對的 形式中產生多個char16_t字符。

只有UTF-16符合這兩項要求,儘管該標準爲將來的兼容編碼留下了空間,但不太可能。

6

__STDC_UTF_16__位沒有把它變成標準文本。這在提案中可能是因爲它來自C語言的類似提案。 C++標準簡單地刪除了任何和所有這些廢話,並使其成爲UTF-16或GTFO。

+5

是否有關於_GTFO_規範的權威來源?或者那是非規範性的? – sehe

+3

§1.1/ 1 [intro.scope]:「本國際標準規定了C++編程語言實現的要求 第一個這樣的要求是它們實現了語言,所以這個國際標準也定義了C++。第一項要求出現在本國際標準的各個地方。「 –

+0

謝謝,這有幫助 – sehe

相關問題