我有一个变量,其中包含由日本字符组成的字符串,例如:
"みどりいろ"
我该如何将其转换为 Javascript 转义形式?
对于这个特定的例子,我需要的结果是:
"\u306f\u3044\u3044\u308d"
如果有 jquery 的方法,我更喜欢使用它。
我有一个变量,其中包含由日本字符组成的字符串,例如:
"みどりいろ"
我该如何将其转换为 Javascript 转义形式?
对于这个特定的例子,我需要的结果是:
"\u306f\u3044\u3044\u308d"
如果有 jquery 的方法,我更喜欢使用它。
"み".charCodeAt(0).toString(16);
这将给你Unicode编码(以十六进制表示)。你可以通过循环运行它:
String.prototype.toUnicode = function(){
var result = "";
for(var i = 0; i < this.length; i++){
// Assumption: all characters are < 0xffff
result += "\\u" + ("000" + this[i].charCodeAt(0).toString(16)).substr(-4);
}
return result;
};
"みどりいろ".toUnicode(); //"\u307f\u3069\u308a\u3044\u308d"
"Mi Do Ri I Ro".toUnicode(); //"\u004d\u0069\u0020\u0044\u006f\u0020\u0052\u0069\u0020\u0049\u0020\u0052\u006f"
"Green".toUniCode(); //"\u0047\u0072\u0065\u0065\u006e"
演示: http://jsfiddle.net/DerekL/X7MCy/
更多信息请查看:.charCodeAt
replace
函数来代替循环。整个函数如下:return this.replace(/./g, function(c) { return "\\u" + ('000' + c.charCodeAt(0).toString(16)).substr(-4) });
:P - Adasskofor
循环更慢且消耗更多内存。尽管差别非常小,大约慢5%。 (http://jsperf.com/looping-through-a-string) - Derek 朕會功夫上面的答案是合理的。稍微优化一下空间和性能:
function escapeUnicode(str) {
return str.replace(/[^\0-~]/g, function(ch) {
return "\\u" + ("000" + ch.charCodeAt().toString(16)).slice(-4);
});
}
只需
escape("みどりいろ")
大多数情况下,这应该满足需求。但是如果你需要以"\u"的形式而不是"%xx" / "%uxxxx"的形式,则可以使用正则表达式:
escape("みどりいろ").replace(/%/g, '\\').toLowerCase()
escape("みどりいろ").replace(/%u([A-F0-9]{4})|%([A-F0-9]{2})/g, function(_, u, x) { return "\\u" + (u || '00' + x).toLowerCase() });
(toLowerCase
是可选的,让它看起来与第一篇文章完全相同)
它在大多数情况下不需要转义字符,这对你来说可能是一个优点;如果不是,请参见 Derek 的答案,或使用我的版本:
'\\u' + "みどりいろ".split('').map(function(t) { return ('000' + t.charCodeAt(0).toString(16)).substr(-4) }).join('\\u');
%xx
而不是%uxxxx
,导致反斜杠转义无效。您需要进行两次替换,一次将%u
替换为\u
,然后再将%
替换为\x
。此外,toLowerCase()
是多余的,并且会丢失未转义字符的信息。 - bobince根据之前的答案,这是我编写的代码版本。我使用if语句在JSON.stringify()中转换非UTF8字符。
const toUTF8 = string =>
string.split('').map(
ch => !ch.match(/^[^a-z0-9\s\t\r\n_|\\+()!@#$%^&*=?/~`:;'"\[\]\-]+$/i)
? ch
: '\\' + 'u' + '000' + ch.charCodeAt(0).toString(16)
).join('');
使用方法:
JSON.stringify({key: 'Категория дли импорта'}, (key, value) => {
if (typeof value === "string") {
return toUTF8(value);
}
return value;
});
{"key":"\\u00041a\\u000430\\u000442\\u000435\\u000433\\u00043e\\u000440\\u000438\\u00044f \\u000434\\u00043b\\u000438 \\u000438\\u00043c\\u00043f\\u00043e\\u000440\\u000442\\u000430"}
只需使用encodeURI函数:
encodeURI("みどりいろ")
"%E3%81%BF%E3%81%A9%E3%82%8A%E3%81%84%E3%82%8D"
另一方面将其解码回来:
decodeURI("%E3%81%BF%E3%81%A9%E3%82%8A%E3%81%84%E3%82%8D")
"みどりいろ"
我对这个问题有一个答案。我写的这个函数对我很有效。它只将非 utf-8 字符编码为 Unicode。
function toUnicode(word){
let array = word.split("");
array = array.map((character)=>{
if(character.match(/[^a-zA-Z]/g)){
let conversion = "000" + character.charCodeAt(0).toString(16)
return "\\u" + conversion;
}
return character;
});
return array.join("")
}
escape("abc") //"abc"
... @SergeiZahharenko -escape(“abc”)//“abc”
... - Derek 朕會功夫