ISO_IR .Net 4.0 支持 58
ISO_IR 58 support in .Net 4.0
DICOM 中有一个名为 ISO_IR58 的双字节字符集。据我所知,.Net 中的等效编码是 gb2312。我正在尝试将 ISO_IR 58 个字符编码为 7 位 ASCII,以便医疗系统之间进行通信。
在 java 世界中,字符串 gb2312 用于执行此编码。
先看这个例子ISO_IR87(ISO_IR87在.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_IR58 编码的答案是什么?我是否使用了错误的字符串进行编码? .Net 不支持 DICOM 中的 ISO_IR 58 吗? .Net 中有错误吗?有可能吗?
对编码做了一些研究,根据 IANA the ISO-IR-58 is mapped to GB_2312-80 not to GB2312, which in .Net Framework 映射到 x-cp20936 代码页 20936 .如果是这样,您需要使用:
Encoding.GetEncoding("x-cp20936");
或
Encoding.GetEncoding(20936);
当然,两者是相同的,所以使用名称还是代码页取决于您。
您提到 Java 与 GB2312 配合得很好,您认为这是 ISO-IR-58[= 的正确映射58=]。现在,这真的很有趣。有趣的是,根据 DICOM(这个 link 是针对 MS Word 文档),ISO_IR 58 被映射到 IANA ISO-2022-CN。这与 IANA 的说法相冲突,那么该相信谁呢?好的,我们按照上面的 IAIA 进行操作,我希望这对您有用,但是现在让我们关注 DICOM,看看它的发展方向。遗憾的是,.Net 中没有 ISO-2022-CN 编码,因此我们需要更多研究。
根据Wikipedia,ISO-2022-CN编码可以以下列之一开始:
ESC $ ) A to switch to GB 2312-1980 (2 bytes per character) [designated to G1]
ESC $ ) G to switch to CNS 11643-1992 Plane 1 (2 bytes per character) [designated to G1]
ESC $ * H to switch to CNS 11643-1992 Plane 2 (2 bytes per character)
您提到 Java 的正确字符串 return 以 ESC $ ) A
开头,因此我们将遵循导致 Wikipedia page for GB2312 的第一个选项,即你认为是正确的编码。现在,在此页面上有几件重要的事情需要注意:
开头是GB2312 (1980)。好吧,等一下。这就是 GB_2312-80 编码的真正含义吗?如果是,那么我们回到 IANA 首先告诉我们的内容,上面提到的代码就是要走的路。
然后继续说已经被GBK和GB18030取代了。嗯,.Net Framework 没有 GBK 编码,但它有 GB18030,代码页为 54936。我不认为这是你应该使用的,但如果其他编码对你不起作用,那值得一试。
然后,如果您滚动到 GB2312 的两种实现方式标题,您可以看到以下文本:
As of 2015, Microsoft .Net Framework is using Implementation A. iconv-1.14, php-5.6, ActivePerl-5.20, Java 1.7, Python 3.4 are using Implementation B.[2] Ruby 2.2 is compatible with both Implementation A and Implementation B, it internally converts the conflictive characters to Implementation A.
你读了吗?我再重复一遍:.Net Framework 使用的是实现 A,Java 使用的是实现 B。
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
¨Æ¨É¨Ê¨Ë^¨Ì¨Í¨Ð¨Ó^¨Ö¨à¨â¨ä
DICOM 中有一个名为 ISO_IR58 的双字节字符集。据我所知,.Net 中的等效编码是 gb2312。我正在尝试将 ISO_IR 58 个字符编码为 7 位 ASCII,以便医疗系统之间进行通信。
在 java 世界中,字符串 gb2312 用于执行此编码。
先看这个例子ISO_IR87(ISO_IR87在.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_IR58 编码的答案是什么?我是否使用了错误的字符串进行编码? .Net 不支持 DICOM 中的 ISO_IR 58 吗? .Net 中有错误吗?有可能吗?
对编码做了一些研究,根据 IANA the ISO-IR-58 is mapped to GB_2312-80 not to GB2312, which in .Net Framework 映射到 x-cp20936 代码页 20936 .如果是这样,您需要使用:
Encoding.GetEncoding("x-cp20936");
或
Encoding.GetEncoding(20936);
当然,两者是相同的,所以使用名称还是代码页取决于您。
您提到 Java 与 GB2312 配合得很好,您认为这是 ISO-IR-58[= 的正确映射58=]。现在,这真的很有趣。有趣的是,根据 DICOM(这个 link 是针对 MS Word 文档),ISO_IR 58 被映射到 IANA ISO-2022-CN。这与 IANA 的说法相冲突,那么该相信谁呢?好的,我们按照上面的 IAIA 进行操作,我希望这对您有用,但是现在让我们关注 DICOM,看看它的发展方向。遗憾的是,.Net 中没有 ISO-2022-CN 编码,因此我们需要更多研究。
根据Wikipedia,ISO-2022-CN编码可以以下列之一开始:
ESC $ ) A to switch to GB 2312-1980 (2 bytes per character) [designated to G1]
ESC $ ) G to switch to CNS 11643-1992 Plane 1 (2 bytes per character) [designated to G1]
ESC $ * H to switch to CNS 11643-1992 Plane 2 (2 bytes per character)
您提到 Java 的正确字符串 return 以 ESC $ ) A
开头,因此我们将遵循导致 Wikipedia page for GB2312 的第一个选项,即你认为是正确的编码。现在,在此页面上有几件重要的事情需要注意:
开头是GB2312 (1980)。好吧,等一下。这就是 GB_2312-80 编码的真正含义吗?如果是,那么我们回到 IANA 首先告诉我们的内容,上面提到的代码就是要走的路。
然后继续说已经被GBK和GB18030取代了。嗯,.Net Framework 没有 GBK 编码,但它有 GB18030,代码页为 54936。我不认为这是你应该使用的,但如果其他编码对你不起作用,那值得一试。
然后,如果您滚动到 GB2312 的两种实现方式标题,您可以看到以下文本:
As of 2015, Microsoft .Net Framework is using Implementation A. iconv-1.14, php-5.6, ActivePerl-5.20, Java 1.7, Python 3.4 are using Implementation B.[2] Ruby 2.2 is compatible with both Implementation A and Implementation B, it internally converts the conflictive characters to Implementation A.
你读了吗?我再重复一遍:.Net Framework 使用的是实现 A,Java 使用的是实现 B。
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
¨Æ¨É¨Ê¨Ë^¨Ì¨Í¨Ð¨Ó^¨Ö¨à¨â¨ä