HISUI
汉字编码相关问题
2021年09月08日 18时30分

编码相关问题

问题说明

系统中有一人姓名为王小𥖄,但在系统界面上显示成王小?了,姓名显示不正确。

相关知识

前端JS中编码

>'中'.charAt()        //取第一个字符:'中'
>'𥖄'.charAt()        //取第一个字符:'\uD853'
>'𥖄'.charCodeAt()    //取第一个字符的十进制编码:55381
>(55381).toString(16) //'d855'

通过上面测试发现得到编码一样,接着测试其它方法:

>escape('𥖄') //'%uD855%uDD84'
>escape('𤱙') //'%uD853%uDC59'

使用escape来编码中文时发现是这二个字为4字节汉字。

Cache端中编码

使用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

portalshow
可以看到上面显示正确,但使用sqldbx然会查看会显示成??,此时不要去修改值,一但修改可能导致乱码。

注:在把汉字发送到后台前先使用escape转成Unicode,然后后面使用$zcvt(str,”I”,”URL”)再把Unicode转回汉字存储即可。

var encodeName = escape("王小𥖄") //js代码
Set name = $zcvt(encodeName,"I","URL")  // M代码

注:系统如果全使用UTF-8就不会有此问题。

上一篇: 下一篇:

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

访问量: 379532