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方法时指定编码了。是不是很方便呢。
阅读(176624) | 评论(0) | 转发(0) |