확장 문자(wide character) 질문입니다.

bureokjam의 이미지

다음은 C언어 펀더멘탈이라는 책의 일부 내용(p.112)을 발췌한 것입니다.


아무리 확장 문자를 단일 문자처럼 잘 다룰 수 있다고 해도 입출력이나 파일로 저장할 때는(사실 파일로 저장하는 것 역시 출력의 일종이다) 바이트 단위여야 한다. 외부 세계와는 바이트 단위로 정보를 주고 받는다. 따라서 외부와의 입출력을 위해 (내부적으로는 어디까지나 한 바이트처럼 하나의 기본단위로 다루어지는) 확장 문자를 반드시 바이트로 다뤄야 한다. 물론 바이트보다 큰 단위로 다루어지는 문자(샤실상 코드값)를 단일 바이트 안으로 구겨넣는 것은 말이 안된다. 따라서 적절한 약속과 조합(이것을 '인코딩'이라고 한다)을 결정해서 여러 개의 바이트가 확장 문자 하나와 대응관계를 맺도록 만들어 이 문제를 해결하였다.


1) C에서 요구하는 기본적인 문자 외에 바이트보다 큰 단위를 사용해 다루는 문자를 '확장 문자(wide character)'라고 합니다. 그런데 위에서 말하길, 확장 문자는 입출력의 경우 바이트 단위여야 한다고 말합니다. 궁금한 것은 이미 확장 문자는 (정의를 빌려서) 바이트보다 큰 단위의 문자인데 바이트 단위여야 한다는게 무슨 의미인가요? 여기서 말하는 바이트 단위는 단순히 바이트를 말하는 건가요? (확장 문자는 바이트 단위여야 한다, 바이트로 다뤄야 한다는 두 표현의 관계가 혼란스러워 질문 드렸습니다.)


2) 역시 발췌한 내용중 확장 문자(사실상 코드값)를 단일바이트 안으로 구겨넣는 것은 말이 안된다고 합니다. 그리고는 이 문제를 인코딩을 통해서 해결하였다고 했습니다. 그럼 확장 문자는 입출력의 경우 결국 바이트로 다뤄지는게 맞는건가요? 그리고 인코딩을 거치면 여러 바이트를 하나의 바이트로 다룰 수 있는건가요?

익명 사용자의 이미지

제가 질문자께서 인용글을 읽어봤을때, 질문자님이 '확장문자만이 바이트 단위로 입출력해야 한다'로 오해해서 이해하신거 같습니다.
컴퓨터의 모든 것은 바이트단위로 입출력해야하겠지요.
확장문자(유니코드 등)도 마찬가지고 기본문자(아스키 문자집합)도 입출력할때는 바이트 단위로 해야합니다.
다만 기본문자집합(아스키문자 집합?)은 단일문자에 대응하는 바이트가 1byte 이므로 입출력시 1byte 단위로 주고 받으면 됩니다.
하지만 확장문자집합(유니코드) 같은 경우 기본적으로 2byte 입니다. 인용글에서는 wchar_t 나 short 같은 타입을 써서 2byte를 단일문자처럼 처리할 수 있더라도 입출력시에는 2byte를 1byte 단위로 구겨넣을 수는 없다.. 정도로 이해해야 할 거 같습니다.
문제는 유니코드가 2byte로만 되어 있지 않다는거죠. 최대 4바이트까지 필요합니다. 대부분의 단일문자는 유니코드로 2byte면 충분하지만 상형문자 같은 잘쓰이지 않는 문자는 4바이트까지 써야합니다. 따라서 파일에 문자를 바이트 단위로 저장할 때에는 한글자를 읽는데 몇바이트를 읽어야하는지 알아낼 수 있는 방식이 필요한데 이를 '적절한 약속과 조합' - 인코딩이라고 한다로 이해하면 될 거 같습니다. uft8 인코딩의 경우 한글 한글자를 저장하는데 3byte가 필요한데 각각의 바이트에 '이글자는 앞으로 3바이트를 읽어라'는 식의 정보가 포함되어 있습니다.

bureokjam의 이미지

문자와 관련해서 새로운 질문을 올렸는데, 여유가 되시면 읽어보시고 마찬가지로.. 도움좀 받을 수 있을까요?

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.