DICOM tag中(0008,0005)定义了DICOM数据中字符串表示方式。具体参见DICOM标准P3.3的C.12.1.1.2。
其中大部分亚洲文字都支持ISO 2022的表示方式,简单说,是一种通过ESC转义标记,实现7bit表示8bit文字的方式。简要介绍可以参考
http://en.wikipedia.org/wiki/ISO_2022
标准文档可以在http://www.ecma-international.org/publications/standards/Ecma-035.htm找到。
简单处理逻辑可以这样理解:
注意字符之后对应的字节表示了字符区位。
举例 01/11 02/04 04/02 03/11 03/03 04/05 04/04 (也就是0x1b 0x24 0x42 0x3b 0x33 0x45 0x44) 表示日文汉字的"山田"
用ASCII表示就是/033$B;3ED 其中/033代表一个字符0x1B,经常被表示成ESC。
这个串的前3个是控制字符 ESC $ B,表示后面的汉字是JIS X 0208-1983。
根据ISO2022,每个部分都是从0x20算起,0x3b 0x33 就表示编码为0x1b 0x13的汉字。也就是JIS X 0208-1983第27行19列的汉字,正好是山。
同样,“田”在37行36列。
至于,在计算机中如何处理?运气好的时候正好你用的系统支持ISO 2022字符集,最简单。如果不行,就需要手工把ISO 2022转换成原始编码,然后再考虑其他转换。
这个转换基本上就是
根据ESC的串确定对应的字符集
根据字符集确定每个字节最高位的处理方式,比如,GB2312两个字节高位都是1,而某些日文编码,第一个字节高位是1。
把表示一个汉字的的两个字符需要处理的高位转成1,换句话加上0x80。
然后根据需要再做你的处理。
--------------------------------
背景:
拿到了一台西门子CT的图像,发现里面有很多乱码,不得已只好仔细研究编码DICOM标准和ISO 2022。惊讶的发现,西门子竟然给中国人提供的是使用日文汉字的CT系统。也就是,你看到了汉字,但是系统内核是日文的。肯定有一些中文汉字找不到或者不对。这些跨国公司整天叫嚷重视中国市场,竟然用这种方式对付中国人。