第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

文本解碼器.prototype.ignoreBOM 未按預(yù)期工作

文本解碼器.prototype.ignoreBOM 未按預(yù)期工作

手掌心 2022-09-29 17:26:44
我正在使用獲取API來提取csv數(shù)據(jù)并嘗試創(chuàng)建一個(gè)csv文件。但是,我看到前兩個(gè)字符是BOM字符。?t然而,我在解碼期間設(shè)置,但它不起作用,我總是在CSV的開頭看到ignoreBOM: true?t下面是我的代碼    const fetchData = await newPage.evaluate(async () => {      let url = $('.csvLink').attr('href');      console.log(`in here is the ${url}`);      const stream = await fetch(url);      let reader = stream.body.getReader();      let receivedLength = 0;      while(true) {        const {done, value} = await reader.read();        if (done) {          break;        }        receivedLength += value.length;        let v = new TextDecoder("ISO-8859-1", {fatal: false, ignoreBOM: false}).decode(value, {stream: true});        await window.writeToStream(v, false);      }任何幫助解決這個(gè)問題都會很棒。謝謝。
查看完整描述

1 回答

?
月關(guān)寶盒

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;

    }

  }

}


查看完整回答
反對 回復(fù) 2022-09-29
  • 1 回答
  • 0 關(guān)注
  • 129 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號