我的函数是将字符串转换为十六进制:
function encode(str){
str = encodeURIComponent(str).split('%').join('');
return str.toLowerCase();
}
示例:
守护村子
alert(encode('守护村子'));
e5ae88e68aa4e69d91e5ad90
适用于汉字。但是当我用英文字母做的时候
alert(encode('Hello World'))
;
输出:
hello20world
我试过将字符串转换为十六进制:
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但没有运气。 有人可以帮帮我吗?谢谢!
答案 0 :(得分:8)
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"
答案 1 :(得分:4)
作为功能齐全的独立解决方案,您可以使用以下代码进行编码:
plain.split("")
.map(c => c.charCodeAt(0).toString(16).padStart(2, "0"))
.join("");
空字符串上的split
产生一个数组,每个元素中包含一个字符(或者一个UTF-16代码点)。然后我们可以将每个映射到字符代码的十六进制字符串。
然后解码:
hex.split(/(\w\w)/g)
.filter(p => !!p)
.map(c => String.fromCharCode(parseInt(c, 16)))
.join("")
这一次传递给split
的正则表达式捕获了两个字符的组,但是这种形式的split
将用空字符串散布它们(捕获的组之间的东西)! 。因此filter
用于删除空字符串。然后map
解码每个字符。
答案 2 :(得分:1)
我已通过下载utf8.js
https://github.com/mathiasbynens/utf8.js
然后使用上面的String2Hex
函数:
alert(String2Hex(utf8.encode('守护村子')))
;
给了我想要的输出:
e5ae88e68aa4e69d91e5ad90
答案 3 :(得分:0)
这应该有效
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);
}
答案 4 :(得分:0)
如果您想正确处理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('%'));
}