Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6662021
  • 博文数量: 915
  • 博客积分: 17977
  • 博客等级: 上将
  • 技术积分: 8846
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-26 09:59
个人简介

一个好老好老的老程序员了。

文章分类

全部博文(915)

文章存档

2022年(9)

2021年(13)

2020年(10)

2019年(40)

2018年(88)

2017年(130)

2015年(5)

2014年(12)

2013年(41)

2012年(36)

2011年(272)

2010年(1)

2009年(53)

2008年(65)

2007年(47)

2006年(81)

2005年(12)

分类: C#/.net

2020-06-13 21:57:15

fo-dicom是原来的mDcm的升级版本,现在已经将源码移动到github上,它是.net环境下处理DICOM的一款不错的开源底层框架,学习DICOM的朋友可以尝试学习此框架,目前最新的nuget发布版本是4.0.5,更新还是在进行中的。
最近一段时间,公司产品要测试Worklist查询,其中按照IHE的测试标准,有近14个查询条件,但目前各个RIS模拟器比如DVTK的RIS Simulator还有IHE官方推荐的MESA都没有完全支持这14个条件。看到fo-dicom-sample中有关于Worklist SCP的例子代码,就想着基于此写一个自己的RIS Simulator吧。
但由于这个框架是老外写的,所以可能对中文考虑欠佳,所以他默认的字符编码就是ASCII编码,对中文处理不好,都变成了问号了。
在不断的调试中发现,当我使用DicomDataSet的AddOrUpdate(DicomTag,value)方法加入一个值的时候,原来的中文加进去就变成了问号,如果调用这个方法的重载,第二个参数指定编码为中文编码,则加进去就正常,客户查询到也是中文。但发送的查询条件中文还是乱码。
于是就想怎么能改变它的默认字符集了,通过阅读框架的源码,发生它的默认字符集取自IOManager的BaseEncodingImpl,而IOManager是一个抽象类,我们可以调用这个类的静态方法SetImplementation来改变系统的默认实现,参数就是IOManager类型的,所以我们可以自己写一个子类如我的MyIOManager,如下:

点击(此处)折叠或打开

  1. class MyIOManager : IOManager
  2.     {
  3.         public static readonly IOManager Instance = new MyIOManager();
  4.         private MyIOManager()
  5.         {

  6.         }
  7.         protected override Encoding BaseEncodingImpl
  8.         {
  9.             get
  10.             {
  11.                 return Encoding.Default;
  12.             }
  13.         }

  14.         protected override IPath PathImpl
  15.         {
  16.             get
  17.             {
  18.                 return DesktopPath.Instance; ;
  19.             }
  20.         }

  21.         protected override IDirectoryReference CreateDirectoryReferenceImpl(string directoryName)
  22.         {
  23.             return new DesktopDirectoryReference(directoryName);
  24.         }

  25.         protected override IFileReference CreateFileReferenceImpl(string fileName)
  26.         {
  27.             return new DesktopFileReference(fileName);
  28.         }
  29.     }
然后在我们的应用程序的入口处先调用一下

点击(此处)折叠或打开

  1. MyIOManager.SetImplementation(MyIOManager.Instance);
将fo-dicom使用的默认字符集修改一下。注意,我的类中BaseEncodingImpl取得的是Encoding.Default,意思就是取系统默认编码。这样在中文系统下就是GB2312或者GB18030了,就可以友好的支持中文了,而不用在每次调用DicomDataSet的AddOrUpdate方法时指定编码了。是不是很方便呢。

阅读(176691) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~