2011-05-02 3 views
0

나는 isAlpha에 대한 룩업 테이블을 가지고있다. isalphaLUT는 문자 배열 ... 문제이다ASCII 범위 외부의 문자 다루기

for (int i = 0; i <= UCHAR_MAX; ++i) 
p.isalphaLUT[i] = isalpha(i); 

(나는 등가 ASCII 값을 얻기 위해 시도 할 때 4,294,967,168 인쇄) isalphaLUT는 [i]는 i가 ASCII 범위를 벗어나는 문자 곳이다. 127 이상의 모든 ASCII 범위를 0으로 설정하려고 시도했지만 작동하지 않습니다. 문제의 캐릭터는 ö입니다.

+3

아스키 범위는 [0, 127]이고,하지 [0, 255]. – jamesdlin

+0

나는 ASCII [0,255]에 관심이있다. 그 순간에 ö는 0에서 255까지의 ASCII 범위에 있어야합니다. 그러나 상응하는 값을 인쇄하려고하면 무의미한 숫자가 나오고 isalphaLUT [i]는 어디에서 거짓인지를 반환 할 때 true를 반환합니다. – Jake

+1

ASCII 0..255가 아니라 0..127입니다. jamesdlin이 옳습니다. –

답변

2

문자가 문자인지 테스트하는 올바른 방법은 문자 유형이 Lu, Ll, Lt, Lm 또는 Lo 중 하나인지 테스트하는 것입니다. IBM의 ICU 라이브러리를 사용하여 유니 코드를 처리 할 수있는 매우 인기있는 라이브러리입니다.

http://icu-project.org/apiref/icu4c/uchar_8h.html

는 또한 문자의 범주를 결정하는 u_charType을 직접 ICU에서 u_isalpha 기능을 사용하거나 할 수 있습니다. 유니 코드에는 영문자가 아닌 "문자"(중국어 문자 등)가 많이 있기 때문에 "문자"라는 용어가 "알파"보다 선호됩니다.

그러나 먼저 문자를 디코딩해야합니다. char 배열을 사용하는 경우 인코딩은 ASCII, LATIN-1, Windows 1252, UTF-8 또는 기타 다른 인코딩 일 수 있습니다. char에 직접 액세스하면 플랫폼에 따라 서명되거나 서명되지 않을 수 있습니다. 4294967168과 같이 분명히 잘못된 번호가 표시되는 이유는 0x80이 부호가있는 char으로 해석 될 때 발생하는 것입니다. unsigned int로 전송하십시오.

테이블이 너무 커서 - 약 700k가되어야하므로 조회 테이블을 사용하는 것은 매우 좋지 않습니다. 대신 ICU를 사용하거나 문자 범위 테이블을 만들고이 테이블에서 이진 검색을 수행하는 것이 좋습니다. 이것은 매우 효율적일 수 있습니다.

저는 이러한 종류의 테이블을 정확하게 생성하기위한 도구를 만들고 있습니다. 이 도구는 현재 프로덕션을 위해 준비가되어 있지 않지만 모험심이 있다면 사용할 수 있으며 README에는 사용 방법의 예가 나와 있습니다.

https://github.com/depp/uniset

0

문자를 배열에 사용하기 전에 문자의 값이 범위 내에 있는지 확인하는 것은 어떻습니까? "모든 아스키 범위"를 255 이상으로 설정하면 (이것은 이해가되지 않습니다. 필자가 들었던 모든 ASCII 정의가 싱글 바이트 인코딩입니다) 결과적으로 룩업 테이블이 커집니다.

또한 ö은 실제로 영문자입니다. 왜 그걸 처리하고 싶지 않니?

0

기본 로켈을 사용하고 있다고 가정하면 isalpha() 함수는 A-Z 및 a-z 문자에 대해 true를 반환합니다. 다른 어떤 것이라도 false를 반환합니다. 이 점을 계속 추구하려면 문자 인코딩 (ASCII가 실제로 의미하는 것과 같은)과 로케일을 이해해야합니다.

관련 문제