文字列を16進数に変換する関数があります。
_function encode(str){
str = encodeURIComponent(str).split('%').join('');
return str.toLowerCase();
}
_
例:
_守护村子
_
alert(encode('守护村子'));
出力は次のようになります。
_e5ae88e68aa4e69d91e5ad90
_
漢字に対応しています。でも英語の文字でやると
alert(encode('Hello World'))
;
それは出力します:
_hello20world
_
文字列を16進数に変換するためにこれを試しました:
_function String2Hex(tmp) {
var str = '';
for(var i = 0; i < tmp.length; i++) {
str += tmp[i].charCodeAt(0).toString(16);
}
return str;
}
_
次に、上記の中国語の文字で試してみましたが、UTF-8 HEXが出力されました。
_5b8862a467515b50
_
aNSI Hexではありません:
_e5ae88e68aa4e69d91e5ad90
_
UFT8をANSIに変換する方法も検索しましたが、うまくいきませんでした。誰でも手伝ってくれる?ありがとう!
_utf8.js
_をダウンロードして解決しました
https://github.com/mathiasbynens/utf8.js
次に、上記の_String2Hex
_関数を使用します。
alert(String2Hex(utf8.encode('守护村子')))
;
私が望む出力を私に与えます:
_e5ae88e68aa4e69d91e5ad90
_
const myString = "This is my string to be encoded/decoded";
const encoded = new Buffer(myString).toString('hex'); // encoded === 54686973206973206d7920737472696e6720746f20626520656e636f6465642f6465636f646564
const decoded = new Buffer(encoded, 'hex').toString(); // decoded === "This is my string to be encoded/decoded"
これはうまくいくはずです
var str="some random string";
var result = "";
for (i=0; i<str.length; i++) {
hex = str.charCodeAt(i).toString(16);
result += ("000"+hex).slice(-4);
}
UTF8文字列を適切に処理したい場合は、以下を試すことができます。
function utf8ToHex(str) {
return Array.from(str).map(c =>
c.charCodeAt(0) < 128 ? c.charCodeAt(0).toString(16) :
encodeURIComponent(c).replace(/\%/g,'').toLowerCase()
).join('');
},
function hexToUtf8: function(hex) {
return decodeURIComponent('%' + hex.match(/.{1,2}/g).join('%'));
}
関数型の自己完結型ソリューションとして、次のものでエンコードできます。
plain.split("")
.map(c => c.charCodeAt(0).toString(16))
.join("");
空の文字列のsplit
は、各要素に1つの文字(または、むしろ1つのUTF-16コードポイント)を持つ配列を生成します。次に、それぞれを文字コードのHEX文字列にマップできます。
次にデコードします:
hex.split(/(\w\w)/g)
.filter(p => !!p)
.map(c => String.fromCharCode(parseInt(c, 16)))
.join("")
今回はsplit
に渡された正規表現が2文字のグループをキャプチャしますが、この形式のsplit
は、空の文字列(キャプチャされたグループの「間」のもの)を散在させます。したがって、filter
は空の文字列を削除するために使用されます。次に、map
は各文字をデコードします。