各种格式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字符--&#x2230;</p>

显示Unicode字符--∰

其中显示了一个数学符号,Unicode码为2230,可以使用“&#x2230;”或“&#8752;”来输出这个特殊字符,然后就可以在页面中显示出来了。

在事件或者函数中也可以使用

<img src=1 onerror='&#97;&#108;&#101;&#114;&#116;&#40;&#54;&#41;'>
<img src=1 onerror=eval('&#97;&#108;&#101;&#114;&#116;&#40;&#54;&#41;')>

&#x22;无法用于闭合最外层 " 号,会解析成转义的 " .

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="&#104;&#101;&#108;&#108;&#111;&#21704;&#21704;";//哈哈的十进制unicode
var str16="&#x68;&#x65;&#x6c;&#x6c;&#x6f;&#x54c8;&#x54c8;";//哈哈的十六进制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();
}

 

posted @ 2023-04-27 11:25  少年阿丁  阅读(381)  评论(0编辑  收藏  举报