

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

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

■該当箇所のみ抜粋

[code]

    // 画面の設定値取得(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)
    
[/code]


CC BY-SA 4.0
2020-07-21T14:53:51.530
68796
2022-03-16T07:06:10.587
2020-07-22T05:28:34.053
3060
41198
question
javascript
javascriptによるSJIS変換およびBASE64変換


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

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

[code]

        btoa(unescape(encodeURIComponent(itemName)))
    
[/code]

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

おそらく、

[code]

        btoa(itemName)
    
[/code]

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


CC BY-SA 4.0
2020-07-22T05:25:34.387
68814
2020-07-22T10:03:03.153
2020-07-22T10:03:03.153
3475
3475
68796
answer