ISO_IR 58 support in .Net 4.0

本文关键字:Net in support IR ISO | 更新日期: 2023-09-27 18:13:09

DICOM中有一个名为ISO_IR 58的双字节字符集。据我所知,在。net中等效的编码是gb2312。我试图在7位ASCII编码ISO_IR 58个字符,用于医疗系统之间的通信。

在java世界中,字符串gb2312可以完成这种编码。

首先看一下ISO_IR 87的例子(ISO_IR 87在。net中等于iso-2022-jp):

Encoding enc = Encoding.GetEncoding("iso-2022-jp");
byte[] bytes = enc.GetBytes("叙収參参^去厰厦厘=却占^卮博南");
string asciistring = ASCIIEncoding.ASCII.GetString(bytes);

它接受输入字符串并给出ASCII字符串:$B=v<}RT;2(B^$B5nRRRONR(B=$B5Q@j(B^$BRHGnFn(B

))

包含所有我可以正确使用的转义序列。

(此处不显示实际的第一个转义字符,但粘贴时显示序列的其余部分)

如果我使用来自ISR_IR 58的字符的代码:

Encoding enc = Encoding.GetEncoding("gb2312");
byte[] bytes = enc.GetBytes("ㄆㄉㄊㄋ^ㄌㄍㄐㄓ^ㄖㄠㄢㄤ");
string asciistring = ASCIIEncoding.ASCII.GetString(bytes);

我只得到字符串 : ????????^????????^????????

那么使用。net的DICOM ISO_IR 58编码的答案是什么?我是否使用错误的字符串进行编码?.Net中不支持DICOM中的ISO_IR 58吗?.Net中有bug吗?这可能吗?

ISO_IR 58 support in .Net 4.0

ASCIIEncoding为7位编码,不能为任何8位编码用它表示。因此使用问号。

这应该适用于所有的字符集:

Encoding enc = Encoding.GetEncoding("gb2312");
byte[] bytes = enc.GetBytes("ㄆㄉㄊㄋ^ㄌㄍㄐㄓ^ㄖㄠㄢㄤ");
Encoding asc = Encoding.GetEncoding("iso-8859-1");
string astr = asc.GetString(bytes);

输出
A8 C6 A8 C9 A8 CA A8 CB 5E A8 CC A8 CD A8 D0 A8 D3 5E A8 D6 A8 E0 A8 E2 A8 E4 
¨Æ¨É¨Ê¨Ë^¨Ì¨Í¨Ð¨Ó^¨Ö¨à¨â¨ä

对编码进行了一些研究,根据IANA, ISO-IR-58映射到GB_2312-80而不是GB2312,在。net框架中映射到x-cp20936,代码页20936。如果是这种情况,您需要使用:

Encoding.GetEncoding("x-cp20936");

Encoding.GetEncoding(20936);

当然,两者是相同的,所以是喜欢使用名称还是代码页取决于您。


您提到Java在GB2312下工作得很好,您认为这是ISO-IR-58的正确映射。这真的很有趣。有趣的是,根据DICOM(此链接适用于MS Word文档),ISO_IR 58被映射到IANA ISO-2022-CN。这与IANA所说的相冲突,那么该相信谁呢?好了,我们遵循了上面的IAIA,我希望它对你有用,但现在让我们遵循DICOM,看看它会走向何方。遗憾的是,. net中没有ISO-2022-CN编码,所以我们需要更多的研究。

根据维基百科,ISO-2022-CN编码可以以以下方式之一开头:

ESC $) A切换到GB 2312-1980(每个字符2字节)[指定为G1]
ESC $) G切换到CNS 11643-1992平面1(每个字符2字节)[指定为G1]
ESC $ * H切换到CNS 11643-1992平面2(每个字符2字节)

您提到Java返回的正确字符串以ESC $ ) A开头,因此我们将遵循第一个选项,该选项指向Wikipedia页面的GB2312,这是您认为正确的编码。这里有一些重要的事情需要注意:

  • 开头说GB2312 (1980)。等一下。这就是GB_2312-80编码的实际含义吗?如果是,那么我们就回到了IANA最初告诉我们的,上面提到的代码就是要走的路。

  • 然后继续说已经被GBK和GB18030取代。嗯,. net框架没有GBK编码,但它确实有GB18030代码页54936。我不认为这是你应该使用的,但如果其他编码不适合你,这是值得一试的。

  • 然后如果你滚动到 GB2312标题的两个实现,你可以看到以下文本:

截至2015年,Microsoft .Net Framework正在使用实现A. iconv-1.14, php-5.6, ActivePerl-5.20, Java 1.7, Python 3.4正在使用实现B.[2]Ruby 2.2兼容实现A和实现B,它在内部将冲突字符转换为实现A。

你读了吗?我再重复一遍:.Net框架使用的是实现A, Java使用的是实现b。