char로 utf8 형을 받을 수 있나요?

ljs0652의 이미지

UTF8이 유니코드로 알고 있는데요 유니코드는 2바이트라고 알고 있는데 CHAR로 받을 수가 있는건가요??

궁금한 이유는 제가 rapidjson이라는 것을 쓰려고 하는데

Document라는 걸 쓸때 설명에
typedef rapidjson::UTF8, rapidjson::MemoryPoolAllocator, rapidjson::CrtAlocator>rapidjson::Document ! GenericDocument with UTF8 encoding

이렇게 되어있어서요 실제로 데이터를 char 배열로 받기두 하구요

익명 사용자의 이미지

유니코드는 2바이트라고 알고 있는데

아닙니다.

세벌의 이미지

Anonymouse의 이미지

"받을 수 있나?" 라고 하는 질문은 굉장히 모호한 질문입니다.
엄밀히 말해서 1바이트 이상이기만 하면 당연히 char 은 무엇이든 저장합니다.

다만 wchar_t 와 같은 widechar 타입이 있는 건 스트링 처리에 있어서
2바이트 이상의 단위를 char 로 처리하자니 여러모로 불편할 수 밖에 없기 때문에
별도의 타입을 만들어놓은 것입니다.

그리고 유니코드 자체는 별 희한한 문자들을 다 포함하기 때문에, 당연히
현재까지의 유니코드 평면은 2바이트(65536) 범위를 이미 넘었습니다.
중간 중간에 비어있는 것도 있지만, 사실 한자+한글만 해도 이미 3만자가
넘기 때문에 당연하다면 당연합니다.

유니코드 자체는 한 문자에 몇 바이트라고 표현하지 않습니다.
이 문자들을 어떻게 인코딩하여 나타낼지에 대해서 우리가 흔히 말하는
UTF-8, UTF-16, UTF-32 등의 인코딩 종류가 있는 것입니다.

UTF-8 의 경우 기존 ASCII 와 호환을 위해서 0x7F 까지만 1바이트로 표현하고
그 외에는 각각 별도로 범위를 정해서 2, 3, 4바이트 등으로 표현합니다.
UTF-16 은 기본 다국어 평면(BMP) 은 2바이트, 그 외에 4바이트로 표현합니다.
기타 다른 인코딩들도 비슷하게 그 나름의 규칙을 갖고 표현합니다.

그래서 정확히는 유니코드가 몇 바이트라고 하는 것이 아니라, 위에 언급한
특정 유니코드 인코딩에 대해 한 문자가 몇 바이트인지를 말해야 합니다.

그런데 질문자분과 같이 이에 대해 헷갈리는 경우가 꽤 생기는 이유는,
Windows 가 현재 기본으로 사용하는 UTF-16 에 대한 표현을 그냥 유니코드 라고
표시한 경우가 많은 것이 이유 중 하나라고 생각합니다. 가령 메모장에서
파일을 저장할 때, 인코딩에 유니코드(Unicode) 가 있는데 이는 정확히는
UTF-16 인코딩으로 저장하는 것을 말하는 것입니다.
(사실상 Windows API 등에서 유니코드 라고 하면 UTF-16 으로 이해해야 합니다.
물론 Windows 2000 이전에는 UCS-2 였지만 BMP 뒤의 평면을 제외하면 같은 거라.)

설명이 조금 장황해졌는데, 질문으로 돌아가서 UTF-8 은 위에서 언급했다시피
가변 길이 인코딩이고 1바이트 ~ 4바이트 까지 가변적인 길이를 갖습니다.
이 말은 2바이트 이상의 단위로 저장하면 여러모로 문제가 많아진다는 얘기입니다.
단적으로 아시겠지만 한글은 UTF-8 인코딩에서 3바이트를 차지하기 때문에
2바이트 타입으로 저장하면 문제가 많을 수 밖에 없습니다.

따라서 보통 UTF-8 의 경우 char 로 저장하는 경우가 많습니다.

Necromancer의 이미지

utf8은 1~6바이트까지 가변입니다.
받아서 ucs4(utf32)로 변환해야 문자를 색인할 수 있습니다.
변환 과정은 알면 의외로 간단합니다.

단 영문 알파벳이나 숫자만 들어온다는 전제 하에서는 그냥 char로 받아서 기존 ascii 문자열 다루듯이 처리해도 됩니다. utf8 중에서도 1byte로 표현가능한 것들은 ascii와 똑같습니다.

ucs4(utf32) 변환할때는 최상위 비트 쓰는일이 많기 때문에 char 보다는 unsigned char가 낫습니다.

Written By the Black Knight of Destruction

댓글 달기

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