TransWikia.com

javascriptによるSJIS変換およびBASE64変換

スタック・オーバーフロー Asked on November 7, 2021

画面上から取得した値(UTF-16)をSJISに変換し、ハッシュコード変換して使用。
BASE64変換を行い、再度使用(外部システムにPOST)
最終的に外部システム側で受け取った値が???になってしまいます。
SJIS変換箇所やBASE64の変換箇所でおかしいところがあればご指摘を頂きたく。

配列で変換を行う等のトライ&エラーを行ってみたのですが、どうしても正常に変換ができない状態です。
SJIS変換にはGitHubで公開されている encoding.js 、ハッシュ値生成にcrypt.jsを使用しています。

■該当箇所のみ抜粋

// 画面の設定値取得(hoge1,2は英数字、itemNameのみ全半角混合)
let hoge1 = 'hoge1';
let hoge2 = 'hoge2';
let itemName = '商品名称(にほんごめい)'

// SJIS変換(encoding.jsを外部jsとして使用)
hoge1 = Encoding.convert(hoge1 , 'SJIS');
hoge2 = Encoding.convert(hoge2 , 'SJIS');
itemName = Encoding.convert(itemName, 'SJIS');

// SJIS変換後の全項目を連結
let result = hoge1 + hoge2 + itemName; 

// 連結後の値をハッシュ値に変換(crypto-jsを外部jsとして使用)
let spsHashcode = new CryptoJS.SHA1(result)

// 外部システムにxml形式でpostする必要があるため、作成
// 全角含む項目はBASE64変換を行い、送付する必要あり
let postData='';
postData = '<?xml version="1.0" encoding="Shift_JIS"?>';
postData += '<request id="XXXXX">';
postData+='<hoge1 >'+hoge1 +'</hoge1 >';
postData+='<hoge2 >'+hoge2 +'</hoge2 >';
postData+='<item_name>' + btoa(unescape(encodeURIComponent(itemName))) + '</item_name>'; 
postData += '<sps_hashcode>' + spsHashcode + '</sps_hashcode>';

(外部システムにpostDataをPOST)

One Answer

(問題解決を確認できないので、当て推量の回答となります)

「GitHubのencoding.js」というのが https://github.com/polygonplanet/encoding.js/ これだとすると、itemName = Encoding.convert(itemName, 'SJIS'); の結果、itemName はシフトJISのバイト列を U+0000 〜 U+00FF で表現した文字列になるようです。それを

    btoa(unescape(encodeURIComponent(itemName)))

すると、encodeURIComponent()itemName を無理やりUTF-8に再エンコードしてパーセントエンコーディングします。unescape() はそれを ISO-8859-1 としてパーセントデコードしています。結果、非アスキー文字は壊れます。

おそらく、

    btoa(itemName)

だけで目的の「シフトJISをBase64した文字列」になると思われます。

Answered by int32_t on November 7, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP