본문 바로가기
나머지/IT개발.잡다한것.

유니코드관련

by 무늬만학생 2012. 9. 13.
반응형


질문 

1. wchar_t는 유니코드와 전혀 상관없는 그것이 어떤 코드이던

간에 큰 코드를 담을 수 있는 타입이다.


2. char * 도 충분히 유니코드 문자열을 포인트 할 수 있고

L이 앞에 붙지 않는 "헬로 월드!"와 같은 문자열도 소스가 UTF-8같은

유니코드 형식으로 저장이 된다면 이것은 유니코드 문자열이 된다


즉 유니코드를 쓰는 것과 wchar_t와는 전혀 상관이 없다???


답변



 

 


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를 지원하고 있을 뿐입니다.

자세한건 밑에 사이트로

출처 : http://kldp.org/node/61323

반응형