[완료] unicode 관련 질문입니다.

kite7의 이미지

근래에 application 코딩을 할일이 있었는데요 문자열 처리가 필요했었습니다.
지금까지 확인을 해본 결과 제가 이해한 바로는.

1. unicode는 국제 표준기구(컨소시엄?)에서 구성한 일종의 문자열 목록표(테이블)일 뿐이다. 
   (euc-kr, cp949 도 한국이나 ms에서 만든 문자 구성표 일 뿐이다)
 
2. unicode 테이블을 실제 사용하는 환경에 따라서 저장하고 다룰때 쓰는 인코딩 방식이 UTF-* UCS... 등과 같은 것이다.
   - 한글의 '가' 가 예를들어 unicode 테이블에서 0x6789ABCD 라면 예를들어.
     표현을 0xf006 0xf789A 0x0BCD  로  하거나 
            0xfDCB 0xfA987 0x0600  으로 하거나 구현의 차이일 뿐이다.
            (0xf 는 뒤에 연결되는 문자정보가 있을 경우를 뜻함.)
 
3. 리눅스나 웹 환경에서는 UTF-8이 주로 쓰이는 것을 보면 앞으로는 UTF-8이 대세이다. 
 
4. Multibyte character 라고 하는 것은 일반적으로 한 문자를 표현하는데 1바이트에서 수바이트까지 가변적으로
   변화하는 것을 말한다.
   (UTF-8 도 이렇다고 알고 있습니다.)
   Wide character는 한 문자를 표현하는데 1바이트가 아닌 모든 방식을 통칭하는 것이다. 
   (multi byte character  방식도 결국 wide character 의 범주에 들어간다고 볼수 있겠다)

위의 내용이 어느정도 맞는지 확인을 하고 싶습니다.

그리고 윈도우 메모장에서 저장 인코딩을 보면 ASCII, UTF-8, 유니코드, 유니코드(빅엔디안) 이 있습니다. 
궁금한것은 unicode로 저장을 하면 어느 인코딩으로 저장이 되는 것인지 궁금합디다.
(추리해봤을때는 unicode table에 있는 비트열을 고정 길이 4바이트로 저장하는 방식이 아닐까 .... )

음 여러 자료 찾아봤는데 이해가 된 부분만 정리하면 이정도였습니다.
확실하게 개념을 가지고 계신 분들의 조언 부탁드리겠습니다.

hayarobi의 이미지

리틀엔디안의 UCS-2을 뜻합니다. 그렇기 때문에 옵션에 유니코드(빅엔디안)만 있고 유니코드(리틀엔디안)은 없죠.

유니코드의 기본 문자셋은 2바이트 크기 안에 있습니다. 한글도 그 안에 들어가 있습니다.
- 한글의 '가' 가 예를들어 unicode 테이블에서 0xABCD 라면
UCS-2 BigEndian은 0xAB 0xCD 로 저장하고
UCS-2 LittleEndian은 0xCD 0xAB 로 저장합니다.
UTF-8은 좀 계산을 해야한는데 0xABCD는 이진수로 0b1010101111001101 이고 이것은 UTF-8에서 아마도 0b11101010 0b10101111 0b10001101 이렇게 세 바이트로 쪼개져서 들어갈 것으로 예상됩니다.

---------- 시그 *****
저도 세벌식을 씁니다.
M$윈도우즈, 리눅스, 맥 오에스 텐, 맥 오에스 클래식을 모두 엔드유저 수준으로 쓴답니다.
http://psg9.egloos.com

=================
잠못자는 한솔아빠

cppig1995의 이미지

0x33 차이 나셨군요. 사실 0xAC00입니다. (어차피 예제이므로 별 의미 없지만서도.)
근데 UTF-16 아니었나요? 설마 메모장이 BMP 바깥의 문자들을 처리 못하게 만들진 않았을텐데...

* UCS는 문자셋이지 인코딩이 아니므로 UCS-2BE나 UCS-2LE란 말은 의미가 없습니다. :)



"그거 이름은 하늘이라고 합니다. 무사장님." - 제국군 가시나무 군단 312소대장 틸러 달비 부위
http://cppig1995.n-pure.net/mh || 몽화 대사전

Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.

Necromancer의 이미지

utf16은 상위대행코드와 하위대행코드 조합으로 BMP 바깥 문자를 표현합니다. 이경우 2바이트 2개가 1개 문자를 이루죠.

Written By the Black Knight of Destruction

Written By the Black Knight of Destruction

cppig1995의 이미지

UCS-2는 BMP 바깥을 표현할 수 없다는 얘기였고, 말씀하신 서로게이트 개념에 대해서는 알고 있습니다. :)



"그거 이름은 하늘이라고 합니다. 무사장님." - 제국군 가시나무 군단 312소대장 틸러 달비 부위
http://cppig1995.n-pure.net/mh || 몽화 대사전

Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.

오호라의 이미지

왠만한 에디터는 믿을게 못됩니다. MS의 메모장같은 경우는 윗분이 말씀하신 것처럼 표현(?)을 이상하게 하죠.

