C#解析dicom文件遇到的问题及中文乱码的解决方法

      最近公司接了一个医院的项目,要解析dicom文件,“好学”的我没办法只能为公司分忧,开始找解决方案。

      由于自己是做游戏出身,更准确地说是做Unity游戏出身,所以就在网上各种找C#解析dicom的方案,别说还真找到了,就是Z神的这篇文章:文章,文章里附带源码,需要解析Dicomde 的C#小哥有福了,很详细了。

       但是如果直接拿文章中的代码用就会发现文章的代码中有一个小问题(当然有些是没问题的),在运行代码的时候患者的姓名和医院的姓名如果是中文的话就有可能解析不出来,出现乱码或者问号,经过一系列的摸索又发现原来是特殊字符集搞的鬼,详见:传送门,那找到了问题那就改呗,如果按着上边文章改然后你就会发现还不行,应为fo-Dicom的SpecificCharacterSet是静态只读的,无法修改,WTF~~~!!!。

       别着急,我已经找到了解决方案,而且是很傻的解决方案,自己是 脑袋抽了一直没想到,不说那么多了言归正传,既然知道是字符集的锅,而fo-Dicom已经编译了无法修改,那就只能另辟蹊径,有两个解决方案:

      1.重新编译库,我们都知道(自认为)目前用的比较多并且堪称最稳定的Dicom解析库是DCMTK,当然为了保证性能,DCMTK是C++的开源库,mDCM目前了解是从DCMTK开源库转过来的,或者说是该开源项目的另一个分支,是对用C#语言对C++版本的医学图像开源库的再次组织和封装,而fo-Dicom是由mDcm升级封装而来的,那就好办了,要么你重新编译这两个库,要么看下一个简单的解决方案。

      2.解析字符集,既然不想像我一样花费半天时间重新编译DCMTK库,那就改代码自己解决;既然我们改变不了世界,那我们就改变自己!Z神代码中读取名称是将fo-Dicom传进来的字节流强制转换为字符串出错的,那我们就不要强制转换,我们先获得fo-Dicom传进来的字节流,然后将字节流以自己设定的字符集解析这样不就解决了中文的问题吗?哈哈~~~~~,下边附上代码我用的是使用系统默认的字符集解析的,当然你也可以自己设定:

byte[] patientByte = dcmDataset.Get(DicomTag.PatientName);
            string patientName = Encoding.Default.GetString(patientByte);

      完美~~~~,解决了,可以开心的下班吃饭了,当然如果还有什么问题,可以随时下边留言,我看到一定及时回复(当然是我会的时候)!

你可能感兴趣的:(unity)