Jsはbase64エンコードとデコードを行います(中国語の文字化けを解決します)

一般的なアプローチ: エンコーディング

// base64转字符串
 getEncode64(str){
     // 对字符串进行编码
     var encode = encodeURI(str);
     // 对编码的字符串转化base64
     var base64 = btoa(encode);
     return base64;
   },

デコード:

// base64转字符串
   getDecode(str){
      // 对base64转编码
      var decode = atob(base64);
      // 编码转字符串
      var str = decodeURI(decode);
      return str;
  },

説明書:

let url = 'http://百度.com'
//转base64编码
let base64Url = this.getEncode64(url);

//解码  后台返回JSON格式所以加了JSON.parse进行json解码,正常对象格式就不用加
let data =JSON.parse(this.getDecode(resp.data));
console.log(data);

質問:

上記のエンコードとデコードを利用することで、お客様自身のフロントエンド操作で中国語のコンパイルとデコードを行うことは問題ありませんが、バックグラウンドが必要なため、エンコード後はバックグラウンドに送信されます。エンコード形式を変更してデコードすると、中国語の文字化けが表示されます。

理由:

調べてみると、従来のエンコード方式ではインターフェース上でUTF-8に変換しているものの、実際に送信・保存する際にはフォーマットがUTF-16のままで、バックグラウンドでUTF-8フォーマットを返しているためではないかと考えられます。実際に変換します 形式はutf-16で、utf-8に変換すると中国語の文字化けが発生します。つまり、上記の符号化・復号化は、ページそのものの符号化・復号化には適しており、送信には適していない。

中国語の文字化けのデコードを解決します。

//字符串转base64
getEncode64(str){   
      return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g,
          function toSolidBytes(match, p1) {
              return String.fromCharCode('0x' + p1);
         }));
            
  },
getDecode(str){
    return decodeURIComponent(atob(str).split('').map(function (c) {
          return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
      }).join(''));
  },

これら 2 つのエンコードとデコードを使用するのが通常であり、encodeURIComponent は utf-8 に変換されます。

おすすめ

転載: blog.csdn.net/weixin_44220845/article/details/119035498