string constant에 'L'을 붙였다고 unicode (UTF-32)라고 할 수 없습니다.
L을 붙이는 것은 string constant나 character constant가 wide character로 이루어졌다는 것을 뜻하지만, wide character가 바로 unicode (UTF-32)라고 할 수는 없습니다. (wide character는 implementation defined manner로 정의되어 있으므로)
대부분 implementation은 character code를 ASCII로 사용하고, 또 ASCII 문자는 (implementation defined manner로) 다시 32-bit로 변환되어 저장되며, UTF-32에서 ASCII charset은 단순히 0을 앞에 붙여 32-bit로 만든 것에 불과하니, 결국은 대부분 컴파일러에서 ASCII 문자열에 'L'을 붙이면 UTF-32로 저장한다고 말할 수는 있을 것 같습니다.
만약 non-ASCII로 encoding된 문자열의 경우에는 잘 모르겠군요. 가장 확실한 방법은 library가 제공하는 multi-byte/wide-character conversion function들을 쓰거나 아니면 iconv library를 쓰는 것이겠죠.
참고로 glibc에서는 wide character internal encoding이 UTF-32라고 못 박고 있어서 제 경우에는 (한글이나 non-ASCII 영역을 쓸 경우가 거의 없기 때문에) 제 라이브러리가 glibc용이라는 것을 못 박고 L prefix를 붙여서 UTF-32로 쓰고 있습니다.
완벽히 portable한 code라면 문자열 data만 따로 file로 저장한 다음, 이를 필요에 따라 encoding을 바꿔 쓰거나 하는 것이 좋을 것 같군요.
참고로, wide character 라고 하여 반드시 "wide" 할 필요는 없습니다.
wide/mb character 에 대한 지원 의지 (혹은 필요성) 가 전혀 없는
implementation 의 경우, 간단히 wide character 를 single-byte character
로 둘 수도 있습니다.
한가지 재미있는 사실은, 만약 wchar_t 가 char 형인 환경이라면 (C++ 와는
달리) C 에서 (non-wide) character constant 가 int 형이기에
sizeof(L'a') == 1 && sizeof(L'a') <= sizeof('a')
가 참이 되어야 한다는 사실입니다. 따라서, wchar_t 를 char 형으로 두면
서 wide character 지원을 하지 않기에 간단히 character constant 앞의
L 을 무시하는 C 컴파일러는 주의하지 않으면 자신도 모르게 non-
conforming implementation 이 되어 버립니다.
이러한 이유로 wide character 를 사실상 지원하지 않는 implementation 도
wchar_t 를 최소한 short int 이상으로 정의하고, L 을 인식하여 처리하고
있습니다.
Re: gcc는 유니 코드를 어떻게 사용 할 수 있나요??
아무래도 C가 기계에 가까운 언어이다보니까 유니코드 쓰는 것이 쉽지는 않죠..
http://www.tldp.org/HOWTO/Unicode-HOWTO-6.html#ss6.1
여기를 참고하시면 좋을겁니다.
참조
TEXT는 매크로 입니다 ^^;
보시면
#ifdef _UNICODE
#define TEXT(quote) L##quote
#else
#define TEXT(quote) ##quote
#endif
이렇게 되어 있습니다 ^^;
L문자열 이면 유니코드 문자입니다.
그럼
다시 물을 께요..
질문의 요지가 빗나간듯..
gcc 에서요...
wchar_t buf = " ";
저런 사용이 가능 한가요? 바로 사용이 불가능 하다면 적절한 방법은 어떤 것이 있는지요??
-----------^^ ^^ ^^ ^^ ^^ ----------
..........................................................
참조
이렇게 사용하시면 됩니다.
wchar_t *test = L"TEST";
이런씩입니다..
꼭 L을 붙여야 합니다 ^^:
그렇군요..VC랑 같군요... [ 내용 무]
..................
-----------^^ ^^ ^^ ^^ ^^ ----------
..........................................................
[code:1]#include <wchar.h>#d
_____________________________
언제나 맑고픈 샘이가...
http://purewell.biz
string constant에 'L'을 붙였다고 unicode (UTF-
string constant에 'L'을 붙였다고 unicode (UTF-32)라고 할 수 없습니다.
L을 붙이는 것은 string constant나 character constant가 wide character로 이루어졌다는 것을 뜻하지만, wide character가 바로 unicode (UTF-32)라고 할 수는 없습니다. (wide character는 implementation defined manner로 정의되어 있으므로)
대부분 implementation은 character code를 ASCII로 사용하고, 또 ASCII 문자는 (implementation defined manner로) 다시 32-bit로 변환되어 저장되며, UTF-32에서 ASCII charset은 단순히 0을 앞에 붙여 32-bit로 만든 것에 불과하니, 결국은 대부분 컴파일러에서 ASCII 문자열에 'L'을 붙이면 UTF-32로 저장한다고 말할 수는 있을 것 같습니다.
만약 non-ASCII로 encoding된 문자열의 경우에는 잘 모르겠군요. 가장 확실한 방법은 library가 제공하는 multi-byte/wide-character conversion function들을 쓰거나 아니면 iconv library를 쓰는 것이겠죠.
참고로 glibc에서는 wide character internal encoding이 UTF-32라고 못 박고 있어서 제 경우에는 (한글이나 non-ASCII 영역을 쓸 경우가 거의 없기 때문에) 제 라이브러리가 glibc용이라는 것을 못 박고 L prefix를 붙여서 UTF-32로 쓰고 있습니다.
완벽히 portable한 code라면 문자열 data만 따로 file로 저장한 다음, 이를 필요에 따라 encoding을 바꿔 쓰거나 하는 것이 좋을 것 같군요.
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
참고로, wide character 라고 하여 반드시 "wide" 할 필
참고로, wide character 라고 하여 반드시 "wide" 할 필요는 없습니다.
wide/mb character 에 대한 지원 의지 (혹은 필요성) 가 전혀 없는
implementation 의 경우, 간단히 wide character 를 single-byte character
로 둘 수도 있습니다.
한가지 재미있는 사실은, 만약 wchar_t 가 char 형인 환경이라면 (C++ 와는
달리) C 에서 (non-wide) character constant 가 int 형이기에
sizeof(L'a') == 1 && sizeof(L'a') <= sizeof('a')
가 참이 되어야 한다는 사실입니다. 따라서, wchar_t 를 char 형으로 두면
서 wide character 지원을 하지 않기에 간단히 character constant 앞의
L 을 무시하는 C 컴파일러는 주의하지 않으면 자신도 모르게 non-
conforming implementation 이 되어 버립니다.
이러한 이유로 wide character 를 사실상 지원하지 않는 implementation 도
wchar_t 를 최소한 short int 이상으로 정의하고, L 을 인식하여 처리하고
있습니다.
--
Jun, Woong (woong at gmail.com)
http://www.woong.org
댓글 달기