系统中有一人姓名为王小𥖄,但在系统界面上显示成王小?了,姓名显示不正确。
>'中'.charAt() //取第一个字符:'中'
>'𥖄'.charAt() //取第一个字符:'\uD853'
>'𥖄'.charCodeAt() //取第一个字符的十进制编码:55381
>(55381).toString(16) //'d855'
通过上面测试发现得到编码一样,接着测试其它方法:
>escape('𥖄') //'%uD855%uDD84'
>escape('𤱙') //'%uD853%uDC59'
使用escape来编码中文时发现是这二个字为4字节汉字。
使用Window编码的Terminal复制这二个字后,都显示成乱码了,使用UTF-8编码的Terminal复制这二个字后,可以显示正确,但现在系统使用编码并非UTF-8,如何让系统能正确显示这二个汉字?
最后测试发现可以使用以下方式显示正确的编码
zzdump $zcvt("%uD855%uDD84","I","URL")
0000: D855 DD84 ??
虽然Terminal显示时仍旧是二个问号,但字节值能正确存储。
通过Set把global修改成正确的存值即可
set PatName = $ZCVT("%u738B%u5C0F%uD855%uDD84","I","URL") //%u738B%u5C0F为'王小'的编码
set $P(^PAPER(274932,"ALL"),"^",1)=PatName
可以看到上面显示正确,但使用sqldbx然会查看会显示成??,此时不要去修改值,一但修改可能导致乱码。
注:在把汉字发送到后台前先使用escape转成Unicode,然后后面使用$zcvt(str,”I”,”URL”)再把Unicode转回汉字存储即可。
var encodeName = escape("王小𥖄") //js代码
Set name = $zcvt(encodeName,"I","URL") // M代码
注:系统如果全使用UTF-8就不会有此问题。
访问量: 509673