2016-11-23 36 views

回答

2

1部分:字節不是負

的TextDecoder接口的基礎ArrayBuffer(一個字節序列)上進行操作,所述Int8Array視圖套。

此:

new TextDecoder('utf-8').decode(new Int8Array([-1, -1])) 

相同:

new TextDecoder('utf-8').decode(new Int8Array([-1, -1]).buffer) 

其是包含字節0xFF時,爲0xFF的ArrayBuffer。所以這是一樣的:

new TextDecoder('utf-8').decode(new Uint8Array([255, 255])) 

2部分:UTF-8解碼

0xFF的不是UTF-8的有效代碼序列,所以解碼爲錯誤。這會導致替換字符(U + FFFD)。由於有兩個0xFF的字節你U + FFFD U + FFFD或:

「」

第3部分:UTF-8編碼

編碼U + FFFD爲UTF-8給你的字節是0xEF 0xBF 0xBD。所以用U + FFFD U + FFFD編碼一個字符串會給你字節0xEF 0xBF 0xBD或十進制:239 191 189 239 191 189

......這正是你得到的結果。

所以這是完全按照指定的工作。

那麼...有什麼問題?

我的猜測是,你假設你可以將任何字節編碼成一個字符串。這不是文本編碼的工作方式。文本編碼定義了從字符串元素到字節序列的映射。

並非所有的編碼都可以表示字符串的所有元素,但UTF-8(和UTF-16)可以表示可以在JavaScript字符串中出現的所有代碼點。

但是反過來是不是是真的。並非所有字節序列都對應於字符。當發現無效的字節序列時會發生錯誤。默認情況下,TextDecoder API會生成替換字符( U + FFFD),但是您可以使用fatal標誌使其引發異常。