본문 바로가기

unicode

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같은 형식도 존재.. 더보기
한글 윈도우즈, Visual C++ 한글 처리 방식 이 세상에는 상당히 많은 수의 문자가 존재합니다.얼핏 떠오르는 문자로 영어의 알파벳, 일본어의 히라가나와 가타카나, 우리의 한글, 중국 한자 등등 상당히 많은 수의 문자가 있습니다.C/C++에서는 기본적으로 char 형을 사용해서 문자를 표현합니다.하지만 char 형은 1바이트 크기 밖에 되지 않습니다.그래서 아무리 많이 쓰려고 발버둥을 쳐봐도 256가지(2의 8 승)의 문자밖에 표현하지 못합니다.그래서 영어와 몇몇의 기호, 숫자 만을 표현하게 했는데, 이것이 바로 ASCII 코드입니다.하지만 다양한 언어를 포괄하기 위해서는 좀 더 큰 크기가 필요하게 됩니다.크기를 잘못 잡아서 문제가 생기는 경우를 종종 발견할 수 있습니다.IPv4와 IPv6가 대표적으로 크기를 잘못 잡아서 발생한 문제입니다.이렇게 해서.. 더보기