char로 utf8 형을 받을 수 있나요?
글쓴이: ljs0652 / 작성시간: 화, 2018/10/23 - 5:14오후
UTF8이 유니코드로 알고 있는데요 유니코드는 2바이트라고 알고 있는데 CHAR로 받을 수가 있는건가요??
궁금한 이유는 제가 rapidjson이라는 것을 쓰려고 하는데
Document라는 걸 쓸때 설명에
typedef rapidjson::UTF8, rapidjson::MemoryPoolAllocator, rapidjson::CrtAlocator>rapidjson::Document ! GenericDocument with UTF8 encoding
이렇게 되어있어서요 실제로 데이터를 char 배열로 받기두 하구요
Forums:
유니코드는 2바이트라고 알고 있는데 아닙니다.
유니코드는 2바이트라고 알고 있는데
아닙니다.
https://ko.m.wikipedia.org
https://ko.m.wikipedia.org/wiki/UTF-8
세벌 https://sebuls.blogspot.kr/
.
"받을 수 있나?" 라고 하는 질문은 굉장히 모호한 질문입니다.
엄밀히 말해서 1바이트 이상이기만 하면 당연히 char 은 무엇이든 저장합니다.
다만 wchar_t 와 같은 widechar 타입이 있는 건 스트링 처리에 있어서
2바이트 이상의 단위를 char 로 처리하자니 여러모로 불편할 수 밖에 없기 때문에
별도의 타입을 만들어놓은 것입니다.
그리고 유니코드 자체는 별 희한한 문자들을 다 포함하기 때문에, 당연히
현재까지의 유니코드 평면은 2바이트(65536) 범위를 이미 넘었습니다.
중간 중간에 비어있는 것도 있지만, 사실 한자+한글만 해도 이미 3만자가
넘기 때문에 당연하다면 당연합니다.
유니코드 자체는 한 문자에 몇 바이트라고 표현하지 않습니다.
이 문자들을 어떻게 인코딩하여 나타낼지에 대해서 우리가 흔히 말하는
UTF-8, UTF-16, UTF-32 등의 인코딩 종류가 있는 것입니다.
UTF-8 의 경우 기존 ASCII 와 호환을 위해서 0x7F 까지만 1바이트로 표현하고
그 외에는 각각 별도로 범위를 정해서 2, 3, 4바이트 등으로 표현합니다.
UTF-16 은 기본 다국어 평면(BMP) 은 2바이트, 그 외에 4바이트로 표현합니다.
기타 다른 인코딩들도 비슷하게 그 나름의 규칙을 갖고 표현합니다.
그래서 정확히는 유니코드가 몇 바이트라고 하는 것이 아니라, 위에 언급한
특정 유니코드 인코딩에 대해 한 문자가 몇 바이트인지를 말해야 합니다.
그런데 질문자분과 같이 이에 대해 헷갈리는 경우가 꽤 생기는 이유는,
Windows 가 현재 기본으로 사용하는 UTF-16 에 대한 표현을 그냥 유니코드 라고
표시한 경우가 많은 것이 이유 중 하나라고 생각합니다. 가령 메모장에서
파일을 저장할 때, 인코딩에 유니코드(Unicode) 가 있는데 이는 정확히는
UTF-16 인코딩으로 저장하는 것을 말하는 것입니다.
(사실상 Windows API 등에서 유니코드 라고 하면 UTF-16 으로 이해해야 합니다.
물론 Windows 2000 이전에는 UCS-2 였지만 BMP 뒤의 평면을 제외하면 같은 거라.)
설명이 조금 장황해졌는데, 질문으로 돌아가서 UTF-8 은 위에서 언급했다시피
가변 길이 인코딩이고 1바이트 ~ 4바이트 까지 가변적인 길이를 갖습니다.
이 말은 2바이트 이상의 단위로 저장하면 여러모로 문제가 많아진다는 얘기입니다.
단적으로 아시겠지만 한글은 UTF-8 인코딩에서 3바이트를 차지하기 때문에
2바이트 타입으로 저장하면 문제가 많을 수 밖에 없습니다.
따라서 보통 UTF-8 의 경우 char 로 저장하는 경우가 많습니다.
받아서 ucs4로 변환해야 문자를 색인가능합니다.
utf8은 1~6바이트까지 가변입니다.
받아서 ucs4(utf32)로 변환해야 문자를 색인할 수 있습니다.
변환 과정은 알면 의외로 간단합니다.
단 영문 알파벳이나 숫자만 들어온다는 전제 하에서는 그냥 char로 받아서 기존 ascii 문자열 다루듯이 처리해도 됩니다. utf8 중에서도 1byte로 표현가능한 것들은 ascii와 똑같습니다.
ucs4(utf32) 변환할때는 최상위 비트 쓰는일이 많기 때문에 char 보다는 unsigned char가 낫습니다.
Written By the Black Knight of Destruction
댓글 달기