운영체제마다 다른 wchar_t??

purewell의 이미지

채팅서버를 구현하려고 합니다.
왔다갔다하는 문장 중에 욕설 등 적절하지 못한 단어가
있으면 걸러내는 것을 좀더 쉽게 구현하기 위해
wchar_t를 사용하려고 하는데,
OS마다 wchar_t의 크기지원이 다르게 되어 있더군요.
(컴파일러나 라이브러리 지원문제일 수도...)

#include <wchar.h>
#include <stdio.h>

int main(void)
{
  printf("Size of wchar_t is %d\n", sizeof(wchar_t));
  return 0;
}

Quote:
RedHat9 :: 4 (gcc)
Win32 :: 2 (VS.NET)

네트워크를 통해 Win32와 Linux 사이를 왔다갔다 해야는데
사이즈가 틀리니 난감하군요. 짧막한 팁 같은 것 없을까요?

김충길의 이미지

wchar_t 타입은 unicode와 관련된걸로 알고 있는데 유니코드 기반으로
하실려는건가요?

screen + vim + ctags 좋아요~

cjh의 이미지

wchar_t는 운영체제마다 다릅니다. glibc는 내부 구현에서 아마 UCS-32로 할려니까 4바이트일 거고 윈도우는 UCS-16으로 하나 보네요. 꼭 유니코드가 아닐수도 있습니다. FreeBSD같으면 wchar_t가 유니코드가 아닙니다.

따라서 OS간에는 그대로 보내시면 안되고 wcs관련 함수나 iconv()등을 사용해서 네트워크로 그냥 보내도 되는 적절한 중간 인코딩을 하나 선택해서(UTF-8같은걸로 하면 바이트 순서를 안따져도 되니까 좋겠지요) 주고받으시면 될 겁니다.

--
익스펙토 페트로눔

lsj0713의 이미지

전송할때는 유니코드 문자열을 멀티바이트 문자열로 변환해서 전송하면 어떻습니까? 해당 컴파일러에서 지원하는 지는 모르겠습니다만 하여간 표준문서에서는 그러한 일을 하는 함수로 mbsrtowcs, wcsrtombs를 만들어두고 있습니다.

참고로 char형이 아닌 모든 데이터형은 다른 기계끼리 서로 호환되지 않는 걸로 알고 있습니다. wchar_t형이 모두 4바이트로 동일한 크기라 해도 그것을 직접 전송하는 것은 좋지 않다고 생각됩니다.

죠커의 이미지

그런데 char가 8bit가 아닌 컴퓨터도 있지 않습니까? 1byte는 8bit가 아니니깐요. 제대로된 서버/클라이언트는 힘든 일이군요.

개인적으로는 c++에서 wstring을 쓰면서 받았던 고통때문에 wide char은 선뜻 이용하기가 꺼려지더네요. 비영어권에서 사용하기에는 여전히 미흡하다고 생각합니다.

kmhh0021의 이미지

1byte가 8bit가 아니다.
저의 무지함을 깨우칠 수 있도록 말씀하신 컴퓨터에 대해 소개 좀 해주시면 고맙겠습니다.
이 글을 보는 순간 너무나 궁금함에 가슴이 답답합니다.

CN wrote:
그런데 char가 8bit가 아닌 컴퓨터도 있지 않습니까? 1byte는 8bit가 아니니깐요.


-------------------------------------------
피바다=피받아
http://blood.egloos.com
[一笑一少 一怒一老]
[笑門萬福來]

cjh의 이미지

wcstombs로 변환한 multibyte string이 시스템간에 호환된다는 보장도 없습니다(누구는 iso2022를 쓰지만 누구는 utf-8인 등등) 그러니 아예 누구나 확실히 아는 유니코드같은걸로(한글만 있다면 그냥 euc-kr) 보내는게 좋다는 거죠.

lsj0713 wrote:
전송할때는 유니코드 문자열을 멀티바이트 문자열로 변환해서 전송하면 어떻습니까? 해당 컴파일러에서 지원하는 지는 모르겠습니다만 하여간 표준문서에서는 그러한 일을 하는 함수로 mbsrtowcs, wcsrtombs를 만들어두고 있습니다.

참고로 char형이 아닌 모든 데이터형은 다른 기계끼리 서로 호환되지 않는 걸로 알고 있습니다. wchar_t형이 모두 4바이트로 동일한 크기라 해도 그것을 직접 전송하는 것은 좋지 않다고 생각됩니다.

