유니코드 아직도 헷깔립니다
그냥 인생 대충 살자는게 모토인 저인지라
대충 그냥 유니코드 대충 대충 쓰자라고 생각했는데
너무너무 궁금해져서 밤에 잠이 안올정도인지라 8)
부끄러움을 무릅쓰고 질문을 올립니다.
제 질문의 요지는
과연 C나 C++에서 유니코드란 무엇을 가르키는 것인가입니다
제가아는 유니코드라는 개념은 그저
6만 5천개의 문자에 코드를 부여한것에 지나지 않습니다
그리고 인코딩이라는 개념이 들어가 UTF-8이냐 UTF-16이냐
등으로 나뉘어진다고 알고 있습니다.
그런데 wchar_t, L"Hello, World!"는 대체 무엇을 뜻하는 것인지
혼란이 옵니다.
정확히 말하여 L을 문자열에 붙이면 이것은 wide형 캐릭터로
표현이 되는 것이고
이 wide형 캐릭터라는 것이 상당히 애매모호합니다.
TC++PL에 보면 wchar_t는 그저 그 임플리맨터의 가장 큰 로케일 문자셋를 충분히
담을 수 잇는 크기라고만 적혀 있습니다..
갑자기 이런 생각이 드는 이유는
요새 윈도우쪽 공부를 하고 있는데 w로 시작하는 스트링 관련
함수들에서 공통적으로 유니코드라는 말을 쓰고 있습니다.
분명히 UTF-8같은 인코딩도 있는데 이 유니코드는 어떤
인코딩을 따르는 것일까요?
제 생각에 UTF-16처럼 아예 모든 캐릭터들을 2바이트에 묶어서
저장하는게 가장 순리에 맞지 않나 라는 생각을 합니다.
C++에서 한 타입의 크기가 고무줄 처럼 늘었다 줄었다 한다는것은
말이 되지 않는다고 생각합니다.
그런데 그렇다면 우리가 소스를 UTF-8형식으로 저장을 했을때
그렇다면 어떻게 이것이 컴파일 되는 것인가에 또한 의문이 듭니다
예를 들어 "헬로 유니코드!"라는 문자열이 있다면 이것이 UTF-8형식으로 저장되었을때 L"헬로 유니코드!"라는 것과 어떤 차이가 있는지도 궁금해 집니다.
두서없이 요약적으로 이야기 했는데 다시 제 의문점을 축약하여
추론한 것을 써 보면
1. wchar_t는 유니코드와 전혀 상관없는 그것이 어떤 코드이던
간에 큰 코드를 담을 수 있는 타입이다.
2. char * 도 충분히 유니코드 문자열을 포인트 할 수 있고
L이 앞에 붙지 않는 "헬로 월드!"와 같은 문자열도 소스가 UTF-8같은
유니코드 형식으로 저장이 된다면 이것은 유니코드 문자열이 된다
즉 유니코드를 쓰는 것과 wchar_t와는 전혀 상관이 없다???
저도 같이 궁금한 부분이 있어서 답변이 기대되는군요..
저도 같이 궁금한 부분이 있어서 답변이 기대되는군요..
ㅡ_ㅡ;
1. wchar_t는 유니코드와 전혀 상관없는 그것이 어떤 코드이던간
1. wchar_t는 유니코드와 전혀 상관없는 그것이 어떤 코드이던
간에 큰 코드를 담을 수 있는 타입이다.
-> wchar_t 는 UCS2 이고 이것은 대부분의 유니코드를 포함하지만
모든 언어를 표시할 수 있는것은 아닙니다.
2. char * 도 충분히 유니코드 문자열을 포인트 할 수 있고
L이 앞에 붙지 않는 "헬로 월드!"와 같은 문자열도 소스가 UTF-8같은
유니코드 형식으로 저장이 된다면 이것은 유니코드 문자열이 된다
-> char* 를 쓰면 유니코드를 저장하는 방식중 UTF8 로 저장 할 수 있는 것입니다.
L 이 붙는 UCS2 와는 별개입니다.
즉 유니코드를 쓰는 것과 wchar_t와는 전혀 상관이 없다???
-> 상관 있습니다..
-------------------
이렇게 답하면 더 헷갈리시겠죠?
구글에서 "유니코드"를 치면 맨처음 나오는 페이지인
http://www.jinsuk.pe.kr/Unicode/unicode-kr.html
를 상세히 읽어 보시면 궁금증이 풀릴수도 있고
더 어려워 질수도 있겠네요..
Re: 유니코드 아직도 헷깔립니다
UCS_2 랑 UCS_4 도 있습니다 ... unicode 4.0 과 ucs_2 가 일치하는 걸로 알구 있구요...
다른 건 모르겠고...
char* 로 써도 utf-8 로 인코딩된 유니코드 문자열 이기는 하겠지만... str계열 함수로 문자의 길이등을 정확하게 (한글 한자를 하나로 치면서) 알 순 없겠죠 ... 그리고 ucs_2, ucs_4, utf-16 등을 사용할 경우엔 NULL TERMINATED string 으로 사용할 수 없기 때문에 좀 다르게 사용해야겠구요...
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...
http://mytears.org ~(~_~)~
나 한줄기 바람처럼..
wchar_t에서 w는 꼭 유니코드를 지칭하지는 않습니다. 그냥 wide
wchar_t에서 w는 꼭 유니코드를 지칭하지는 않습니다. 그냥 wide character set 일 뿐이죠. char이 꼭 ASCII 를 지칭하지는 않는 것과 마찬가지라 할 수 있습니다.
1번은 몇가지 가정이 더 붙는다면 맞습니다. 정확하게 쓰자면 "해당 환경에서 사용하는 wide character set 중의 어떤 문자라도 저장할 수 있을 정도로 큰 크기"가 되겠으며, 그 크기는 컴파일러에서 어떤 character set을 wide character set으로 사용하는가에 따라 다릅니다. UTF-16이라면 16비트고, UTF-32라면 32비트가 되겠죠. 여기에 대해 특별한 제한은 없습니다. 일단 8비트 보다는 크겠지만요.
2번은, char *가 그 특성상 모든 주소의 메모리 공간과 모든 타입의 object를 가리킬 수 있으므로 반칙인 질문이라 하겠습니다(정렬제한에 가장 영향을 적게, 혹은 안받는 포인터형이 char*형입니다). 즉 L"한글" 인 wide string literal 이라고 해서 가리키지 못할 이유가 없습니다(타입 캐스팅이 없으면 경고나 에러가 뜰수도 있겠지만요). 하지만, char형(혹은 char*형)에 기반한 문자열 처리 함수들은 char*이 가르키는 wide string literal을 single-byte string처럼 다루고 처리할 것입니다.
한가지 더 참고삼아 말씀드리자면, C에서는 source character set과 execution character set을 구분하고 있습니다. 소스 코드에서는 ASCII를 사용하고 실행 파일은 EBCDIC을 사용한다던가, 혹은 소스 코드에서는 UTF-8을 사용하고 실행 파일에서는 UTF-16을 사용하는 경우가 충분히 가능합니다.
C에서 유니코드(utf8이던 utf16이던)를 사용하는데 반드시 wchar_t와 L"str"이 전제되어야 하는가라고 묻는다면, 아니라고 답하겠습니다. 또한, wchar_t와 L"str"로 소스코드를 작성하면 반드시 유니코드가 지원되는 것이냐라고 묻는다면, 역시 아니라고 답하겠습니다.
결론은? 유니코드와 wchar_t와는 별개의 문제입니다. 다만, C 표준에서는 각각의 C 구현체들이 일관성있는 방법으로 wide character set을 지원할 수 있도록 wchar_t라는 가이드 라인을 제시하고 있고, 어떤 구현체들은 그것을 이용해서 unicode를 지원하고 있을 뿐입니다.
Re: 유니코드 아직도 헷깔립니다
유니코드라고 할때 문맥에 따라 인코딩을 포함하는 경우가 많습니다.
특히 MS 윈도우 세상에서는 유니코드라면 당연히 UTF16 에 리틀엔디안이죠..
메모장에서 다른이름으로 저장 하신다음에 아래쪽 옵션을 보시면 아실겁니다.
제가 드리는 얘기가 도움이 될지 모르겠지만 아무튼 말씀드리자면
보통 유니코드라고 하면 UCS2 인코딩을 포함한 의미로 많이 쓰인다는 겁니다.
별로 정확한 쓰임새는 아니어서 문맥을 보고 잘 판단해야죠.
[quote]결론은? 유니코드와 wchar_t와는 별개의 문제입니다. 다
이에 대해서, 실제 C/C++ 구현체들이 어떤 방식으로 유니코드를 구현하는지를 살펴보면 재미있지요.
http://msdn2.microsoft.com/en-us/library/c426s321.aspx
제 기억으로는 윈도우 95 시절부터 MS는 유니코드 환경을 준비했던 것 같군요. TCHAR도 그때부터 있었고...
대충 제 생각도 정리가 된듯 합니다.위의 답변 주신분들 모두 감사드립
대충 제 생각도 정리가 된듯 합니다.
위의 답변 주신분들 모두 감사드립니다.
결국 wchar_t는 그냥 데이터 형이네요
가장 쉽게 유니코드로된 프로그램을 작성하려면
wchar_t를 이용해 utf-16으로 (UCS2)문자열을 만들고 지지고 볶고 하는것이라
할 수 있겠네요
그런데 만약 UTF-16 으로 소스를 저장하고
예를 들어
wchar_t * p = L"헬로 유니코드!" // UTF-16으로 저장
cout<<p;
이런 코드가 있을때
이 가능하다는 말씀은
터미널이 UTF-8인데도 cout<<p;라는 구문에서 깨지지 않고
잘 나올 수 있다는 뜻입니까 아니면
wchar_t *p = L"헬로 유니코드!";
if(터미널이 UTF-8이라면)
convert16to8(p);
cout<<p;
이렇게 작업을 해야한다는 뜻입니까?
C++, 그리고 C++....
죽어도 C++
[quote]이렇게 작업을 해야한다는 뜻입니까?[/quote][q
프로그래머가 그렇게 할 수 있다는게 아니고, C 컴파일러의 구현자가 그렇게 할 수 있다는 것입니다. 즉 컴파일러가 UTF-8로 된 소스 코드를 번역해서, 내부에서 사용되는 문자열을 UTF-16으로 저장한 실행파일을 결과물로 내놓도록 컴파일러를 만들 수 있다는 것입니다. 또다른 예로는, ASCII를 사용하는 컴퓨터 위에서 돌아가는, EBCDIC용 실행 파일을 빌드하는 C 크로스 컴파일러를 예로 들 수 있겠죠(실존하는지 여부는 모르겠지만;;;)
프로그래머 입장에서는 위에서 말씀하신 대로 다음과 같이 해야 됩니다.
[quote="Anonymous"][quote]이렇게 작업을 해야한다는
지나가는 이야기지만 p는 문자열 상수를 가르키기 때문에
저렇게 될 수 없겠네요 ^^
그리고 답변에 감사드립니다
C++, 그리고 C++....
죽어도 C++
아시는대로 유니코드 인코딩 방식에는 여러가지가 있습니다..그 인코딩
아시는대로 유니코드 인코딩 방식에는 여러가지가 있습니다..
그 인코딩 방식들 모두가 유니코드라고 보시면 되구요..
따라서 어떤 인코딩 방식을 사용해서 유니코드를 표현하느냐는 운영체제를 만든 사람 마음입니다. 그리고 컴파일러를 만든 사람 마음이구요..
C++에서의 유니코드란 특정한 유니코드 인코딩 방식을 지칭할 수는 없습니다.(구현자 마음이므로..) C++에서 유니코드란 wchar_t로 저장이 가능하며 문자열을 만들때 앞에 L을 붙여서 사용하면 이는 유니코드이라고 생각하시면 됩니다.
유니코드 인코딩 방식이 이슈가 되어야 하는 상황에서는 유니코드 문자열을 다른 운영체제로의 전송(소켓, 파일)을 할 경우입니다. 이때는 원본 인코딩 방식을 알고 대상 인코딩 방식을 알아야지 문제 없이 다른 운영체제에서 사용이 가능합니다..
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
[quote="ixevexi"]가장 쉽게 유니코드로된 프로그램을 작성하려
혹시나 해서 쓰는 글이지만 utf-16 는 ucs_2 와 동일한 인코딩이 아닙니다...
ucs2 는 BMP 에 있는 글자들만을 표현할 수 있고 utf16 의 경우엔 ucs2 의 확장으로 BMP 를 벗어나는 글자를 표현하기 위해 할당되지 않은 영역을 가지고 있지요...
http://www.terena.nl/library/multiling/unicode/utf16.html
오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...
http://mytears.org ~(~_~)~
나 한줄기 바람처럼..
[quote="ixevexi"]그런데 만약 UTF-16 으로 소스를 저장
저도 wchar_t나 유니코드에 대해서는 아는 바가 별로 없어서 확실한 얘기는
할 수 없지만, 이것은 유니코드의 인코딩뿐만 아니라 locale까지 고려해야 하는
문제 아닌가요? 그리고 cout이 아니라 wcout을 써야 하겠고요. 즉
와 같은 식으로요.
유니코드에 대해서 몇가지 더..1.저도 얼마전까지 그렇
유니코드에 대해서 몇가지 더..
1.
저도 얼마전까지 그렇게 알고 있었는데,
유니코드가 2byte안에 모두 담을 수 있는 65000개의 캐릭터 집합이라고
알고 계신 분들이 많습니다.
그런데, 유니코드가 애초 시작은 2byte안에 모든 언어를 담을 수 있을거라고
표준을 만들기 시작을 했는데, 나중에 확장되다가 2byte도 모자라서
plane 개념인가를 써서 2byte이상, 즉 65000개 이상으로
표준을 훨씬 확장했습니다.
(정확히 기억은 안나지만 14plane인가 그랬던거 같네여...
즉 차라리 3byte안에 모두 들어간다고 보는게 맞을것 같습니다.)
물론 대부분의 중요한 char 들은 6만5천개 포함되지만,
표준 char는 2byte로 표현할 수 있는 것 보다 훨씬 많습니다.
조엘온 소프트웨어에서도 이 얘기를 하더군요..
2.
알고 계신 분들도 많으시겠지만,
한중일 한자는 하나의 집합으로 합쳐졌습니다.
Unihan인가 하는 이름으로 불리던가 그렇더라구요..
기본적으로 유니코드에는 나라라는 개념은 없고 언어라는 개념만 존재합니다.
그래서 유니코드에서는 나라별로 char를 구분하기는 어렵습니다.
언어별로 구분하는게 맞구요.
약간의 휴리스틱을 쓰면 나라에 대해 판단할 수는 있구요.
권위를 의심할 것,어긋남을 존경할 것,자리잡기를 거부할 것,항상 자신을 재창조할 것 - MIT 미디어랩 -
http://www.jinsuk.pe.kr/Unicode/Unicode_
http://www.jinsuk.pe.kr/Unicode/Unicode_intro-kr.html
여기에 정리가 잘 되어있습니다.
답변하신분들도 확신이 없이 적으신분들이 많으신데
이번 기회에 정확히 알고 넘어가면 좋을듯 합니다.
일하는 사람들의 희망 민주노동당 : http://www.kdlp.org
반공 교육의 성과로, 민주주의의 반대가 공산주의(또는 사회주의)라고 생각하는 사람이 많다.
[quote="spacelee"]그런데, 유니코드가 애초 시작은 2byt
U+0000부터 U+10FFFF까지 총 17plane(약 110만 개)입니다. 이 중 약 10만 개의 문자가 할당되어 있습니다. 사실 자바 char도 2바이트이지만 UTF-16을 쓰고 있죠.
- 토끼군
댓글 달기