如何在Javascript中打印Unicode字符串?

21

我有一个包含特殊Unicode字符的字符串数组:

var a = [
    ["a", 33],  
    ["h\u016B", 44],
    ["s\u00EF", 51],
    ...
];

当我遍历这个数组时:

for (i=0;i<a.length;i++) {
    document.write(a[i][0] + "<br />");
}

它打印带有重音符号的字符:

a
hù
sô
...

我想要:

a
h\u016B
s\u00EF
...

我该如何在Javascript中实现这个功能?

4个回答

22

像这样吗?

/* Creates a uppercase hex number with at least length digits from a given number */
function fixedHex(number, length){
    var str = number.toString(16).toUpperCase();
    while(str.length < length)
        str = "0" + str;
    return str;
}

/* Creates a unicode literal based on the string */    
function unicodeLiteral(str){
    var i;
    var result = "";
    for( i = 0; i < str.length; ++i){
        /* You should probably replace this by an isASCII test */
        if(str.charCodeAt(i) > 126 || str.charCodeAt(i) < 32)
            result += "\\u" + fixedHex(str.charCodeAt(i),4);
        else
            result += str[i];
    }

    return result;
}

var a = [
    ["a", 33],  
    ["h\u016B", 44],
    ["s\u00EF", 51]
];

var i;
for (i=0;i<a.length;i++) {
    document.write(unicodeLiteral(a[i][0]) + "<br />");
}

结果

a
hū
sï

JSFiddle


这将不会显示Unicode,例如\u0050(它是一个有效的ASCII字符)。如何处理? - gaurav5430
@gaurav5430 这并不是原始问题的意图。去掉 if。请注意,'\u0050'"P"具有相同的表示形式。您无法检查 "P" 是否最初为 '\u0050' - Zeta
@Zeta 如果我去掉if,它会将所有内容转换为Unicode。 - gaurav5430
@gaurav5430:是的。再次强调,一旦浏览器解析了您的代码(或任何其他字符串),"\u0050""P" 之间就没有__任何__区别。您要么按原样显示ASCII,要么将其显示为unicode编码。中间没有任何差别。 - Zeta
是的...实际上我的需求取决于字符串标记在实际字符串和显示字符串中的位置和偏移量,由于这个原因它变得混乱了。 - gaurav5430
显示剩余2条评论

7

7

你可以使用JavaScript的string.charCodeAt()方法来实现。例如:

"test".charCodeAt(0)将返回字符"t"的数字编码。

除此之外,你需要编写一个if语句来检查字符是否为非ASCII字符等。


7

如果您有一个Unicode字符,并且希望将其作为字符串使用,可以执行以下操作:

x = "h\u016B";
// here the unicode is the second char
uniChar = x.charCodeAt(1).toString(16); // 16b
uniChar = uniChar.toUpperCase(); // it is now 16B
uniChar = "\\u0" + uniChar; // it is now \\u016B
x = x.charAt(0) + uniChar; // x = "h\\u016B" which prints as you wish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接