我们有一个用.NET 4.0编写的网站和WinForms应用程序,允许用户输入任何Unicode字符(非常标准)。
问题在于我们将少量数据提交给旧的大型机应用程序。当我们测试时,用户输入了一个带有字符的名称,最终导致大型机程序崩溃。这个名字是BOËNS。不支持E.
检测EBCDIC是否支持unicode char的最佳方法是什么?
我尝试使用以下正则表达式,但限制了一些标准的特殊字符(/,_,:),这对于大型机来说很好。
我更喜欢使用一种方法来验证每个char或者只是一个字符串传递的方法,如果strig中包含不受EBCDIC支持的字符,则返回true或false。
答案 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 ¢.<(+&!$*);¬/|,%_>?`:#@'=~{}\-\\" + '"');
m1
是false
(它是所有“好”字符的列表),m2
是true
(在另一个列表中我添加了€
1}}符号)