有没有人可以指导我如何在javascript中将char转换为十六进制?
例如:
“入力されたデータは范囲外です。”
到
“\ u5165 \ u529B \ u3055 \ u308C \ u305F \ u30C7 \ u30FC \ u30BF \ u306F \ u7BC4 \ u56F2 \ u5916 \ u3067 \ u3059 \ u3002”
然而我无法理解。
任何建议。
谢谢,Sarbbottam
答案 0 :(得分:28)
您可以遍历字符并使用charCodeAt
函数获取其UTF-16值,然后使用它们构建字符串。
以下是我构建的一些代码,它比您链接的网站上的代码要好得多,而且应该更容易理解:
function string_as_unicode_escape(input) {
function pad_four(input) {
var l = input.length;
if (l == 0) return '0000';
if (l == 1) return '000' + input;
if (l == 2) return '00' + input;
if (l == 3) return '0' + input;
return input;
}
var output = '';
for (var i = 0, l = input.length; i < l; i++)
output += '\\u' + pad_four(input.charCodeAt(i).toString(16));
return output;
}
让我们把它分解。
string_as_unicode_escape
接受一个参数input
,这是一个字符串。pad_four
是一个完成一件事的内部函数;它会使用前导'0'
个字符填充字符串,直到长度至少为四个字符。output
定义为空字符串。\u
附加到output
字符串。获取带有input.charCodeAt(i)
的字符的UTF-16值,然后将其转换为带有.toString(16)
的十六进制字符串,然后使用前导零填充它,然后将结果附加到output
字符串。 output
字符串。正如Tim Down评论的那样,我们还可以将0x10000
添加到charCodeAt
值,然后.slice(1)
添加调用.toString(16)
产生的字符串,以实现填充效果。< / p>
答案 1 :(得分:3)
function string_as_unicode_escape(str){
return str.split("").map(function(s){
return "\\u"+("0000" + s.charCodeAt(0).toString(16)).slice(-4);
}).join("");
}
答案 2 :(得分:0)
var hex = new Array(&#39; 0&#39;,&#39; 1&#39;,&#39; 2&#39;,&#39; 3&#39;,&#39; 4& #39;,&#39; 5&#39;&#39; 6&#39;&#39 7&#39;&#39 8&#39;&#39; 9&#39;,& #39; A&#39;&#39; b&#39;&#39; C&#39;&#39; d&#39;&#39; E&#39;&#39; F&# 39);
function stringEncode()
{
var x=document.getElementById("from_text");
var preescape="" + x.value;
var escaped="";
var i=0;
for(i=0;i<preescape.length;i++)
{
escaped=escaped+encodeChar(preescape.charAt(i));
}
//x=document.getElementById("to_text");
x.value=escaped;
//alert("Codigo: "+escapeHtml(escaped));
//document.getElementById('string_example').innerHTML="<b>String example with text</b><br/><br/>String s=\""+escapeHtml(escaped)+"\";<br/><br/>";
}
function escapeHtml(unsafe) {
return unsafe
.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">")
.replace(/"/g, """)
.replace(/'/g, "'");
}
function encodeChar(original)
{
var found=true;
var thecharchar=original.charAt(0);
var thechar=original.charCodeAt(0);
switch(thecharchar) {
case '\n': return "\\n"; break; //newline
case '\r': return "\\r"; break; //Carriage return
case '\'': return "\\'"; break;
case '"': return "\\\""; break;
case '\\': return "\\\\"; break;
case '\t': return "\\t"; break;
case '\b': return "\\b"; break;
case '\f': return "\\f"; break;
default:
found=false;
break;
}
if(!found)
{
if(thechar>127) {
var c=thechar;
var a4=c%16;
c=Math.floor(c/16);
var a3=c%16;
c=Math.floor(c/16);
var a2=c%16;
c=Math.floor(c/16);
var a1=c%16;
// alert(a1);
return "\\u"+hex[a1]+hex[a2]+hex[a3]+hex[a4]+"";
}
else
{
return original;
}
}
}
// ------------------------ lo llamarias con
答案 3 :(得分:0)
您可以为此使用普通的replace()
。
'! \u0100 力 ?'.replace(
/[^\x00-\xFF]/g,
function(ch) {
return ('\\u0' + ch.charCodeAt(0).toString(16))
.replace(/0(?=....$)/, '');
}
)
产生! \u0100 \u529b \ud83d\ude03
非常简洁,可以处理填充问题,而不会造成麻烦的if
或缓慢的slice()
s。
与map()
不同,in all browsers的工作原理。
请注意,它如何仅替换您需要的字符(未触及!
和)而不会造成麻烦的迭代或缓慢的
split()
处理。
就像其他答案一样,它也可以正确处理代理对(?
变成了两个字节\ud83d\ude03
)。
如果您打算多次重用该函数,则将其放在自己的函数中并使两个正则表达式保持静态也会使其更快。
如果需要,可以将[^\x00-\xFF]
更改为.
,将\\u0
更改为\\u000
,将/0(
更改为{{1} }。