제일 좋은건 hexdump를 해서 BOM을 확인하시는게 좋습니다. 위키피디아에서 comparison edit 검색해보시면 에디터마다 지원되는 encoding을 보실수 있습니다.

edit 와 view 는 가려야써야 합니다.

Hello World.

마잇의 이미지

유니코드가 대세가 된 이유로는,

기존의 언어별 문자셋으로 작성된 파일을 마주쳤을 때 어떤 인코딩으로 해석해야 할 지 정확히 알 수 없다. 인코딩 정보를 모르는 파일을 마주쳤을 때는 불완전한 추측을 할 수 밖에 없다.

다국어를 한 문서(파일)안에 표현할 수 없다.

이 정도로 알고 있습니다.

유니코드를 표현하기 위한 인코딩 중 utf-8은 ascii? iso-8859-1?(정확히 뭔지 모르겠군요)인코딩과 호환된다. 저 영역에 해당하는 글자들을 입력후 utf-8로 저장하면 완전히 똑같다. 이렇다더군요. 그래서 적어도 저런 인코딩은 변환이 필요 없으므로 널리 쓰였겠구나 하고 짐작을 합니다.
--
마잇


--
마잇

kite7의 이미지

메모장에서 유니코드로 저장시 사용되는 UCS2 라는 포맷은 생소하지만.. 고정폭이라는 것도 알았구요
UCS4 포맷은 4바이트 고정폭인것 같군요.
UTF32가 사실상 UCS4랑 비슷한 것으로 인식하고 있습니다. -_-..

int main(void)
{
    int fd;
    setlocale(LC_CTYPE, "");  // 이렇게 쓰면 실행환경의 로케일에 맞춰서 저장하더군요. ko_KR.UTF-8 하면 UTF8로 저장
    wchar_t wbuf[] = L"안녕하세요";
    char mbuf[100];
 
    wcstombs(mbuf, wbuf, sizeof(mbuf));  // wide character를 setlocale 에서 설정한 로케일의 멀티바이트(utf8 포함)로 바꿔줍니다 (윈도에서도 잘 동작하는군요)
 
    wprintf(L"%s\n", wbuf);
    fd = open("data.txt", O_WRONLY | O_TRUNC | O_CREAT, 0666);
    write(fd, mbuf, strlen(mbuf));
    close(fd);
 
    return 0;
}
cppig1995의 이미지

UCS-2는 고정폭이지만, 메모장은 UCS-2를 사용하지 않습니다.
아래에 링크된 김진숙님의 입문서를 보시면 언어판(planes) 개념과 UCS-2와 UTF-16의 차이에 대해 잘 설명하고 있으며,
UCS-2는 group 00, plane 00의 BMP에 속한 65,536개 문자에 대해서만 사용할 수 있다고 이해해 두시면 편할 것입니다.
(사실 UCS-2는 인코딩이 아니라 문자집합 그 자체입니다. UCS는 Unicode Character Set이죠.)
반면, UTF-16은 surrogate pair라는 방법을 이용해 BMP 바깥의 문자들을 표현합니다.
(참고로 UTF는 Unicode Transmission Format인가? 그럴겁니다.)

또한, UTF-32=UCS-4는 성립한다고 알아두시면 될 것입니다.



"그거 이름은 하늘이라고 합니다. 무사장님." - 제국군 가시나무 군단 312소대장 틸러 달비 부위
http://cppig1995.n-pure.net/mh || 몽화 대사전

Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.

Necromancer의 이미지

유니코드에 대한 소개는 아래서 볼 수 있습니다.

http://www.kristalinfo.com/K-Lab/unicode/Unicode_intro-kr.html

위 내용 숙지하신뒤에 unicode.org에서 문서 받아 보시면 내용이 다 이해가 갈겁니다.

Written By the Black Knight of Destruction

Written By the Black Knight of Destruction

kite7의 이미지

링크 감사합니다.
unicode.org는 아직 보지 않았으나.. (아직도 영어 포비아가,, )
이해가 많이 됐네요.
구글링 실력을 더 쌓아야 할듯.

M.W.Park의 이미지

링크 감사++;

예전에 북마크했던 곳은 연결이 안되서 아주 궁금해 하던 차에 옮겨진 페이지를 알려주셔서 정말 감사합니다.

-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

cppig1995의 이미지

후위 증가 연산자를 사용하시면, 감사의 마음이 제대로 전달되지 않으므로 전위 연산자를 사용하세요.
(농담인 거 아시죠?)

비슷한 얘기로 "C++를 쓴다." = "여전히 C를 쓴다."라는 joke도 있었죠.



"그거 이름은 하늘이라고 합니다. 무사장님." - 제국군 가시나무 군단 312소대장 틸러 달비 부위
http://cppig1995.n-pure.net/mh || 몽화 대사전

Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.

M.W.Park의 이미지

링크를 받기도 에 감사하란 말입니까?
받고난 에 감사하다는 저의 정확한 의도가 표현된 구문이므로 딴지걸지 마십시오. ㅋㅋㅋ
-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.