유니코드에 대한 초보적인 질문입니다.
글쓴이: hsnks100 / 작성시간: 금, 2008/06/27 - 12:59오전
유니코드는 전세계 문자를 표준적으로 표현하기 위한 장치로 알고 있습니다.
그래서 문자를 담는 크기가 1바이트가 아니고 2바이트 이상이죠.
그런데 유니코드 관련작업을 하는데 몇가지 의문이 있어서 질문드립니다.
int main()
{
//setlocale(LC_ALL, "Korean");
TCHAR one = TEXT('가');
_tprintf(TEXT("%c"), one);
return 0;
}
왜 저기에 있는 주석을 지우면 이상한 문자로 표현이 될까요? 분명 유니코드인데 말이죠.
한글 쓸때는 Korean 다른 문자를 쓸땐 또 다른 로케일을 설정해야하는건가요?
그렇다면 일어+아랍어+한글이 동시에 쓰인 텍스트 파일을 읽을때는 어떻게해야하는건가요?
locale 한글로 설정했는데 아랍어가 들어가있으면?
제대로 알지를 못하니 질문도 정확히 못하는거 같습니다. 꼭좀 알려주세요.
(6월 30일날 군대가는데 쓸데없는게 궁금해지네요. -_-);
요약. 왜 유니코드에서 로케일을 설정해야하는가?
유니코드에서 로케일을 설정해야하면 다국어파일은 어떻게 읽어야하는가?
Forums:
LC_ALL의 형식은 보통
LC_ALL의 형식은 보통 ko_KR.UTF-8 등이 되지 않나 싶습니다.
ko_KR.UTF-8이든 fr_FR.UTF-8이든간에 같은 인코딩이면 유니코드 캐릭터셋은 문제 없습니다.
소스 코드가 euc-kr 로
소스 코드가 euc-kr 로 저장되었는지 utf-8 로 저장되었는지 모르겠네요.
그리고 좀 이상한게 TCHAR one = TEXT('가'); 이부분인데요. c 에서 '' 로 쌓여있으면 1바이트 글자의 ascii 값을 의미하는데요. 저렇게 하면 어떤 값이 들어가게 될지 궁금하군요.
setlocale 은 런타임에 이루어지고 TEXT('가') 값은 컴파일 타임에 정해질 것 같은데 말이죠.
--
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...
http://mytears.org ~(~_~)~
나 한줄기 바람처럼..
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...
http://mytears.org ~(~_~)~
나 한줄기 바람처럼..
'' 로 싸여있다고
'' 로 싸여있다고 해서 1바이트를 뜻하는건가요? 아니지 않나요?
----------------------------------------------------
알디 입니다.
http://hsnks100.tistory.com
----------------------------------------------------
개인 블로그: https://kangssu.com
...
잘못 작성된 코드에 대해서 정답을 맞추기는 힘들것 같습니다.
TEXT macro가 받는 형은 http://msdn.microsoft.com/en-us/library/dd374074(VS.85).aspx
LPTSTR 입니다. '가' 는 char 형이므로 여기에서 부터 데이터가 어떻게 동작할 지 예측하기는 힘들듯하네요.
코드상으로 출력하려는 환경은 Windows cmd 같습니다.
cmd에서 요즘에는 다국어를 표현할 수 있는지 모르겠습니다. 기본 쉘에서는 못하는 걸로 기억하고 있습니다. 로케일 관련은 출력 전에 해당 프로그램 출력 양식을 맞춰주는 작업을 하는걸 unicode 개념과 섞어서 말씀하시는 거 같습니다.
만약 cmd가 utf-8을 지원한다면 utf-8 로케일로 맞춰서 unicode에서 지원하는 대부분의 문자를 출력할 수 있을 듯하네요.
더 검색해 보니
//setlocale(LC_ALL, "Korean"); 에서 setlocale 이게 설명인데 여기에서 locale 의 정의란 다음 과 같이 지역 코드와 codepage 라고 정의되어 있네요.
코드상 Korea 의 지역 설정만 되어 있는데, 아마 CRT가 해당 프로그램의 출력시 코드 페이지를 지역 코드만 보고 code page값이 null이니 cp949, euc-kr 로 맞추어서 한글이 보이게 출력되지 않나 추측해 봅니다.
mac 이라 직접 실험을 못해보는게 약간 아쉽네요. ;;
MSDN 설명은 좀 묘하네요.
Macro를 C 함수표기법으로 설명하는데 좀 이상한 것 같습니다.
그리고 macro 함수는 return이 있다고 봐야 할 것 같은데 void 반환형으로 설명하는 것도 이상하고요.
저도 동감합니다.
void 부분이 이상해서 소스를 보고 싶은데, 환경이 mac이라 header를 볼수가 없네요. 애초에 볼수 있는 소스인지도 애매하구요.
다른 분께서 구원을 주세요. ~
별거 없습니다.
아마 winnt.h 에 정의되어 있는 것 같은데
#ifdef UNICODE
#define TEXT(x) (L##x)
#else
#define TEXT(x) (x)
#endif
이 정도쯤 될 겁니다.
아마도 문제는 cmd가 Unicode 출력을 제대로 지원해주지 못해서가 맞을 것 같네요.(저도 잘 모름...)
-------------------------------------------------------------------------------------
실제로 보니까 괄호는 없군요. 그냥 L##quote에 quote로 되어 있네요.
http://kaistizen.net/EE/index.php/weblog/comments/unicode_hangul_to_stdout/
관련해서 가장 많이 삽질한 분이신 듯... ^_^
C++ 은 왜케 유니코드
C++ 은 왜케 유니코드 하나 쓸려고 해도 이런 삽질을 해야 깨달을 수 있는걸까요?
솔직히 자세하게 제어하는것도 좋지만 너무 과하다는 생각이 듭니다.
관련 메소드가 너무 많아요!!
----------------------------------------------------
알디 입니다.
http://hsnks100.tistory.com
----------------------------------------------------
개인 블로그: https://kangssu.com
댓글 달기