txtファイル転送コード


前に書く
この間、面白いバグに出会いました.txtファイルのリソースはブラウザでプレビューを開く時に文字化けします.そして、最後の処理案を皆さんに分かち合いたいです.
問題&&&分析
問題:txtファイルをutf-8の符号化フォーマットにまとめて分析する必要があります.txt常用の符号化フォーマットはANSI、UTF-8、GB 2312を含みます.また、簡体字中国語のシステムでは、ASNIとGB 2312は同じです.だから、私達が処理したいのはGB 2312とUTF-8だけです.
⚠️:windows office 2003   txt           GB2312
プラン1
最初の案は面白いです.FileReader.readAspaTextを使います.この属性はファイルコードフォーマットを指定してファイルのテキストを取り出します.ただし、指定された符号化フォーマットとソースファイルの符号化フォーマットが異なると、抽出されたテキストは文字化けになります.だからここの考えは:1⃣️まず「utf-8」でテキストを1回取る2⃣️stringが中国語であるかどうかを検出し、中国語がない場合はすべて文字化けして処理する(gb 2312とutf-8の英文コードと同じ).⃣️前で文字化けが検出されたら、「gb 2312」でもう一度テキストを取ります.今回は検査しなくてもいいです.取り出したのは正常テキストです.⃣️文字化けのないテキストで新しいファイルを生成する
function txt2utf8(file, callback){
    let newBlob = null
    const reader = new FileReader()
    // readAsText                     
    reader.readAsText(file,'utf-8')
    reader.onload = e => {
        const txtString = e.target.result
        // utf-8             
        const patrn=/[\uFE30-\uFFA0]/gi;
        //             (    ,      )
        //            ,                 
        if (!patrn.exec(txtString)) {
            let reader_gb2312 = new FileReader()
            //        ,              
            reader_gb2312.readAsText(file,'gb2312')
            reader_gb2312.onload = e2 => {
                newBlob = new Blob([e2.target.result])
                callback&&callback(newBlob)
            }
        } else {
            //              ,      ,   blob 
            newBlob = new Blob([txtString])
            callback&&callback(newBlob)
        }
    }
}
⚠️:     “utf-8”   “gb2312”    。  readAsText       , gb2312  utf-8 txt         。
実装フローチャート:
シナリオ2
この案は乱暴で、二つのnodejsを引いて、先端も走ることができます.この案については簡単な試みをしただけですが、拡張性はかなり高く、興味のあるパートナーは試してみてもいいです.
import iconv from 'iconv-lite'
import jschardet from 'jschardet'

function txt2utf8(file, callback){
    const reader = new FileReader()
    reader.readAsBinaryString(file)
    reader.onload = e => {
        const txtBinary = e.target.result
        //   jschardet        ,       
        const binaMg = jschardet.detect(txtBinary)
        const buf = new Buffer(txtBinary, 'binary')
        //   iconv   
        const str = iconv.decode(buf, binaMg.encoding)
        const newBlob = new Blob([str])
        callback&&callback(newBlob)
    }
}
⚠️:          ,          。             。