리눅스/유닉스에서 UNICODE 로 코드하기.

bizzare의 이미지

윈도우에서는 Project Setting 에서
UNICODE 를 넣어주면..
금새 UNICODE를 지원하도록 코드를 할 수가 있는데..
유닉스/리눅스는 그게 아닌 것 같더군요.

또한 윈도우에서는
getcwd(~~)란 함수가 있으면
wchar를 위한 wgetcwd()도 존재하고

fopen 이 있으면 wfopen도 존재하는데

유닉스에서는 wgetcwd, wfopen이 없는 것 같더군요.

제가 잘 몰라서 그러는 것인지요?

유닉스/리눅스에서 유니코드 지원 프로그램을 만드는데 도움이 될만한 말씀 부탁드리겠습니다.

cinsk의 이미지

제가 아는 범위에서 말하면.

일단 wide character는 어떤 특정한 character set을 나타내도록 되어 있는 타입이 아닙니다. C 언어에서 multilingual environment를 제공하기 위해 제공하는 데이터 타입입니다. 따라서 wchar_t가 내부적으로 어떤 표현 방식을 쓰는지는 컴파일러에 따라 다릅니다. 물론 대부분 UTF-32와 같은 방식을 쓰기는 하지만, 항상 그렇다고 말할 수 있는 것은 아닙니다. 이런 이유에서 wide character type으로 데이터를 저장하는 것은 그리 좋은 방법이 아닙니다. 대개는 잘 알려진 character encoding으로 특별히 지정해서 저장하고, 프로그램 내부에서 wide character로 변경해서 쓰는 방식이 좋습니다. 같은 이유로 파일 이름을 wide character로 저장한다는 것은 넌센스입니다.

wide character를 처리할 수 있는 함수는 대부분 'w'가 함수 이름에 붙습니다. 예를 들면 getwc(), getwchar(), wprintf(), fgetwc, vwscanf()등..

그러나 ISO C 표준에는 wfopen()이라는 함수는 존재하지 않습니다. 파일 내용이 wide character로 되어 있다 하더라도, fopen()으로 엽니다. 일부 시스템에서 제공하는 wfopen()은 대개 "파일 이름이 wide character로 되어 있는 파일을 open한다"는 기능을 위한 것이지만, 앞에서 설명한 것처럼 wide character로 파일 이름을 저장한다는 것도 넌센스입니다. wfopen()을 제공하는 시스템에 익숙치 않아서 자세히는 모르겠지만, wide character로 (파일 이름이 아닌) 내용을 저장한 파일을 fopen()으로는 열 수 없고, wfopen()으로 열어야 한다면, 이것은 ISO C 표준에 일치하는 방법이 아닙니다.

따라서 같은 이유로, 현재 디렉토리 이름을 얻기 위한 wgetcwd()도 의미가 없습니다.

또다른 이유로, 다양한 파일 시스템을 쓰는 UNIX 또는 Linux에서, 파일 이름을 저장하는 encoding은 대개 file system에서 결정하므로, C 라이브러리가 wfopen()이나 wgetcwd()와 같은 함수를 제공한다는 것도 논리에 맞지 않습니다.

종합해서:

  • 파일 이름이나 디렉토리 이름과 같은 file system specific한 내용을 표준 C 라이브러리에서 제한하는 것은 바람직하지 않다.
  • Wide character는 C 언어에서 제공하는, internal character representation이므로, 이 것을 직접 파일 이름이나 디렉토리 이름에 쓴다는 것은 의미가 없다.
  • wide character로 된 데이터를 직접 파일에 기록하는 것은, 이식성이 없고, 시스템에 따라 wide character representatio이 다를 수 있으므로 바람직하지 않다. --> 이 경우, 잘 알려진 multibyte character representation으로 파일에 기록해두고 프로그램이 읽어 들이면서 다시 wide character로 변환, 프로세싱한 다음 다시 multibyte character representation으로 바꿔서 저장한다.
입니다.

개인적으로, 이 분야에 전문가가 아니기 때문에, 정확한 조언을 해 드릴수는 없지만, 일반적으로 Linux에서는 iconv를 써서 character encoding을 변환하고 작업합니다. 물론 ISO C 표준 함수들만 써서 작업할 수도 있습니다.

Character encoding에 관한 것은 O'Reilly의 CJKV Information Processing이란 책이 있습니다. (영어로 우리 말에 대한 encoding에 대한 책을 읽는 것도 묘한 기분이 들긴 하지만...) 지금까지 게시판 글들을 읽어보면 정태영님이나 다른 분들이 character encoding이나 unicode에 대해 많은 지식을 가지고 있는 것 같으니, 그분들의 답변을 기대해 봅니다.

:wink:

[/]

댓글 달기

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