|
本帖最后由 thXnder 于 2017-11-18 16:22 编辑
有时候,我们想根据给定的unicode编码(可能大于0xFFFF),得到相应的字符,aardio中似乎没有直接转换的函数,于是我利用web.script库并参考网络文章写了一个:
- var unicode2chr = function(unicode) begin //把unicode编码(形如0x2B81C)转换成字符(形如“你”)
- import web.script;
- if(unicode <= 0xFFFF) return string.unescape(string.replace(tostring(unicode,16), "@0x", "\u"));
- unicode -= 0x10000; //最长20bit
- var high = (unicode >> 10) + 0xD800;
- var low = (unicode & 2_1111111111) + 0xDC00; //此处的按位与相当于(unicode << 22) >> 22;
- return web.script().run("unescape", string.replace(tostring(high,16)++tostring(low,16), "@0x", "%u"));
- end;
- import console; console.log(unicode2chr(0x4F60));
复制代码参考文章:
[1] https://www.cnblogs.com/dragon2012/p/5020259.html
[2] http://blog.csdn.net/thl789/article/details/7506133
注意,如果你的unicode编码大于0xFFFF,例如 字(其unicode编码为0x2B81C,参见http://yedict.com/zscontent.asp?uni=2B81C),上面的函数也能把它转换成字符,但控制台的点阵字体是无法显示它的,可以把它输出到文件或者用文本框控件查看(当然,需要先安装大字符集的字体,如开心宋体或者天珩字体后重启才能看到)。
.
把上面的计算过程反过来,就可以实现查询某个字符对应的unicode编码:
- var chr2unicode = function(chr) begin //逆运算
- import web.script;
- var utfcode = string.split(web.script().run("escape", chr), '<%u>');
- if(#utfcode==2) return tonumber("0x" ++ utfcode[2]);
- var high = tonumber("0x" ++ utfcode[2]) - 0xD800;
- var low = tonumber("0x" ++ utfcode[3]) - 0xDC00;
- return (high << 10) + low + 0x10000;
- end;
- import console; console.log(tostring(chr2unicode("你"),16))
复制代码
不知道是否有理解不当之处,故在此分享,希望与老师、同学们交流。
附:unicode编码划分给汉字用的空间大致如下:
空间名称 | unicode编码范围 | 基本区 | 4E00~9FA5 | 基本区补充 | 9FA6~9FCF | 扩展A区 | 3400~4DB5 | 扩展B区 | 20000~2A6D6 | 扩展C区 | 2A700~2B734 | 扩展D区 | 2B740~2B81D | 扩展E区 | 2B820~2CEA1 | 扩展F区 | 2CEB0~2EBE0 | 康熙部首 | 2F00~2FD5 | 部首扩展 | 2E80~2EF3 | 兼容汉字 | F900~FAD9 | 兼容扩展 | 2F800~2FA1D | PUA(GBK)部件 | E815~E86F | 部件扩展 | E400~E5E8 | PUA增补 | E600~E6CF | 汉字笔画 | 31C0~31E3 | 汉语注音 | 3105~3120 | 注音扩展 | 31A0~31BA |
|
|