여러 C++ 강의를 보다보면 문자열앞에 L을 붙이는걸 자주 볼 수 있었다.
그냥 단순히 문자열을 사용하는게 아니라 L을 붙이는 형태가 기본 처럼 보일 정도로 자주 보인다.
찾아보니 C/C++의 기본 문자열은 언어 호환성 문제가 있어 기피되는 듯 하다.
분명 예전에 POCU강의에서 이와 관련하며 학습을 했었는데 똑바로 하지 않았나 보다...
하나 또는 두 바이트를 사용하며 문자를 표현하는 방식
MBCS (Multi-byte character set) 또는 DBCS(double-byte character set)라고 함.
C/C++의 기본 문자 표현 방식이다.
한 문자열에 문자 마다 길이가 다를 수 있어 프로그래머가 문자열 처리하기 어려움이 있다.
유니코드를 표현하기 위한 문자 자료형
wchar_t라는 자료형으로 사용함.
C/C++에서는 문자열 앞에 L을 붙여서 사용한다.
유니코드를 표현하는 건 좋았는데 운영체제 마다 문자를 저장하는 방식(Encoding)이 다를 수 있어, 여전히 호환성 문제가 생길 수 있다.
컴퓨터는 이진 정보를 처리하는 장비이므로(현재까지는? 앞으로도?) 어쨌거나 저장을 하려면 1과 0로된 이진 데이터형태로 변환해야 한다.
C언어를 학습할 때 자주 보게되는 아스키 테이블 같은 경우 아스키 테이블은 문자집합이지만 각 문자에 해당되는 번호가 이진수형태로 바로 저장된다.
그래서 문자 번호를 이진 데이터로 변환하는 인코딩 과정에 대해서 그다지 생각하며 학습해나가지 않았다.
즉, 문자를 표현하는 방식과 문자를 저장하는 방식을 분간하지 못하고 있었다.
유니코드 또한 아스키 테이블처럼 각 문자들을 나열해서 번호를 매긴 체계이다.
하지만 유니코드는 아스키 테이블 처럼 그렇게 매긴 번호를 그대로 저장하지 않는다.
유니코드를 이진 데이터 형태로 변환하는(저장하는) 방식은 여러가지가 있으며 가장 대중적으로 사용되는 인코딩 방식은 UTF-8이라 부르는 방식이다.
문자열에 해달하는 바이트 묶음에는 해당 비트패턴을 어떻게 읽어야 하는지 설명해주는 정보가 없다.
멀티 바이트 문자열을 출력할 때, 출력하는 장비의 사용자 환경에 정의 된 문자집합과 대조하여 해당되는 문자 번호에 매핑되는 문자의 폰트로 표현함.
확장 아스키 테이블에는 코드 페이지라는 개념이 존재하는데, 기존 아스키 테이블을 표현하려면 1바이트 중 7비트만 있으면 된다. 표현가능한 256가지 수 중 절반만 사용하는데, 확장 아스키에서는 나머지 절반과 1바이트를 추가로 활용한다.
이 추가로 활용되는 영역과 특정 코드 페이지를 매핑하여 문자를 표현한다.
2바이트로도 모든 언어를 포함하는 것은 불가능 하기에 보통 언어권 별 코드 페이지가 따로 존재한다.(한국의 경우 CP-949)
이는 한 이진 데이터가 코드페이지에 따라 다른 문자로 표현이 될 수 있음을 의미하고 코드페이지가 다르면 의도한 대로 문자가 표현되지 않는 문제로 이어진다.
문자를 컴퓨터에 저장하는 것을 문자 인코딩이라 부른다.
멀티 바이트 문자 저장은 ASCII테이블과 호환을 위해 [0x00-0x7F]사이의 번호는 그대로 저장한다. 그래서 영어문자만 다룰때에는 흔히 1바이트로 생각한다.
ASCII테이블 범위 밖의 [0x81 이후와 후행 1바이트]영역은 사용자 환경에 정의되어 있는 코드페이지 별로 다르게 인코딩 된다.
선행 바이트와 후행바이트로 나눠져 있을 뿐 코드페이지의 정의 된 숫자가 아스키와 마찬가지도 그대로 이진형태로 저장된다.
각 운영체제를 타겟으로 하는 컴파일러가 사용하는 인코딩 형식(UCS2, UTF-32)을 그대로 디코딩하여 유니코드 번호를 추출하고 해당 번호에 매핑되는 문자를 폰트에 맞게 표현함.
운영체제마다 다른 인코딩을 사용하는 이유는 표준만들때 명시적으로 어떤 인코딩을 쓰라고는 안 적어놨데...
유니코드라는 문자 집합에서 정의 된 문자 번호(유니코드 포인트)를 특정 인코딩 방식으로 저장한다.
윈도우에서는 UCS2을 사용했었다. 현재는 UTF-16을 사용한다는 글도 보았지만 확실하지 않다. 만약 UCS2를 사용한다면 UCS2의 한계도 그대로 단점이 된다.
리눅스에서는 UTF-32로 저장한다.
한글 인코딩의 이해 1편
MSDN MBCS 지원
UTF-8 Wiki
UTF-16 Wiki
UTF-32 Wiki
Unicode version 15.0