며칠 전에 NBSP가 space인가 아닌가에 대해서 얘기를 좀 했었는데, 이 문제가 아무래도 불거지게 된 것은 BSD Rune Locale의 isctype 함수들의 특성 때문이었습니다. BSD Rune은 4.4BSD 시절에 생겨난 것으로, POSIX Locale가 만들어지기 이전부터 디자인된 멀티바이트 캐릭터셋 API이기 때문에, 그 이후 POSIX Locale 스펙과 맞지 않는 점이 있습니다. 바로, POSIX에서는 isspace, isalpha같은 ctype함수들을 싱글 바이트로 표현할 수 있는 코드포인트들로 제한을 하고 있지만, Rune에서는 iswctype이 도입된지도 얼마 되지 않았고 그냥 isctype 함수들이 wide character 코드포인트까지 모두 담당해버려서 결국 UTF-8 로캘같이 전체가 하나의 캐릭터셋이라서 싱글 바이트의 경우와 wide character가 겹쳐버리는 경우 잘못된 답이 나와버리는 것입니다.
구현
isspace(0xa0)
iswspace(0xa0)
isalpha(0xc0)
iswspace(0xc0)
BSD Rune
true
true
true
true
glibc
false
false
false
true
Solaris
false
true
false
true
올바른 답(POSIX/Unicode)
false
true
false
true
그래서 Tim에게 메일을 보냈더니 Rune과의 하위호환성을 5.x까지는 유지하겠다고 manpage에 써 놓아서 우선 바꾸지는 못 하지만, 6.x에서 고칠 수 있겠다는군요.. 그리고 manpage에 언급을 넣어 줘서 COMPATIBILITY에 이제 isctype에서 와이드 캐릭터 전영역을 커버하지 않도록 곧 수정될 수도 있다는 경고가 붙게 되었습니다. 그러면서 우선 버그를 피해갈 수 있는 방법을 하나 알려줬는데.. 이렇게 합니다 ;;
1 2 |
#undef isspace #define isspace(x) isspace(btowc(x)) |
흐흐;; 우선 파이썬 포트와 파이썬 2.4 트렁크에 해당 패치를 넣으려고 합니다.
구독완료 ㅋ
eee pc도 지르세요! ^^