2011-02-24 5 views
2

우리는 .NET 4.0으로 작성된 웹 사이트 및 WinForms 응용 프로그램을 사용하여 사용자가 모든 유니 코드 char (예쁜 표준)을 입력 할 수있게합니다..NET 4.0에서 EBCDIC가 유니 코드 char을 지원하는지 확인하는 방법은 무엇입니까?

문제는 소량의 데이터가 이전 메인 프레임 응용 프로그램에 제출된다는 것입니다. 테스트를 진행하는 동안 사용자는 메인 프레임 프로그램을 종료하는 문자로 이름을 입력했습니다. 이름은 BOËNS였습니다. E는 지원되지 않습니다.

유니 코드 문자가 EBCDIC에서 지원되는지 여부를 감지하는 가장 좋은 방법은 무엇입니까?

다음 일반 표현식을 사용해 보았지만 메인 프레임에서 사용할 수있는 몇 가지 표준 특수 문자 (/, _, :)를 제한했습니다.

하나의 메서드를 사용하여 각 char의 유효성을 검사하거나 방금 문자열을 전달한 메서드를 사용하는 것이 좋으며 EBCDIC에서 지원하지 않는 char이 strig에 포함되어 있으면 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이다 (I 추가 한 다른 목록에 기호), m2true입니다

1
(이것은 모든 "좋은"문자의 목록입니다)

먼저 코드 페이지 ID를 매개 변수로 사용하는 정적 GetEncoding method을 호출하여 EBCDIC에 대해 적절한 Encoding instance을 얻어야합니다.

일단 설정이 완료되면 DecoderFallback propertystatic ExceptionFallback property on the DecoderFallback class의 값으로 설정할 수 있습니다.

그런 다음 코드에서 문자열의 각 문자를 반복하고 GetBytes 메서드를 호출하여 문자를 바이트 시퀀스로 인코딩합니다. 인코딩 할 수없는 경우 DecoderFallbackException이 발생합니다. 에 대한 각 호출을 try/catch 블록에 랩핑하여 오류가있는 문자를 판별하면됩니다.

위의 내용은 실패한 문자의 위치를 ​​알고 싶을 때 필요합니다.문자의 위치를 ​​신경 쓰지 않는다면 문자열이 전체적으로 인코딩되지 않는다면 GetBytes method which takes a string parameter을 호출하면 인코딩 할 수없는 문자가 발생하면 DecoderFallbackException이 던져집니다.

+0

이제 단순한 ... EBCDIC의 인코딩 인스턴스는 어디에 있습니까? – xanatos

+0

EBCDIC에 대한 .NET 인코딩 인스턴스가 없습니다. –

+0

@ Jim Mischel @ xanatos : 아니요, EBCDIC는 코드 페이지입니다. 그래서 코드 페이지를 매개 변수로 사용하는 GetEncoding 메서드에 링크 된 이유가 여기에 있습니다 (30 개 이상의 EBCDIC 코드 페이지에 대한 코드 페이지 ID가있는 코드 페이지 목록 있음). – casperOne

관련 문제