如何检测.NET 4.0中的EBCDIC是否支持Unicode字符?

时间:2011-02-24 19:30:39

标签: unicode .net-4.0 ebcdic

我们有一个用.NET 4.0编写的网站和WinForms应用程序,允许用户输入任何Unicode字符(非常标准)。

问题在于我们将少量数据提交给旧的大型机应用程序。当我们测试时,用户输入了一个带有字符的名称,最终导致大型机程序崩溃。这个名字是BOËNS。不支持E.

检测EBCDIC是否支持unicode char的最佳方法是什么?

我尝试使用以下正则表达式,但限制了一些标准的特殊字符(/,_,:),这对于大型机来说很好。

我更喜欢使用一种方法来验证每个char或者只是一个字符串传递的方法,如果strig中包含不受EBCDIC支持的字符,则返回true或false。

2 个答案:

答案 0 :(得分:1)

首先,你必须为EBCDIC获得正确的Encoding instance,调用静态GetEncoding method,它将把代码页id作为参数。

完成后,您可以将DecoderFallback property设置为static ExceptionFallback property on the DecoderFallback class中的值。

然后,在您的代码中,您将遍历字符串中的每个字符并调用GetBytes方法将字符编码为字节序列。如果无法编码,则抛出DecoderFallbackException;你只需要在GetBytes块中将每个调用包装到try/catch以确定哪个字符出错。

注意,如果您想知道失败的角色的位置,则需要上述内容。如果你不关心角色的位置,只要字符串不会作为一个整体进行编码,那么你可以调用GetBytes method which takes a string parameter,如果一个字符,它将抛出相同的DecoderFallbackException遇到无法编码。

答案 1 :(得分:0)

您可以使用\转义正则表达式中的字符。因此,如果您想匹配一个点,您可以@"\."。要匹配/._,:[]-,例如:@"[/._,:\-\[\]]。现在,EBDIC是8位,但许多字符是控制字符。你有一个“有效”字符列表吗?

我制作了这种模式:

string pattern = @"[^a-zA-Z0-9 ¢.<(+&!$*);¬/|,%_>?`:#@'=~{}\-\\" + '"' + "]";

它应该找到“非法”字符。如果IsMatch则存在问题。

我用过这个:http://nemesis.lonestar.org/reference/telecom/codes/ebcdic.html

请注意"的特殊处理。我在字符串开头使用@来禁用\ escape expansion,所以我无法逃避结束语,所以我最后将它添加到模式中。

测试它:

Regex rx = new Regex(pattern);
bool m1 = rx.IsMatch(@"a-zA-Z0-9 ¢.<(+&!$*);¬/|,%_>?`:#@'=~{}\-\\" + '"');
bool m2 = rx.IsMatch(@"€a-zA-Z0-9 ¢.<(+&!$*);¬/|,%_>?`:#@'=~{}\-\\" + '"');

m1false(它是所有“好”字符的列表),m2true(在另一个列表中我添加了 1}}符号)