各种格式unicode字符集编码与转换
各种格式unicode字符集编码与转换
国际组织制定了可以容纳世界上所有文字和符号的字符编码方案,称为Unicode,是通用字符集Universal Character Set的缩写,用以满足跨语言、跨平台进行文本转换、处理的要求,自从1994年发布,不断进行扩展,目前已经到了Version 10
可以进入网址https://www.unicode.org/查询详细信息,包括下载最新版本的码表。
使用Unicode字符集时根据是在HTML、CSS中,还是在JavaScript中,而有不同的方法和格式。
HTML中使用:&#dddd;或&#xhhhh;
其中dddd表示4位10进制数值,hhhh表示4位16进制数值,两种格式分别以&#及&#x为前缀,表示为10进制码或者16进制的Unicode码,都需要以分号为后缀。目前,使用4位16进制码的Unicode字符获得比较好的支持,大多数都可以在网页中正常显示,但其他更多的Unicode字符往往还不能显示出来,这是因为使用的计算机平台还没有安装相关的Unicode支持。示例:
<p>显示Unicode字符--∰</p>
显示Unicode字符--∰
其中显示了一个数学符号,Unicode码为2230,可以使用“∰”或“∰”来输出这个特殊字符,然后就可以在页面中显示出来了。
在事件或者函数中也可以使用
<img src=1 onerror='alert(6)'>
<img src=1 onerror=eval('alert(6)')>
"无法用于闭合最外层 " 号,会解析成转义的 " .
CSS中使用:\hhhh
CSS中使用Unicode字符的场合比较少,但偶尔也会用到,一般是使用4位16进制Unicode码表示,前缀为反斜符,也有10进制和8进制等。
在eval()等函数中也可以使用
<script>
eval('a\x6cert(1)');//十六进制
eval('a\154ert(1)');//八进制
</script>
JavaScript中使用:\uhhhh
JavaScript代码中经常会用到输出特殊字符,如在某个元素中输出温度或角度符,使用希腊字母、罗马数字等,只需要在4位Unicode的16进制码前面加上前缀“\u”即可。示例:
<script>a\u006cert(1);</script>
document.body.innerHTML="\u25D0";
其中使用了Unicode码25D0,在几何图形表中,是一个圆形图案,一般填充白色一半填充黑色,像半个月亮。
当然,中国人最常见的使用Unicode码的场合是用汉字。
为了获得一个汉字的Unicode码,可以使用JavaScript函数charCodeAt(),例如:
var ucode="赵".charCodeAt();
这样就把汉字“赵”的Unicode代码存入变量ucode中,可以获取得到Unicode码为36213,这是一个十进制的Unicode码。可以使用toString(16)方法把这个10进制码转为16进制码:
var ucode="赵".charCodeAt().toString(16);
这样获得的就是汉字“赵”的16进制形式的Unicode码,得到的值为8d75。
一般情况下输出汉字,可以将包括汉字的字符串直接显示。也可以使用汉字的Unicode码输出对应的汉字或其他字符:
String.fromCharCode(36213);
这样就将十进制Unicode码为36213的字符转换为字符串,然后将此字符串输出就会显示汉字“赵”。因为汉字可以使用输入法直接得到字符串,所以这种方法往往用来输出一些特殊字符。
\u对"'(等字符只会解析成普通字符,对js中的“(”字符使用会导致js脚本失效
把&#编码转换成字符
<script>
var str10="hello哈哈";//哈哈的十进制unicode
var str16="hello哈哈";//哈哈的十六进制unicode
var str="hello哈哈";
console.log(encode(str));
console.log(encode16(str));
console.log(uncode(str10));
console.log(uncode(str16));
//把&#或者&#x编码转换成字符
function uncode(str) {
return str.replace(/&#(x)?([^&]{1,5});?/g, function (a, b, c) {
return String.fromCharCode(parseInt(c, b ? 16 : 10));
});
}
//把字符转换成&#编码
function encode(str) {
var a = [], i = 0;
for (; i < str.length ;) {
a[i] = str.charCodeAt(i++);
}
return "&#" + a.join(";&#") + ";";
}
//把字符转换成&#x编码
function encode16(str) {
var a = [], i = 0;
for (; i < str.length ;) {
a[i] = str.charCodeAt(i++).toString(16);
}
return "&#x" + a.join(";&#x") + ";";
}
</script>
java
public static String unicodeToString(String unicode)
{
StringBuffer string = new StringBuffer();
if (unicode.startsWith("&#x")) {
String[] hex = unicode.replace("&#x", "").split(";");
for (int i=0; i<hex.length; i++) {
int data = Integer.parseInt(hex[i], 16);
string.append((char) data);
}
} else if (unicode.startsWith("&#")) {
String[] hex = unicode.replace("&#", "").split(";");
for (int i=0; i<hex.length; i++) {
int data = Integer.parseInt(hex[i], 10);
string.append((char) data);
}
}
return string.toString();
}