首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ISO_IR 58在.Net 4.0中的支持

ISO_IR 58在.Net 4.0中的支持
EN

Stack Overflow用户
提问于 2015-09-17 21:50:42
回答 2查看 481关注 0票数 4

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

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

首先看一下ISO_IR 87的示例(ISO_IR 87在.Net中等于iso-2022-jp ):

代码语言:javascript
复制
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中的字符使用此代码:

代码语言:javascript
复制
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吗?有可能吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-18 20:29:10

ASCIIEncoding是一种7位编码,任何8位编码都不能用它来表示.因此出现了问号。

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

代码语言:javascript
复制
Encoding enc = Encoding.GetEncoding("gb2312");
byte[] bytes = enc.GetBytes("ㄆㄉㄊㄋ^ㄌㄍㄐㄓ^ㄖㄠㄢㄤ");

Encoding asc = Encoding.GetEncoding("iso-8859-1");
string astr = asc.GetString(bytes);

输出

代码语言:javascript
复制
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 
¨Æ¨É¨Ê¨Ë^¨Ì¨Í¨Ð¨Ó^¨Ö¨à¨â¨ä
票数 5
EN

Stack Overflow用户

发布于 2015-09-18 04:16:09

通过对编码的研究,IANAISO-IR-58映射到GB_2312-80而不是GB2312.Net框架映射到x- in 20936< code >E29,代码页E 11020936E 211。如果是这样的话,您需要使用:

代码语言:javascript
复制
Encoding.GetEncoding("x-cp20936");

代码语言:javascript
复制
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维基百科页面,这是您认为正确的编码。下面是在这个页面上要注意的几点重要内容:

  • GB2312 (1980)开始。好吧,等一下。这就是GB_2312-80编码的真正含义吗?如果是的话,那么我们回到IANA最初告诉我们的,上面提到的代码就是要走的路。
  • 然后它继续说已经被英国政府和GB18030所取代。嗯,.Net框架没有GBK编码,但是它有带有代码页54936GB18030。我不认为这是你应该使用的,但如果其他编码对你不起作用,这是值得一试的。
  • 然后,如果滚动到 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。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32640528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档