"入力されたデータは範囲外です。"
转换为
"\u5165\u529B\u3055\u308C\u305F\u30C7\u30FC\u30BF\u306F\u7BC4\u56F2\u5916\u3067\u3059\u3002"
但我无法想出解决方法。
有什么建议吗?
谢谢,Sarbbottam
"入力されたデータは範囲外です。"
转换为
"\u5165\u529B\u3055\u308C\u305F\u30C7\u30FC\u30BF\u306F\u7BC4\u56F2\u5916\u3067\u3059\u3002"
但我无法想出解决方法。
有什么建议吗?
谢谢,Sarbbottam
你可以通过循环字符并使用 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
定义为空字符串。output
字符串中追加 \u
。使用 input.charCodeAt(i)
获取字符的 UTF-16 值,然后使用 .toString(16)
将其转换为十六进制字符串,并用前导零填充,最后将结果追加到 output
字符串中。output
字符串。正如 Tim Down 所评论的那样,我们还可以在 charCodeAt
值上添加 0x10000
然后调用 .toString(16)
生成的字符串上调用 .slice(1)
方法来实现填充效果。
function string_as_unicode_escape(str){
return str.split("").map(function(s){
return "\\u"+("0000" + s.charCodeAt(0).toString(16)).slice(-4);
}).join("");
}
var hex = new Array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f');
变量 hex 是一个包含十六进制数字字符的数组。
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;
}
}
}
//------------------------ 你可以称之为
replace()
来实现这个功能。'! \u0100 力 '.replace(
/[^\x00-\xFF]/g,
function(ch) {
return ('\\u0' + ch.charCodeAt(0).toString(16))
.replace(/0(?=....$)/, '');
}
)
生成 ! \u0100 \u529b \ud83d\ude03
非常简洁,处理填充问题不需要繁琐的if
或缓慢的slice()
。
与map()
不同,可以在所有浏览器中工作(链接1)。
请注意,它仅替换您需要的字符(!
和未被触及),而无需繁琐的迭代或缓慢的
split()
。
就像其他答案一样,它还正确处理代理对(转换为两个字节
\ud83d\ude03
)。
将其放入自己的函数中并保持两个正则表达式静态,如果您计划多次重复使用该函数,则可以使其更快。
如果您确实需要所有字符,则可以通过将[^\x00-\xFF]
更改为.
,将\\u0
更改为\\u000
,将/0(
更改为/0+(
来完成。
output += '\\u' + (input.charCodeAt(i) + 0x10000).toString(16).slice(1);
- Tim Down