1 回答

TA貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超5個(gè)贊
ignoreBOM
僅適用于 UTF-8 UTF-16BE 和 UTF-16LE 編碼。
如果您在文件的開頭有一個(gè) BOM,那么它可能沒有被編碼為 CP-1252,而是編碼為 UTF,如果該 BOM 在 CP-1252 中讀取,那么它甚至可能是 UTF-16LE:?t
const littleEnd_BOM = new Uint8Array( [ 0xFF, 0xFE ] );
const as_CP1252 = new TextDecoder( 'iso-8859-1' ).decode( littleEnd_BOM );
console.log( as_CP1252 );
因此,代碼中的第一個(gè)錯(cuò)誤是您不想將文本解碼器初始化為CP-1252,而是初始化為UTF-16LE。
現(xiàn)在,對于您確實(shí)設(shè)置了哪個(gè)值存在一些混淆,在您編寫的某一點(diǎn)上將其設(shè)置為 ,而在代碼段中將其設(shè)置為(默認(rèn)值)。ignoreBOMtruefalse
如果希望 BOM 表保留在輸出中,請將其設(shè)置為 。解析器將忽略該 BOM 標(biāo)記,這意味著它將將其視為正常字符序列。true
另一方面,如果您希望將其從輸出中刪除,則將其保留為 ,解析器將對其進(jìn)行特殊處理,并將其從輸出中刪除。false
請注意,即使 BOM 位于此處,它也可能不是從 DOM 字符串打印的:
const UTF16LE_text = new Uint16Array(
[ ..."\ufeffhello" ].map( (char) => char.charCodeAt(0) )
);
// to check we really wrote a LE-BOM "FFFE"
const BOM = [ ...new Uint8Array( UTF16LE_text.buffer ).slice( 0, 2 ) ]
.map( (v) => v.toString( 16 ) ).join('');
console.log( 'BOM:', BOM );
const ignoring_decoder = new TextDecoder( 'UTF-16LE', { ignoreBOM: true } );
const ignored = ignoring_decoder.decode( UTF16LE_text );
console.log( 'ignoreBOM:true - text:', ignored );
console.log( 'ignoreBOM:true - char at 0:', ignored.charCodeAt( 0 ) );
const removing_decoder = new TextDecoder( 'UTF-16LE' );
const removed = removing_decoder.decode( UTF16LE_text );
console.log( 'ignoreBOM:false - text:', removed );
console.log( 'ignoreBOM:false - char at 0:', removed.charCodeAt( 0 ) );
但是,您可能面臨的另一個(gè)問題是,您正在讀取提取的文本塊,即隨機(jī)大小的數(shù)據(jù)塊。
文本不能以這種方式處理,您需要從明確定義的字節(jié)位置解析它才能正確解析它。
幸運(yùn)的是,該方法有一個(gè)選項(xiàng)。使用它,解碼器應(yīng)該能夠正確讀取流,但要使此選項(xiàng)起作用,您需要將TextDecoder存儲在 while 循環(huán)之外,以便它可以將以前的緩沖區(qū)保留在內(nèi)存中。streamTextDecoder.decode()
const fetchData = await newPage.evaluate(async () => {
let url = $('.csvLink').attr('href');
const stream = await fetch(url);
let reader = stream.body.getReader();
let receivedLength = 0;
// declare the decoder outside of the loop
const decoder = new TextDecoder("UTF-16LE");
while(true) {
const {done, value} = await reader.read();
receivedLength += value.length;
// always use the same decoder
const v = decoder.decode(value, {stream: true});
await window.writeToStream(v, false);
if (done) {
break;
}
}
}
添加回答
舉報(bào)