Как определить, поддерживается ли символ Unicode EBCDIC в .NET 4.0? - PullRequest
2 голосов
/ 24 февраля 2011

У нас есть веб-сайт и приложение WinForms, написанное на .NET 4.0, которое позволяет пользователям вводить любые символы Unicode (довольно стандартный).

Проблема в том, что небольшое количество наших данных передается старомуприложение для мэйнфреймов.Пока мы тестировали, пользователь вводил имя с символами, которые в итоге приводили к сбою программы мэйнфрейма.Имя было BOËNS.E не поддерживается.

Как лучше всего определить, поддерживается ли EBCDIC символ Юникода?

Я пытался использовать следующее регулярное выражение, но это ограничивало некоторые стандартные специальные символы (/, _, :), которые подходят для мэйнфреймов.

Я бы предпочел использовать один метод для проверки каждого символа или иметь метод, который вы только что передали в строке, и он вернул true или false, если в стриге содержались символы, не поддерживаемые EBCDIC.

Ответы [ 2 ]

1 голос
/ 24 февраля 2011

Во-первых, вы должны получить правильный экземпляр кодировки для EBCDIC, вызывая статический GetEncoding метод , который будет принимать идентификатор кодовой страницы в качестве параметра.

Получив это, вы можете установить для свойства DecoderFallback значение в свойстве static ExceptionFallback класса DecoderFallback .

Затем в своем коде вы должны пройти по каждому символу в вашей строке и вызвать метод GetBytes для кодирования символа в последовательности байтов. Если он не может быть закодирован, тогда выдается DecoderFallbackException; вам просто нужно заключить каждый вызов в GetBytes в блоке try/catch, чтобы определить, какой символ содержит ошибку.

Обратите внимание, что вышесказанное необходимо, если вы хотите узнать положение персонажа, который потерпел неудачу. Если вас не волнует положение символа, просто если строка не будет кодироваться как целое, тогда вы можете просто вызвать метод GetBytes, который принимает строковый параметр , и он выдаст то же самое DecoderFallbackException, если встречается символ, который не может быть закодирован.

0 голосов
/ 24 февраля 2011

Вы можете экранировать символы в регулярном выражении, используя \. Так что если вы хотите сопоставить точку, вы можете сделать @"\.". Для соответствия /._,:[]-, например: @"[/._,:\-\[\]]. Теперь 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 (к другому списку я добавил символ )

...