EUC-KR을 UTF-8로 변경할때 사이즈 늘어나는걸 예측할 수 있나요?

superkkt의 이미지

EUC-KR로 인코딩된 문자열을 UTF-8로 변경할때 증가되는 사이즈를 예측할 수 있나요?

iconv 예제를 찾아보니 strlen(기존문자열) * 2 + 1 사이즈로 output buf를 만들던데 제가 테스트 해보니 문자열에 따라 증가되는 사이즈가 틀리게 나옵니다. 2배가 되는 경우는 없었는데 예제 코드에서는 사이즈 예측이 불가능해서 안전하게 2배의 버퍼를 잡아주는건가요?

Necromancer의 이미지

영문 알파벳의 경우 1바이트 그대로고, (0~0x7f 코드까지만)
독일어 등등이 위치하는 코드는 1바이트에서 2바이트로 늘어납니다.
한글의 경우 2바이트에서 3바이트로 늘어납니다.

코드 값에 따라 늘어나는 양이 달라지지요.

대충 2배의 버퍼를 잡는 이유는 매 글자를 다 확인하는 부담을
줄이기 위해서겠죠.

Written By the Black Knight of Destruction

Written By the Black Knight of Destruction

lifthrasiir의 이미지

상한선은 1.5배입니다. 즉 50% 이상 늘어 나지 않습니다. 이렇게 되는 이유는 euc-kr(cp949도 포함)에 들어 있는 모든 문자들이 모두 BMP(Basic Multilingual Plane, U+0000..FFFF) 안에 있기 때문입니다. (더군다나 U+007F 윗쪽의 모든 문자들은 euc-kr에서 2바이트입니다.) 물론 다 확인하는 것보다 대략의 상한선을 잡는 것이 더 빠르기 때문에 저렇게 하는 것이겠지만요.

- 토끼군

superkkt의 이미지

그렇군요.. 지금 UTF-8에 관련된 정보를 위키피디아에서 보고있습니다. BMP 밖의 문자는 4바이트를 다 사용한다고 되어있는데 BMP 밖의 문자는 뭐가 있나요?

======================
BLOG : http://superkkt.com

lifthrasiir의 이미지

유니코드는 현재 17개의 plane(65536개의 문자를 한꺼번에 묶어서 이르는 말)으로 이루어져 있고, 맨 첫 plane을 plane 0, 그 다음을 plane 1, ..., 마지막은 plane 16으로 부릅니다. 이 말은, 마지막 코드가 U+10FFFF라는 소리겠죠.

  • plane 0(U+FFFF까지)가 우리가 보통 쓰는 BMP이고, 거의 대부분의 문자 생활은 여기서 이루어진다고 보면 됩니다. BMP는 현재 95% 이상이 차 있고 몇몇 빠진 문자들에 대한 추가만 이루어지고 있습니다.
  • plane 1은 SMP로 일반적으로 많이 사용되지 않는 보조 문자들, 즉 역사적으로 쓰였으나 지금은 안 쓰이는 문자(Linear B 따위)나 음악 부호 같은 게 들어 갑니다. 아직 빈 부분이 엄청나게 많은데 아마 앞으로 가장 활발하게 문자들이 추가될 plane이 아닐까 싶습니다. -,.-
  • plane 2는 SIP로 ideographic character(= 한자)들만 잔뜩 모아 놓은 plane입니다. 옛날에 사용되던 한자 같은 것들이 마구 들어 가는데 65% 정도 차 있으나 앞으로 계속 늘어 날 것 같습니다. (상황을 보아 하니 SIP2가 생길 지도...)
  • plane 14는 SSP로 특수한 목적으로 사용되는 문자들을 모아 놓습니다. 현재 여기에는 tag character(U+E0000..E007F; plane text에 언어 정보 같은 특정한 tag를 달기 위한 문자)와 variation selector 확장(U+FE00..FE0F=VS1..16, U+E0100..E01EF=VS17..256; 의미는 같은데 문자 모양 같은 것만 다른 경우를 처리하기 위하여 사용하는 특수한 문자)만 들어 있고, 앞으로 별로 추가되지 않을 것 같습니다.
  • plane 15, 16은 사용자 정의 영역 확장입니다.
  • 이 뒤의 문자는 유니코드에서 유효하지 않습니다. (plane 17 같은 거 없다는 소립니다) utf-8은 RFC 나오기 전까지는 5바이트, 6바이트 인코딩을 지원해서 U+7FFFFFFF까지 지원했는데 RFC가 2003년인가에 나온 뒤로는 유니코드에 없는 U+10FFFF 바깥의 문자는 인코딩하지 못하게 해서 모든 문자를 4바이트 이하로 인코딩할 수 있게 되었습니다.

실제로 우리가 보통 쓰는 문자는 BMP 안에 다 있을 수 밖에 없기 때문에 (처음에 유니코드에 한자가 들어 간 게 레거시 인코딩을 기반으로 들어 간 게 많아서...) 그 바깥은 보통 신경 안 써도 되긴 합니다. 위에서 말한 사용자 정의 영역이나 variation selector도 BMP 안에 그 앞부분이 찔끔 들어 가 있기도 하고요. -_-;

유니코드 로드맵에 보면 앞으로 어떤 문자들이 추가될 것인지 (또는 추가해 달라는 말이 나왔는지) 볼 수 있습니다. SMP는 차고 넘치고 SSP는 까마득하네요. -_-;

- 토끼군

댓글 달기

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