簡體   English   中英

為什么 Buffer.from('\x80', 'utf8') 返回<buffer c2 80></buffer>

[英]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>

發生這種情況是因為二進制的0x801000 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM