2011-02-24 61 views
2

我们有一个用.NET 4.0编写的网站和WinForms应用程序,允许用户输入任何Unicode字符(非常标准)。如何检测.NET 4.0中的EBCDIC是否支持Unicode字符?

问题是我们的少量数据被提交给旧的大型机应用程序。当我们测试一个用户输入了一个字符的名字时,会导致大型机程序崩溃。名字是BOËNS。 E不支持。

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

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

我宁愿使用一种方法来验证每个字符,或者只是在字符串中传递一个方法,如果字符串中包含不支持的字符,则返回true或false。

回答

0

您可以使用\在Regex中转义字符。所以如果你想匹配一个点,你可以做@"\."。要匹配/._,:[]-例如:@"[/._,:\-\[\]]。现在,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

首先,您必须为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

+0

好的......现在简单的一个...... EBCDIC的编码实例在哪里? – xanatos 2011-02-24 19:56:38

+0

EBCDIC没有.NET编码实例。 – 2011-02-24 20:55:48

+0

@Jim Mischel @xanatos:不,没有,EBCDIC是代码页。这就是为什么我链接到以代码页作为参数的GetEncoding方法(有超过30个EBCDIC代码页的代码页ID列表)。 – casperOne 2011-02-24 22:01:15