Chinaunix首页 | 论坛 | 博客
  • 博客访问: 31399
  • 博文数量: 10
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 90
  • 用 户 组: 普通用户
  • 注册时间: 2020-06-29 11:21
文章分类
文章存档

2020年(10)

我的朋友

分类: 信息化

2020-07-02 15:27:42

  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,如下:

  点击(此处)折叠或打开class MyIOManager : IOManager

  {

  public static readonly IOManager Instance = new MyIOManager();

  private MyIOManager()

  {

  }

  protected override Encoding BaseEncodingImpl

  {

  get

  {

  return Encoding.Default;

  }

  }

  protected override IPath PathImpl

  {

  get

  {

  return DesktopPath.Instance; ;

  }

  }

  protected override IDirectoryReference CreateDirectoryReferenceImpl(string directoryName)

  {

  return new DesktopDirectoryReference(directoryName);

  }

  protected override IFileReference CreateFileReferenceImpl(string fileName)

  {

  return new DesktopFileReference(fileName);

  }

  }

  然后在我们的应用程序的入口处先调用一下

  点击(此处)折叠或打开MyIOManager.SetImplementation(MyIOManager.Instance);

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

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