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);我只得到绳子:?
那么,DICOM ISO_IR 58使用.Net编码的答案是什么呢?我是否使用了错误的字符串进行编码?DICOM中的ISO_IR 58在.Net中不受支持吗?.Net中有bug吗?有可能吗?
发布于 2015-09-18 20:29:10
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
¨Æ¨É¨Ê¨Ë^¨Ì¨Í¨Ð¨Ó^¨Ö¨à¨â¨ä发布于 2015-09-18 04:16:09
通过对编码的研究,IANA将ISO-IR-58映射到GB_2312-80而不是GB2312,.Net框架映射到x- in 20936< code >E29,代码页E 11020936E 211。如果是这样的话,您需要使用:
Encoding.GetEncoding("x-cp20936");或
Encoding.GetEncoding(20936);当然,两者是相同的,所以您是否喜欢使用名称或代码页取决于您。
您提到了Java在GB2312中工作得很好,您认为这是ISO-IR-58的正确映射。这真的很有趣。有趣的是,根据ISO-2022-CN. DICOM (这个链接是MS Word文档),ISO_IR 58被映射到IANA 。这与IANA所说的相冲突,那么谁应该相信呢?好的,我们跟踪了上面的IAIA,我希望这会对你有用,但是现在让我们关注DICOM,看看它的发展方向。遗憾的是,在中没有编码,所以我们需要更多的研究。
根据维基百科,ISO-2022-CN编码可以从以下内容之一开始:
ESC $)A切换到GB2312-1980(每个字符2个字节)指定为G1 切换到指定给G1的CNS 11643-1992平面1(每个字符2个字节) ESC $*H切换到CNS 11643-1992平面2(每个字符2个字节)
您提到了Java返回的正确字符串是从ESC $ ) A开始的,因此我们将遵循第一个选项,它将导致GB2312维基百科页面,这是您认为正确的编码。下面是在这个页面上要注意的几点重要内容:
截至2015年,Microsoft使用的是实现A. .Net -1.14,php-5.6,ActivePerl-5.20,Java1.7,Python3.4正在使用实现B.2 Ruby2.2与实现A和实现B兼容,它内部将冲突字符转换为实现A。
你读过了吗?我将重复一遍:.Net框架使用的是实现A,Java使用的是实现B。
https://stackoverflow.com/questions/32640528
复制相似问题