#目的
shift_jisの文字列をNode.jsを使って、utf-8に変換する。
需要があるのかわからないが、良い記事がなかったので、参考になれば。
#shift_jisの変換ついて
##例:山田(%8ER%93c)
###それぞれの文字コードを確認して、どうなればよいのか見当
山 -> 8E52 -> 1000 1110 0101 0010
田 -> 9363 -> 1001 0011 0110 0011
shift_jisを扱う際には1byte単位の数値になるので、[142,82,147,99]になるはず。
##ソースコード
var iconv=require('iconv-lite');
var encode=require('encoding-japanese')
const query="%8ER%93c";//変換したい文字列
converted=conv(query);
// [ 142, 82, 147, 99 ]
console.log(iconv.decode(converted,'sjis'))
// 山田
function conv(parseStr){
let convertedArray=[];
// %を切り出す。
// parseStr.split('%')
// [ '', '8ER', '93c' ]
// 最初の要素が空なので、splice(1)でそれ以降を取得する。
let shiftJisWords=parseStr.split('%').slice(1);
// 配列ごとに処理を行う。
shiftJisWords.forEach(element => {
// 1バイト目[0~1]を16進変換
byte1=parseInt(element.substring(0,1)+element.substring(1,2),16)
// 2バイト目[2]はshift_jisでエンコードする。
// 配列になるので、[0]を指定する。
byte2=iconv.encode(element[2],'sjis')[0];
// shift_jisなのか判定する。
if(encode.detect(Buffer.from([byte1,byte2]))==='SJIS'){
convertedArray.push(byte1);
convertedArray.push(byte2);
}else{
// shift_jisではないパターン
console.log("error")
}
});
return convertedArray;
// [ 142, 82, 147, 99 ]をリターンする。
}
###補足メモ
###iconv-liteパッケージ
var iconv=require('iconv-lite');
str=iconv.encode('山田','sjis');
console.log(str)
// <Buffer 8e 52 93 63>
[8e 52 93 63]は、山田のshift_jisの文字コードであるため、正常にエンコードできている。
###8ERの「R」の扱いかた。
console.log(iconv.encode('R','sjis'));
// <Buffer 52>
こうすればRをエンコードすることができる。
buff52=iconv.decode(Buffer.from([0x52]),'utf-8');
console.log(buff52)
// R (配列を与えても問題なし。)
var iconv=require('iconv-lite');
str=iconv.decode(Buffer.from([0x8E,0x52]),'sjis');
console.log(str)
// 山
###Buffer.from([0x...])で指定するのは面倒なので、配列で渡すのがよいため、変換方法のメモ
console.log(parseInt('8E',16))
// 142
parseInst
str=iconv.decode([142,82],'sjis');
// 山
###判定に使える
var encode=require('encoding-japanese')
console.log(encode.detect(Buffer.from([142,82])))
// SJIS
#####より良い方法があれば教えて下さい。