--
익스펙토 페트로눔

krisna의 이미지

저는 별일 없으면 UTF-8을 추천하고 싶군요.
wchar_t의 경우 앞에서 cjh님이 지적하신 것처럼 *BSD의 경우 locale 마다 값이 다른 것으로
압니다. 또 그 크기도 다 달라서 64bit인 경우도 있는 것으로 들었습니다.
이것은 구현마다 다른 문제겠지요.

MultiByte string이라고 해서 다 해결 되는 것도 아니지요. 실제로 그 문자열이
어떤 charset을 사용하는지 알 도리가 없기 때문에, 그런 문제가 없는
UTF-8을 사용하는 편이 나중에도(한글 이외의 글자를 지원하게 되었을 때) 도움이 될것 같군요.

akbar의 이미지

...

saxboy의 이미지

저도 UTF-8 을 추천하고 싶습니다. wchar_t 가 시스템마다 다른 것도 그렇지만, wchar_t 를 이용해서 코딩을 하려면 코딩하면서 디버깅 결과물을 확인하는 것도 그렇고 아주 피곤한일이 많이 생기게됩니다. UTF-8 이면 아스키와 완전히 호환되어주니 이런 걱정이 좀덜 하지요.

죠커의 이미지

kmhh0021 wrote:
그런데 char가 8bit가 아닌 컴퓨터도 있지 않습니까? 1byte는 8bit가 아니니깐요.

7bit나 9bit인 컴퓨터도 가끔 볼수 있습니다. 여기 게시판에서도 논의된적이 이었던 것 같습니다. TCPL에서도 보았던 기억이 있구요. 그걸 일일히 나열하는 것은 특별한 의미가 없을 것 같습니다.

그것보다는 C언어에서는 1byte가 몇 bit인지를 정하지 않는다는 것을 아시는게 더 낫지 않나합니다.

char형은 단지 문자를 담을만한 충분한 크기이면 됩니다. 아스키코드가 7bit인것을 감안하면 7bit 컴퓨터라도 문제가 될 부분이 없죠. 아스키코드가 아닌 다른 체계를 사용한다면 더 줄일 여지도 있겠지요.

PS:
제 기억으로는 w_char는 typedef된 short int가 많았던걸로 기억합니다. 별도의 자료형이라는 것 보다는 c언어의 불규칙한 크기의 정수형에 의지하는 형태의 구현이 많더군요.

letsme의 이미지

char 가 1byte 가 아닐수도 있다는 것은 이해가 되지만
1byte 가 8bit 가 아닐 수도 있다는 것은 이해하기가 어렵네요.
딴지가 아니라 정말 1byte 는 8bit 가 아닐수 있는 건가요?

kmhh0021의 이미지

CN wrote:
kmhh0021 wrote:
그런데 char가 8bit가 아닌 컴퓨터도 있지 않습니까? 1byte는 8bit가 아니니깐요.

7bit나 9bit인 컴퓨터도 가끔 볼수 있습니다. 여기 게시판에서도 논의된적이 이었던 것 같습니다. TCPL에서도 보았던 기억이 있구요. 그걸 일일히 나열하는 것은 특별한 의미가 없을 것 같습니다.

그것보다는 C언어에서는 1byte가 몇 bit인지를 정하지 않는다는 것을 아시는게 더 낫지 않나합니다.

char형은 단지 문자를 담을만한 충분한 크기이면 됩니다. 아스키코드가 7bit인것을 감안하면 7bit 컴퓨터라도 문제가 될 부분이 없죠. 아스키코드가 아닌 다른 체계를 사용한다면 더 줄일 여지도 있겠지요.

PS:
제 기억으로는 w_char는 typedef된 short int가 많았던걸로 기억합니다. 별도의 자료형이라는 것 보다는 c언어의 불규칙한 크기의 정수형에 의지하는 형태의 구현이 많더군요.

그렇군요.. 7bit 9bit의 char가 있다는걸 전혀 몰랐습니다.
앞으로 배워야할게 너무나 많군요.
앞으로도 많이 배워 가겠습니다.


-------------------------------------------
피바다=피받아
http://blood.egloos.com
[一笑一少 一怒一老]
[笑門萬福來]

purewell의 이미지

이런이런... 제한을 두지 않아서 글이 길어지게 되는군요.

서버 시스템은 '반드시' Intel 32/64 비트 시스템을 씁니다.

