一般的なアプローチ: エンコーディング
// 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 に変換されます。