2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Node.jsにてShift_JISをUTF-8へ変換する

Last updated at Posted at 2021-04-16

#目的
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

#####より良い方法があれば教えて下さい。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?