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

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

>>> import locale 
>>> locale.setlocale(locale.LC_ALL, '')
'ko_KR.UTF-8'
>>> print repr('할'), '할'.split()
'\xed\x95\xa0' ['\xed\x95']

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

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

>>> u'\xa0'.isspace() 
True

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

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

댓글 6 개 | 트랙백 0 개 (보낼곳) | 태그 world


트랙백
트랙백이 없습니다.
댓글
끝과시작  ▒
isspace man page보니까..<br />
locale별로 isspace를 정의하는게 다르다고 되어있는것같은데(isalnum을 참조한다는듯) c locale에서는 0x09~0x0d와 0x20만 white-space로 본다는것 같은데...<br />
왜 UTF8로케일에서 0xa0를 space로 보는지 궁금합니다.<br />
iso-8859_1에서 0xa0에서 space로 보는건 맞는것 같고..<br />
당연히 UCS2에서 0x00a0로 space로 보는것 맞는것 같습니다만...<br />
<br />
isspace의 구현에 문제가 있는것일까요? -,-;; 긁적..
2004-07-21 18:52
퍼키  ▒
아아. BSD의 Rune locale (POSIX Locale보다 먼저 나온)은 wide character까지 모두 isspace 처리가 가능 하기 때문에 (다르게 말하면 isspace와 iswspace의 구분이 없기 때문에) BSD에서의 isspace(0xa0)이 리눅스의 iswspace(0xa0)인 셈입니다.<br />
UnicodeData에 따르면 0xa0도 space로 표시가 되어 있습니다만.. "NBSP" 자체의 정의가 space로 봐야할 지는 정말 헷갈리네요 --;
2004-07-21 19:31
퍼키  ▒
이리저리 생각해 보니 BSD의 버그인 것 같네요.. 패치하는 중.. 흐흐;;
2004-07-21 20:41
끝과시작  ▒
어떤코드를 space로 볼것이냐 말것이냐는... 그냥 정하기 나름이 아닐까요... UCS2상의 0x00a0에 대해서 UnicodeData.txt에 space로 표시되어있다면, space로 처리하는것이 좋지 않을까요...<br />
isalnum에서... 문자들에 기록되어있는것이 아니면, 다 space로 볼수도 있단 말 아닐까요 -,-;; 긁적긁적.. (해석이 안되서 므흣..)<br />
<br />
근데.. UnicodeData.txt 다운받아서 0x09~0x0d, 0x20, 0x30~0x31, 0xa0 부분을 띄어다가 확인해봤는데... 어느색션이 space인지 구분하는지를 모르겠어요.. -,-;;;<br />
<br />
또한가지는 split()를 실행할때 UTF8 의 locale이라면, UCS2나 UCS4의 해당코드를 찾아서 변환한후 isspace인가를 확인해야 되지 않나요? <br />
(UnicodeData.txt에서 isspace에 적절한 list를 뽑았다고 했을때...) <br />
<br />
#ifdef <em>BlahBlah_Locale</em><br />
#define isspace(a) ( (a == 0x20) || (a&gt;=0x09 &amp;&amp; a&lt;=0x0d) || ( a == ... ) || .... ) <br />
#endif<br />
<br />
이런식으로 재정의되어있을듯한데 말이죠...<br />
(문득.. 헛다리 짚는다는 생각이 들기 시작한다 -,-;; )
2004-07-22 00:35
퍼키  ▒
스페이스인지 아닌지는 카테고리가 Zs면 스페이스이고 아니면 스페이스가 아닙니다. Z클래스는 사실 모두 separator이기 때문에 split에서 짤라주는게 좋긴 한데.. 흐흐.<br />
isspace는 로캘에 따라 달라지는 테이블 기반이라 보통은 매크로로 인라인을 선언하고 그 인라인 함수에서 전역변수를 액세스하는 방법을 많이 씁니다. 'o';
2004-07-22 00:56
방준영  ▒
NBSP는 자꾸 "non-backspace"로 읽혀서 헷갈리는군요. 백스페이스가 아닌 건 분명한데... :-)
2004-07-26 09:43

글이 올라온 지 30일이 지나 새 댓글은 쓸 수 없습니다.

누구?

장혜식 (Hye-Shik Chang)
내일을 사랑하는 소년(!)

최근 댓글