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
標誌使其引發異常。