본문 바로가기

유니코드

BOM(Byte Order Mark)에 따른 파일 처리 Byte Order Mark(BOM)은 바이트 순서 표식이라고 합니다.유니코드 형식(엔디안, 인코딩 방식 등)을 지정하는 일종의 헤더입니다.일반적으로 유니코드가 아닌 경우 BOM이 필요하지 않습니다.하지만 유니코드의 경우는 BOM이 필요할 수 있습니다.Windows가 사용하는 UTF-16 방식의 경우 U+FEFF를 BOM으로 사용합니다.인텔 등이 사용하는 일반 PC의 x86 환경에서는 리틀 엔디안을 따르기 때문에 FF FE로 기록이 됩니다.MFC 등에서 유니코드로 파일을 기록할 때는 먼저 0xFEFF를 바이너리 형태로 입력해야 합니다.이렇게 작성된 파일은 나중에 다시 읽을 때 BOM을 통해서 어떻게 읽는지 알 수 있습니다.UTF-16 외에 각 유니코드 인코딩 방식에 따른 BOM은 다음과 같습니다.Enco.. 더보기
MFC, API 프로그래밍에서 유니코드 처리하기 요즘은 거의 대부분 유니코드를 적용해서 프로젝트를 진행할 것으로 보입니다.멀티바이트 문자열을 받는 대부분의 Win32 API 함수들은 유니코드로 바꿔서 다시 유니코드 함수를 호출해줍니다.그러니 바로 유니코드 형식을 사용하는 편이 더 효율적이라고 할 수 있습니다.일반적으로 API 함수가 오류가 나면 함수명에 A나 W가 붙죠.MessageBox라는 메시지 박스를 띄우는 게 오류시 MessageBoxA / MessageBoxW로 표기가 됩니다.여기서 A냐 W냐가 멀티바이트 코드 함수, 유니코드 함수로 구분이 됩니다.멀티바이트 코드인가 유니코드 프로젝트인가를 확인해서 해당하는 API를 호출하는 것은 #define 전처리기를 통해 가능합니다.#define UNICODE로 정의되어 있으면 자동으로 유니코드 함수를 .. 더보기
wcout, wprintf 등에서 한글 출력 안될 때 해결법 유니코드 프로젝트에서 wcout이나 wprintf를 사용했을 때 한글이 출력이 안되는 문제가 생길 때가 있습니다.이럴 때 문제를 해결하기 위해서 setlocale() 함수를 사용하면 됩니다.main 함수 등에서 다음과 같이 호출하면 됩니다. setlocale(LC_ALL, ""); 이렇게 하면 시스템의 로케일을 따라가기 때문에 한글 윈도우에서 정상적으로 한글이 출력됩니다.""를 "korean"으로 변경하면 한글로 특정해서 호출할 수도 있습니다.wcout에서 한글이 정상적으로 출력되지 않을 때 다음과 같은 방법으로 처리할 수도 있습니다. std::wcout.imbue(std::locale("")); 이후에 wcout을 호출하게 되면 정상적으로 한글이 출력되는 것을 알 수 있습니다. 더보기
ASCII 코드표 유니코드로 프로그램을 작성하는 습관을 기르는 것이 더 좋지만 현재에도 ASCII는 많이 쓰이고 있습니다.그리고 가끔 ASCII코드가 필요할 때가 있습니다.기본적으로 대문자 A는 65, 소문자 a는 97이라는 것 정도는 알아두면 좋습니다. 그리고 97에서 65를 뺀 32값은 공백(Space)입니다.아스키 문자집합은 영미권에서 문자를 표현하기에 적합한 문자입니다.영어의 몇 개 안되는 문자를 표현하기에는 1바이트만 갖고도 충분하기 때문이죠.실제는 7비트만 사용되서 보통 128개의 문자를 사용합니다.그 중에는 제어를 위한 문자도 포함이 되어 있습니다.아스키 코드로는 다양한 문자들을 수용할 수 없기 때문에 유니코드를 사용하는 것이 좋습니다.아스키 코드를 그대로 가져가는 유니코드 방식으로 UTF-8같은 형식도 존재.. 더보기