UTF-8
- 0xxx xxxx: 1Byte
- 110x xxxx 10xx xxxx: 2Byte
- 1110 xxxx 10xx xxxx 10xx xxxx: 3Byte
- 1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx: 4Byte
UTF8 은.. 위와 같은 규칙을 가지게 되는데.. (맨 앞에 나오는 1의 개수가.. 한 글자를 이루는 바이트 수) 심심해서.. utf8_get_next_char 을.. 손수 구현을 해보는 도중!! 아니 결과가 이상!!
“가” 라는 글자는.. UCS-2 로 표현하면.. 0xAC00 으로 표현되고.. 2진수로 바꾸면.. “B1010 1100 0000 0000″ 이며.. 이걸 UTF-8 로 변환하면.. “1110 1010 1011 0000 1000 0000″ 이 되므로 0xEAB080 이 되야 하는데.. 이게.. 아키텍쳐마다 결과가 달랐다.. 흑흑.. 저 순서로 되는게 더 편한데 ㅠ_ㅠ
aqua@unfix aqua $ echo 가|hexdump
0000000 b0ea 0a80
0000004aqua@Macintosh aqua $ echo 가|hexdump
0000000 eab0 800a
0000004
위의 unfix 머신은.. intel pentium 이고.. 아래 매킨토시라고 나오는 녀석은.. ppc :) 바이트 오더 차이가!! 꺄홋~! (0×0A는.. new line 이려나…) 그나저나 순서가 묘함;; -_-!!
January 14th, 2005 at 1:09 pm
hexdump가 결과를 다르게 보여주네요.
$ echo -n ‘가’ | xxd
0000000: eab0 80
요건 ppc랑 x86이랑 결과가 같거든요.
UCS2 라면 몰라도 utf-8이 바이트오더에 영향을 받다니, 라스베가스에선 상상도 할 수 없는 일이지요.
January 14th, 2005 at 9:50 pm
아하 :) 그렇군요.. xxd 같은 게 있을줄이야;; hexdump 문제네요 헤헤
September 15th, 2005 at 3:55 am
OS 마다 order 가 다른 것은 big endian 을 사용하느냐 little endian 을 사용하느냐의 차이로 알고 있습니다. 보통 UTF8BE 나 UTF8LE 에 붙은 BE 와 LE 가 bin endiab 과 little endian 의 약자죠.
September 15th, 2005 at 3:58 am
앙 실수가.. UTF8 에는 endian 이 없습니다. 내부적으로 unicode 로 판단할 때 endian 이 사용이 되어 집니다.
특정 문자열이 utf8 인지 euc-kr 인지 판단할 수 있는 방법을 googling 하다가 터무니 없는 글만 올리는 군요 ^^;
September 15th, 2005 at 11:03 am
utf-8 validation 을 해서 통과할 경우 utf-8 이라고 판단하고 실패할 경우엔 local charset 이라고 가정하는 방법도 괜찮을 듯 싶더군요.
아 그리고 BE는 bin endian 이 아니라 Big Endian 이에요. ucs_2, ucs_4 등으로 표시할 땐 BOM (Byte Order Mark) 을 붙이는 방법도 있구요
한가지 더! byte order 는 cpu 에서 지원하는 byte order 가 있어요. 예를 들면 x86 은 little Endian 이고 ppc 는 Big Endian, arm 은 두 가지 중에 원하는 걸 선택 가능… 뭐 이렇게요… OS 에서 매번 메모리에 접근할 때마다 byte order 를 바꿔야 하면 성능 저하가 심하기 때문에 그냥 CPU 에서 지원하는 걸로 쓸거에요 … 파일 시스템 같은 경우엔 OS 에서 (필요한 경우) byte order 를 바꿔주는 듯 하지만요 :D
September 15th, 2005 at 8:51 pm
맞아요. OS 별이 아니라 CPU 별이었죠. 저도 대충 알고 있는지라 어불 성설이 많군요 ^^;
흠 utf8 체크는 의외로 간단하군요. 문자열의 각 byte 를 2진수로 변환한 다음.. 첫 바이트의 2진수가 1이 3개 이상에서 7개일 경우 첫바이트의 1의 숫자 -1 만큼의 뒷 잘리가 10 으로 시작하는지를 체크하면 됩니다.
즉, 첫 바이트가 11110000 이면 2~4 byte 들은 10xxxxxx 이 되어야 한다는 말입니다. 첫 바이트가 110xxxx 일 경우 7bit 이면 alphabat 이고, 6bit 면 숫자이므로, 체크할 필요가 없죠. 이건 euc-kr 로 하든 utf8 로 하든 동일하니까.. :-)
졸지에 rfc 문서만 읽었네요 ^^;
September 15th, 2005 at 10:35 pm
http://b.mytears.org/2005/01/25/
올해 초에 관련해서 정리하다 만 글이 있어서 링크 겁니다 :) 그나저나 kldp 가 안되니까 대빵 심심하네요 ㅠ0ㅠ
그리고 utf-8 validation 관련된 코드는… glib 에 보면 간단한 매크로로 구현이 되어있으니 관심있으시면 참고해보셔도 좋겠네요… :)
validation 은 아니지만 utf-8 로 인코딩된 문자열을 글자 하나하나로 분해하는건 제가 php 로 구현해본 것도 있네요. (역시 glib 에 간단히 구현되어 있습니다) http://mytears.org/resources/mysrc/php/unicode/utf8.php