txtファイル転送コード
2515 ワード
前に書く
この間、面白いバグに出会いました.txtファイルのリソースはブラウザでプレビューを開く時に文字化けします.そして、最後の処理案を皆さんに分かち合いたいです.
問題&&&分析
問題:txtファイルをutf-8の符号化フォーマットにまとめて分析する必要があります.txt常用の符号化フォーマットはANSI、UTF-8、GB 2312を含みます.また、簡体字中国語のシステムでは、ASNIとGB 2312は同じです.だから、私達が処理したいのはGB 2312とUTF-8だけです.
最初の案は面白いです.FileReader.readAspaTextを使います.この属性はファイルコードフォーマットを指定してファイルのテキストを取り出します.ただし、指定された符号化フォーマットとソースファイルの符号化フォーマットが異なると、抽出されたテキストは文字化けになります.だからここの考えは:1⃣️まず「utf-8」でテキストを1回取る2⃣️stringが中国語であるかどうかを検出し、中国語がない場合はすべて文字化けして処理する(gb 2312とutf-8の英文コードと同じ).⃣️前で文字化けが検出されたら、「gb 2312」でもう一度テキストを取ります.今回は検査しなくてもいいです.取り出したのは正常テキストです.⃣️文字化けのないテキストで新しいファイルを生成する
シナリオ2
この案は乱暴で、二つのnodejsを引いて、先端も走ることができます.この案については簡単な試みをしただけですが、拡張性はかなり高く、興味のあるパートナーは試してみてもいいです.
この間、面白いバグに出会いました.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)
}
}
⚠️: , 。 。