关于中文编码的问题,经常出现在DICOM Storage和Modality Worklist两个服务中,这两个环节最容易出现问题,也是很多PACS公司上线前经常担心的问题。以下我分享两个典型的案例,这中例子在国内的PACS实施过程中还是很常见的,鉴于目前工作的保密性,我就不方便透露项目的名称了。
JDICOM里面的EditDicomObject,另外想MyViewPad,Sante DICOM HEX Viewer等也是非常不错的软件。我也经常用这些,不过我当时用的是我们自己开发的一个小工具,跟前面提到的工具在功能上差不多,只不过结合了我们自己的一些使用习惯。当时已查看图像就发现了异常,DICOM标签到Insitution Name就终止了,也就是显示了医院的姓名之后就找不到余下的标签信息了,而且医院名称显示还是中文姓名。通常这种情况下基本就是中文字符编码不规范,导致字符串长度跟DICOM标签中的Length的值不一致,这样遍历标签时,后面的信息全乱了。这个案例就是非常典型的情况,医院的名称使用了中文,没有Specified
Characterset标签指定编码方式,通常这种情况下,各个程序都会按照ASCII编码或者当前系统默认编码去读取字符串,所以这台设备的图像第一个潜在风险就是没有显示指明中文的编码方式。当然有一些优秀的软件做的比较深入,可以根据字符串的字节信息去尝试判断编码方式,但是大部分厂家是没有这层逻辑的,而且这种做法也会比较费时间。当然这个案例里面关键的问题还不是因为没有显示指明编码方式,关键的问题在于字符串的长度有问题,这个医院的中文名称有13个汉字,我很诧异做这款软件的兄弟还知道需要将字符串长度补齐为偶数,但是他居然将这个标签的长度设置为14,因为他用的多字节编码,每个汉字应该占两个字节,最后医院名称的长度应该是26个字节,而且显然是偶数不需要补零。类似地,图像里面的检查部分也用的中文,而且犯了同样的错误。
Characterset为ISO_IR 192,比如王小東,DICOM协议建议的编码方式是包含患者的中英文信息,并且严格区分Frist Name和Last Name,姓和名,最后的编码应该是:Wang^XiaoDong=王^小東=,对应的Unicode字节信息是:0x57
0x61 0x6e 0x67 0x5e 0x58 0x69 0x61 0x6f 0x44 0x6f 0x6e 0x67 0x3d 0xe7
0x8e 0x8b 0x5e 0xe5 0xb0 0x8f 0xe6 0x9d 0xb1 0x3d
另外一种编码方式是我们的国标GB18030,即在Specified Characterset标签中填写GB18030,Wang^XiaoDong=王^小东=对应的字节信息是:0x57
0x61 0x6e 0x67 0x5e 0x58 0x69 0x61 0x6f 0x44 0x6f 0x6e 0x67 0x3d 0xcd
0x61 0x6e 0x67 0x5e 0x58 0x69 0x61 0x6f 0x44 0x6f 0x6e 0x67 0x3d 0xcd
0xf5 0x5e 0xd0 0xa1 0xb6 0xab 0x3d
写代码的朋友应该能看懂这段内容。(不过需要注意的是DICOM标准中对“東”字的UTF-8编码值给的是不对的。)