OS는 반드시 Linux를 씁니다.

클라이언트는 Intel 32/64 비트이거나 AMD 32/64 비트 시스템을 씁니다.

OS는 반드시 Windows를 씁니다.

클라이언트(Windows)에서 wchar_t를 쓰고,

EditBox로 입력 받은 wchar_t의 값이 어떠한 인코딩 방식을 쓰는지

안다면 byte-order 등을 생각치 않아도 해결할 수 있지 않을까요.

문제는 2바이트형과 4바이트형을 어떻게 '쉽게' 교환하는지

짤막한 팁을 원합니다.

위에 글을 보니, iconv 등의 이야기가 나왔는데 iconv는

서로 다른 인코딩 방식을 컨버팅 해주는 툴인가요?

_____________________________
언제나 맑고픈 샘이가...
http://purewell.biz

lsj0713의 이미지

여러 사람들의 답변을 종합해 볼 때, iconv를 이용해서 utf-8 인코딩으로 컨버팅한 다음에 주고받는 것이 가장 나을 것 같습니다. utf-8 인코딩이라면 unsigned char형으로 저장할 수 있을 테니까요. wchar_t형 데이터를 직접 주고 받는 것은 여러모로 볼때 좋지 않아 보입니다.

그리고 iconv는 각 인코딩으로 된 문자열을 컨버팅하는 도구입니다. 유틸리티도 있고 라이브러리도 있죠.

wkpark의 이미지

glibc에서 wchar_t및 wc*mb*류의 함수를 제대로 구현하게 될 무렵
(아마도 glibc2.1이 나올 무렵)

wchar_t를 UCS4로 하느냐 UTF-8로 하느냐 논쟁이 있었던 것으로 기억합니다.

glibc 메인테이너 Ulrich Drepper씨는 wchar_t를 UTF-8로 생각을하고 있었는데, 결국은 UCS4로 gconv/iconv를 구현하게 되었다고 들었습니다.

잠깐 구글링해보니, 리눅스의 wchar_t는 glibc를 쓰는 관계로 UCS4로 쓰는군요.
근데 이거 맞나요 ? -_-;;

Quote:

> 1. Some people in this list preferred UCS4. (Raise your hand if you do)
> 2. wchar_t in Linux's glib is UCS4. (and that is "nearly nobody")
> 3. because of 2, therefore, gconv on linux is using UCS4
> 4. FontConfig use UCS4 for API provide for Xft, (see FcFreeTypeCharIndex
> in fcfreetype.h )
> 5. Xft internally use UCS4 (look at xftdraw.c, xftrender.c). Some of the
> Xft's api use UCS4 (not all)- XftTextExtents32, XftDrawString32,
> XftTextRender32, XftTextRender32BE, XftTexdtRender32LE, XftDrawCharSpec,
> XftCharSpecRender, XftDrawCharFotnSpec, XftCharFontSpecRender,
> 6. gunichar in linux is ucs4
> 7. Because of 6, pango use UCS4 in the unicode api

온갖 참된 삶은 만남이다 --Martin Buber

방준영의 이미지

박원규 wrote:
glibc에서 wchar_t및 wc*mb*류의 함수를 제대로 구현하게 될 무렵
(아마도 glibc2.1이 나올 무렵)

wchar_t를 UCS4로 하느냐 UTF-8로 하느냐 논쟁이 있었던 것으로 기억합니다.

glibc 메인테이너 Ulrich Drepper씨는 wchar_t를 UTF-8로 생각을하고 있었는데, 결국은 UCS4로 gconv/iconv를 구현하게 되었다고 들었습니다.


UTF-8을 wchar_t로 구현하는 것은 불가능하지 않나요? UTF-8은 가변길이이고 wchar_t은 고정길이인데...
byung82의 이미지

조금 철은 지났지만,,

VC에서 보시면 wchar_t 에 관한 옵션이 있습니다.

그걸 변경하면 4byte로 동작하게 됩니다 ^^:

그럼..

cinsk의 이미지

김충길 wrote:
wchar_t 타입은 unicode와 관련된걸로 알고 있는데 유니코드 기반으로 하실려는건가요?

wchar_t는 char로 나타낼 수 없는 문자를 나타내기 위해 소개된 것으로, 현존하는 특정 encoding이나 representation을 바탕으로 만들어진 것이 아닙니다. 따라서 wchar_t는 유니코드와는 관련이 없습니다. 다만 편의에 의해서 유니 코드 (UCS-2 또는 UCS-4등등)를 쓰는 컴파일러 시스템이 많습니다.

