[英]Why does Buffer.from('\x80', 'utf8') return <Buffer c2 80>
為什么會發生這種情況
> Buffer.from('\x79', 'utf8')
<Buffer 79>
> Buffer.from('\x80', 'utf8')
<Buffer c2 80>
以及如何讓Buffer
表現出我的預期並返回<Buffer 80>
?
發生這種情況是因為二進制的0x80
或1000 0000
或十進制的 128 在 UTF-8 中不是有效的代碼點,因為它在 ASCII 之外(這是 7 位,因此所有 ASCII 代碼點的第一位都設置為0
)。 要將字符串轉換為Buffer
而不將它們解釋為 UTF-8,您可以改用'ascii'
編碼:
> Buffer.from('\x79', 'ascii')
<Buffer 79>
> Buffer.from('\x80', 'ascii')
<Buffer 80>
> Buffer.from('💻', 'ascii')
<Buffer 3d bb>
> Buffer.from('💻', 'utf8')
<Buffer f0 9f 92 bb>
即使@Boris的回答確實解釋了這種行為,我只想指出:
從文檔中:
'ascii'
編碼被認為是傳統的字符編碼作為另一種解決方案,使用latin1
編碼,應該會給出預期的結果:
'latin1':Latin-1 代表ISO-8859-1 。
此字符編碼僅支持從 U+0000 到 U+00FF 的 Unicode 字符。 每個字符都使用單個字節進行編碼。 不適合該范圍的字符將被截斷,並將映射到該范圍內的字符。
const a = Buffer.from('\x80', 'utf8');
const b = Buffer.from('\x80', 'latin1')
console.log(a, b);
// <Buffer c2 80> <Buffer 80>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.