NBSP는 스페이스인가 아닌가!

FreeBSD의 파이썬에서 UTF-8로 로캘을 설정하고 나서, str.split()을 하면 0xa0이 중간에 끼여 들어가 있으면 막 글자 중간에서 짤려서 결국은 invalid seq를 생성해내는 문제가 있습니다.

리눅스에서 테스트를 해 보면 제대로 나오는게 자세히 보니까 이런 리눅스에서는 isspace(0xa0)이 0이군요.. BSD에서는 ISO8859-1과 UTF-8 로캘 모두 1이 나오고..

그런데, 또 재미있는 것은 파이썬에서는 \u00a0이 space입니다 –;

BSD와 마찬가지로 UnicodeData.txt에서 그대로 생성했기 때문에 그런 것인데.. 과연 NBSP가 스페이스는 스페이스니까 스페이스로 인정을 할 것인지.. 브레이크 없는 스페이스니까 스페이스가 아니라고 해야할 것인지 생각을 하면 할 수록 헷갈리는데 우에에.. 분명히 파이썬과 BSD의 locale 중의 하나를 고쳐야할 터인데 뭘 고쳐야할 지 모르겠군요. –; SUS는 봐도 도움도 안되게 간략하게 나와있고..

(소식: 오늘 ftp.unicode.org 를 둘러보다보니 Unicode 4.1이 슬슬 올라오고 있네요.)

20 thoughts on “NBSP는 스페이스인가 아닌가!”

  1. isspace man page보니까..
    locale별로 isspace를 정의하는게 다르다고 되어있는것같은데(isalnum을 참조한다는듯) c locale에서는 0x09~0x0d와 0x20만 white-space로 본다는것 같은데…
    왜 UTF8로케일에서 0xa0를 space로 보는지 궁금합니다.
    iso-8859_1에서 0xa0에서 space로 보는건 맞는것 같고..
    당연히 UCS2에서 0x00a0로 space로 보는것 맞는것 같습니다만…

    isspace의 구현에 문제가 있는것일까요? -,-;; 긁적..

  2. 아아. BSD의 Rune locale (POSIX Locale보다 먼저 나온)은 wide character까지 모두 isspace 처리가 가능 하기 때문에 (다르게 말하면 isspace와 iswspace의 구분이 없기 때문에) BSD에서의 isspace(0xa0)이 리눅스의 iswspace(0xa0)인 셈입니다.
    UnicodeData에 따르면 0xa0도 space로 표시가 되어 있습니다만.. “NBSP” 자체의 정의가 space로 봐야할 지는 정말 헷갈리네요 –;

  3. 어떤코드를 space로 볼것이냐 말것이냐는… 그냥 정하기 나름이 아닐까요… UCS2상의 0x00a0에 대해서 UnicodeData.txt에 space로 표시되어있다면, space로 처리하는것이 좋지 않을까요…
    isalnum에서… 문자들에 기록되어있는것이 아니면, 다 space로 볼수도 있단 말 아닐까요 -,-;; 긁적긁적.. (해석이 안되서 므흣..)

    근데.. UnicodeData.txt 다운받아서 0x09~0x0d, 0x20, 0x30~0x31, 0xa0 부분을 띄어다가 확인해봤는데… 어느색션이 space인지 구분하는지를 모르겠어요.. -,-;;;

    또한가지는 split()를 실행할때 UTF8 의 locale이라면, UCS2나 UCS4의 해당코드를 찾아서 변환한후 isspace인가를 확인해야 되지 않나요?
    (UnicodeData.txt에서 isspace에 적절한 list를 뽑았다고 했을때…)

    #ifdef BlahBlah_Locale
    #define isspace(a) ( (a == 0x20) || (a>=0x09 && a<=0x0d) || ( a == … ) || …. )
    #endif

    이런식으로 재정의되어있을듯한데 말이죠…
    (문득.. 헛다리 짚는다는 생각이 들기 시작한다 -,-;; )

  4. 스페이스인지 아닌지는 카테고리가 Zs면 스페이스이고 아니면 스페이스가 아닙니다. Z클래스는 사실 모두 separator이기 때문에 split에서 짤라주는게 좋긴 한데.. 흐흐.
    isspace는 로캘에 따라 달라지는 테이블 기반이라 보통은 매크로로 인라인을 선언하고 그 인라인 함수에서 전역변수를 액세스하는 방법을 많이 씁니다. ‘o’;

  5. NBSP는 자꾸 “non-backspace”로 읽혀서 헷갈리는군요. 백스페이스가 아닌 건 분명한데… 🙂

  6. “-y”는 귀여운 이미지니 과감하게 맨 끝에 y를 빼세요! 그럼 fuck군?? -_-;;; (영문이름을 제맘대로 생각했어요 ㅎㅎ)

Comments are closed.