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方法时指定编码了。是不是很方便呢。