关闭
fsk33 2023-03-08 08:15 采纳率: 75.8%
浏览 131
已结题

C#中文字符显示为乱码

用C#编写了一个DICOM医学图像接收程序,当发送患者列表中登记的姓名是拼音时,接收到的姓名正常显示(也是拼音),但如果发送患者列表中登记的是中文名时,显示为乱码。如姓名:伍海文,显示为:浼嶆捣鏂?(这个乱码是我从数据库中复制出来的)。在网上搜了许多编码格式转换的代码,均没有用。
另外,从发送端设置里查到,那边DICOM图像编码格式是ISO_IR 192,(网上搜了一下,DICOM默认编码格式是ISO_IR 100)但我无论怎么转换都没效果,可能操作不对吧。
我的代码如下(只列出了姓名获取的代码):

 class PatientInfo
 //患者姓名
        public string patName
        {
            get;
            set;
        }
 PatientInfo.patName = Ddataset.Get<string>(DicomTag.PatientName, "NONAME").Replace("\0", "");

运行下来,这个PatientInfo.patName始终是乱码。
请问,如何对PatientInfo.patName进行转换而正常显示中文名,需要代码。

  • 写回答

9条回答 默认 最新

  • 「已注销」 2023-03-08 09:41
    关注

    “Devil组”引证GPT后的撰写:

    • 问题就是涉及到字符编码的转换问题,因为中文字符在不同的编码格式下,对应的二进制数值是不同的,如果在接收端和发送端的编码格式不一致,就有可能导致中文字符乱码的情况。
    • 从DICOM协议的规范上看,DICOM中使用的字符编码格式是多种多样的,包括ISO_IR 100、ISO_IR 192等等,这些编码格式都是通过DICOM标签来指定的。
    • 在C#中,可以使用System.Text.Encoding类来进行字符编码的转换。

    根据你提供的信息,试以下的代码:

    //获取DICOM标签中的患者姓名
    string nameInDicom = Ddataset.Get<string>(DicomTag.PatientName, "NONAME").Replace("\0", "");
    
    //将DICOM中的姓名字符串按照指定的编码格式解码为字节数组
    byte[] nameBytes = System.Text.Encoding.GetEncoding("ISO_IR 192").GetBytes(nameInDicom);
    
    //将字节数组按照指定的编码格式转换为字符串
    string nameInChinese = System.Text.Encoding.UTF8.GetString(nameBytes);
    
    //将最终的中文姓名赋值给PatientInfo对象
    PatientInfo.patName = nameInChinese;
    
    

    先将DICOM标签中获取的患者姓名字符串nameInDicom按照ISO_IR 192编码格式转换为字节数组nameBytes,然后再将nameBytes按照UTF-8编码格式转换为中文字符串nameInChinese。最后将nameInChinese赋值给PatientInfo对象的patName属性即可。

    • 需要注意的是,如果发送端和接收端的字符编码格式不一致,那么在将DICOM中的字符串解码为字节数组时,需要使用发送端指定的编码格式。如果发送端指定的编码格式是ISO_IR 192,那么在接收端解码时也应该使用相同的编码格式。如果不确定发送端使用的编码格式,可以先尝试使用不同的编码格式进行解码,并观察结果是否正确。
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    fsk33 2023-03-08 13:23

    现在解析出来,姓名前两个字正确,最后一人是乱码,还有什么办法没有呢

    回复
    fsk33 回复 fsk33 2023-03-08 13:24

    最后一个字乱码

    回复
    「已注销」 回复 fsk33 2023-03-08 13:25

    可能是因为字符编码格式的不匹配导致的。可以尝试使用不同的编码格式进行解码和转换,找到正确的编码格式。如果DICOM标签中的患者姓名使用了多个组件(如姓和名分别使用不同的组件),那么在获取患者姓名时需要使用DicomDataset.GetValueOrDefault方法获取多个组件的值,并将它们拼接起来,例如:

    string firstName = Ddataset.GetValueOrDefault<string>(DicomTag.PatientFirstName, "");
    string lastName = Ddataset.GetValueOrDefault<string>(DicomTag.PatientLastName, "");
    string fullName = lastName + firstName;
    
    

    然后将fullName按照指定的编码格式解码和转换即可。

    回复
    展开全部6条评论
查看更多回答(8条)
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 3月18日
  • 已采纳回答 3月11日
  • 创建了问题 3月8日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部