2011-02-24 87 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