2016-04-30 39 views
2

我想真正瞭解Unicode標準,並通過xml spec在那裏讀了戳:理解的Unicode:代孕塊,Noncharacters

字符:: =#X9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]/*任何Unicode字符,不包括代理塊,FFFE和FFFF。 */

現在我有幾個問題:

  • 什麼替代塊?他們是表示4字節代碼點的UTF-16代碼嗎?
  • #xXXXX是指代碼點還是代表UTF-16編碼值?
  • 如果它提到了代碼點,並且我對代理塊的理解是正確的:爲什麼在此提到代理塊?是不是編碼的任務是從編碼映射的空間中隱藏那些與編碼相關的細節?
  • 爲什麼非字符如「U + FFFE」被定義爲unicode標準的一部分?就我的理解而言,字節順序檢測(以及處理靈活大小的代碼字)取決於編碼。

感謝您的澄清!

+0

你在問關於Unicode標準還是W3C的XML規範? –

+0

關於XML規範上下文中的Unicode標準;) 第二個問題涉及XML規範中使用的表示法,但是我想在這裏理解Unicode的作用。 到目前爲止,我認爲Unicode描述了所有已知符號的集合(並給它們一個數字),並且像UTF-8這樣的編碼描述了從Unicode字符流到字節流的映射(反之亦然)。但後來我讀了這個讓我困惑的XML規範。 – Henning

+0

http://stackoverflow.com/q/5903008/995714 –

回答

2

什麼是代理塊?

Unicode代碼點在U+D800U+DFFF範圍內,包括,其被保留用於爲UTF-16的替代物獨佔使用,並且在任何其它情況下非法的。

它們是指示4字節代碼點的UTF-16代碼嗎?

是的。

是否#xXXXX在此處引用代碼點或UTF-16編碼值?

實際的Unicode碼點。考慮到Char的定義包含值> #xFFFF,其中單個編碼的UTF-16值不能超過。 UTF是代碼點值的字節編碼方案。 XML規範是根據代碼點編寫的,而不是編碼。爲了存儲和傳輸,XML文檔可以用XML prolog的「encoding」屬性中指定的任何字符集進行編碼,但實際的XML內容是按未編碼的代碼點處理的。

如果它涉及到代碼點,並且我對代理塊的理解是正確的:爲什麼在此提到代理塊?

替代碼點是保留的,不允許在任何文本內容中出現未編碼。 Char定義只是執行該規則。

爲什麼非字符如「U + FFFE」被定義爲unicode標準的一部分?就我的理解而言,字節順序檢測(以及處理靈活大小的代碼字)取決於編碼。

因爲編碼並不總是提前知道,而且可能必須動態檢測。 U+FFFE被用作BOM標記來幫助實現這一點。 Unicode的早期版本允許U+FFFE作爲使用BOM或文本內容中的實際不間斷空格字符。這有時導致歧義。所以新版本的Unicode保留U+FFFE嚴格限於BOM,並且非破壞間距由U+2060 WORD JOINER來處理,以避免任何含糊之處。

話雖這麼說,在XML的情況下,它沒有意義的任何文本內容使用U+FFFE。整個文檔使用特定的字符集進行編碼,所使用的任何BOM都必須出現在XML prolog之前。 XML規範定義了XML文檔本身之外的BOM處理和字符集檢測。所以這就是爲什麼Char定義不包括U+FFFE

U+FFFF被保留,並且不打算永遠在實踐中真正的內容使用。所以這就是爲什麼Char定義排除它。

所以基本上Char定義允許所有Unicode代碼點減去限制碼點。

+0

感謝您指出這些非字符被定義爲簡化編碼處理! – Henning