----

char를 이루는 비트의 갯수는 <limits.h>의 CHAR_BIT에 정의되어 있습니다. 대개는 8이죠.

----

방준영 wrote:
UTF-8을 wchar_t로 구현하는 것은 불가능하지 않나요? UTF-8은 가변길이이고 wchar_t은 고정길이인데...

100% 보장은 할 수 없습니다만, C 표준에는 wchar_t가 현재 locale에서 표현 가능한 모든 글자를 담을 수 있는 데이터 타입이라고 해 두었지, wchar_t 자체가 가변인지 고정 비트를 쓰는 지에 대해서는 다루지 않고 있는 것으로 기억합니다.

----

참고로, glibc를 쓴다면, wchar_t는 항상 32bit 고정 폭을 쓰는 것이 보장됩니다. 즉 ISO10646의 모든 문자를 커버할 수 있습니다.

uclibc나 newlib에서 wide character에 관한 것은 얼핏 봤는데, 완벽하지는 않은 것 같습니다. 대신 iconv를 써서 특정 encoding을 직접 쓰는 것을 더 선호한다는 느낌을 받는 군요.

익명 사용자의 이미지

주고받는것이 문제일때 가장 현명한 접근은 현재는 UTF-8이라고 봅니다.
내부적으로 주고/받고시에 매번 형변환하는 부하가 예측되지만,
성능이나, 저장이나, 디스플레이나,...등이라면 몰라도 말입니다.

lifthrasiir의 이미지

원래 목적이 욕설 필터링을 위한 것이라면, 사용하는 인코딩만 정확하게 알고 있으면 char 배열로 그냥 보내도 될 것 같습니다. utf-8이라면 문자열을 그대로 매칭시켜도 되고, cp949라면 각 글자가 어느 바이트에서 시작하는 지 알고 있으면 되겠죠. 그 이외의 목적으로도 사용하려면 아무래도 iconv가... -_-

CN wrote:
그런데 char가 8bit가 아닌 컴퓨터도 있지 않습니까? 1byte는 8bit가 아니니깐요. 제대로된 서버/클라이언트는 힘든 일이군요.

개인적으로는 c++에서 wstring을 쓰면서 받았던 고통때문에 wide char은 선뜻 이용하기가 꺼려지더네요. 비영어권에서 사용하기에는 여전히 미흡하다고 생각합니다.

그래서 프로토콜이나 포맷 스펙 같은 걸 살펴 보면 1바이트를 항상 8비트라고 못박아 두거나(아니면 원래 8비트로 정의된 octet라는 말을 쓰거나) 아예 비트 단위로 정의하는 걸 흔히 볼 수 있습니다.

- 토끼군

ssoo76의 이미지

UTF-8이 UCS 코드를 전송하기 위한 목적으로 만들어졌죠...

세상은 하나..........

세상은 하나..........

eungkyu의 이미지

엄청 오래된 글이로군요 =_=
스팸 덕분에 새글 목록에서 보았습니다.

제 생각에 가장 쉽게 고치는 방법은 gcc나 vc의 옵션을 이용해 wchar_t형의 인코딩을 맞추는 방법인 것 같습니다. 이전 답변에 보면 vc의 옵션중에 wchar_t가 사용하는 인코딩을 바꾸는 옵션이 있다고 했는데, gcc에서도 가능합니다. wchar_t가 사용하는 인코딩을 바꿀 수도 있고 wchar_t의 크기를 2바이트로도 바꿀수 있습니다.

(gcc의 어느 버전부터 가능한건지는 잘 모르겠네요..)

물론 질문한 사람의 문제해결에는 별 도움은 안되겠지만 =_=;;; 그냥 올려봤습니다.

블루스크린의 이미지

광고 글이 올라오는 것을 보니 이미지번호입력도 깨졌거나 우회하는 방법이 있거나 수동으로 올리나 보네요

이런 광고글은 Google 랭킹을 올리기 위한 것 아닌가요?

예전것도 삭제가 안되어 있네요 관리자님 삭제좀 해주세요

-------------------------------------------------------------------------------
이 댓글(comment)의 수정 및 삭제를 위해 이 글에 답글(reply)을 쓰지 말아 주십시요.
의견이 있으시면 원 글에 댓글(comment)로 써 주세요.

댓글 달기

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