2016-05-03 48 views
3

我在閱讀ECMAScript Specification 5th edition,但有一點我認爲它不是很清楚。ECMAScript 5.1中的源代碼字符

在第6節 - 源文本規範聲明源字符如下:

SourceCharacter:: 
    any Unicode code unit 

和它說後:

整個文檔中,短語「代碼單元」的其餘部分而「字符」這個詞將用來表示一個16位無符號值,用來表示一個16位單位的文本。短語「Unicode字符」將用於指代由單個Unicode標量值(其可能超過16位並且因此可以由多於一個代碼單元表示)所表示的抽象語言或印刷單元。

我認爲,這句話是有點曖昧,因爲有人(如我最初)可以認爲,只允許字符是Unicode的表0-65535之間。

那麼,句子是否含糊或只能使用0-65536之間的字符呢?

+0

好問題。正如您所知,原始的JavaScript Unicode支持基本上已被破壞,因爲它基於UTF-16是固定大小編碼的錯誤假設。我聽說有一些改進,但所有事情都需要向後兼容。 –

回答

2

這是故意的,他們告訴你,任何代碼單元都是允許的,然後說明源代碼字符的定義通常表示代碼單元而不是字符。

請注意,在UTF16中代碼單元不同於代碼

一切都是16位代碼單元,但代碼可以由幾個代碼單元組成。

例如,「」是一個單UTF16代碼卻是兩個代碼單元

"".charCodeAt(0) // 55357 
"".charCodeAt(1) // 56589 
+0

我認爲問題在於他們將單詞「unicode」與「代碼單元」混合在一起。 Unicode將字符映射到數字,用多少字節表示這些數字取決於編碼。 – zer0uno

+0

@歡迎詞沒有混合,也沒有任何含糊。該上下文中的Unicode顯式爲UTF16。請注意,文字外的_identifiers_必須是兩個字節的代碼點(也是一個單一的代碼單元) - 但這不是您真正要求的。 –

+0

因此,如果UTF-16可以使用代碼單元表示每個unicode字符,那麼說「任何unicode代碼點」和「任何unicode代碼單元」之間有什麼區別? – zer0uno