2012-10-12 4 views
5

리눅스에서 wchar_t*을 사용하여 UTF-16으로 인코딩 된 텍스트를 저장하는 것이 합리적입니까? 명백한 문제는 wchar_t이 Linux에서 4 바이트이고 UTF-16이 대개 문자 당 두 개 (또는 때로는 두 그룹 두 개) 바이트를 사용한다는 것입니다.wchar_t?

정확히 그렇게하는 제 3 자 라이브러리를 사용하려고하는데 매우 혼란스러워 보입니다. Windows에서 wchar_t이 2 바이트이기 때문에 상황이 엉망이긴하지만 꽤 비싼 상업용 라이브러리이므로 두 번 확인하고 싶습니다. 뭔가 이해가 안 될 수도 있습니다.

+1

** ** 4 바이트 길이의 변수에 2 바이트 길이의 값을 저장할 수 있습니다 ... –

+0

나는 [this] (http://www.joelonsoftware.com/articles)를 읽고 이해해야한다고 생각합니다. /Unicode.html) –

+0

'uint16_t'를 사용하여 UTF-16 코드 단위를 나타내지 않는 이유가 있습니까? –

답변

6

은 UTF-16 wchar_t, 이러한 wchar_t 값 (또는 문자열로 사용할 그들의 배열) wchar_t 문자열 wchar_t 또는 포인터를 가지고 표준의 모든 기능과 함께 사용하기에 적합하지 저장할 수는 있지만. 따라서 "처음에는"그것이 의미가 있니? "라는 질문에 대답하기 위해 나는 확실한 대답으로 대답 할 것입니다. 물론이 목적을 위해 uint16_t을 사용할 수도 있고, C11 char16_t을 사용할 수있는 경우 사용할 수도 있습니다.하지만 처리에 C11 함수를 사용하지 않는 한 후자가 더 좋은 이유는 없습니다. 아직 구현되지 않은 것 같습니다).

3

http://userguide.icu-project.org/strings

유니 코드 표준은 16 비트 코드 단위를 기준으로 기본 인코딩을 정의했다. 이것은 UChar의 정의가 부호없는 16 비트 정수 유형이되도록 ICU에서 지원됩니다. 이것은 ICU의 문자열에 대한 문자 배열의 기본 유형입니다.

따라서 ICU를 사용하는 경우 UChar*을 사용할 수 있습니다. 그렇지 않다면 uint16_tUChar과의 상호 운용을 원한다면 쉽게 전환 할 수 있습니다.

1

글쎄, 최상의 솔루션은 표준 16 비트 문자 유형이므로 UTF-16에 char16_t을 사용하는 것입니다. 이것은 gcc 4.4부터 지원 되었기 때문에, 여러분이 보게 될 대부분의 리눅스 시스템에 존재해야합니다.

0

아니요, UTF-16을 디코딩하고 wchar_t의 배열에 저장하는 것이 좋습니다. 모든 유니 코드 코드 포인트가 UTF-16에서 정확히 하나의 16 비트 단어를 가지고있는 것은 아니지만 모두 wchar_t에 들어 맞습니다.

어쨌든 UTF-16은 다른 어떤 것보다 나쁜 절충안이므로 절대로 사용해서는 안됩니다. UTF-8 (대부분의 경우 더 효율적이고 더 일반적으로 사용됨)을 사용하거나 wchar_t []를 사용하십시오.

+3

OP는 "Windows에서 wchar_t는 2 바이트"이므로 "모두 wchar_t에 맞습니다"라는 보충 코드 포인트에 맞지 않습니다. 나는 UTF-16이 내부 표현을위한 선택의 여지가 없다는 것에 동의한다. 그것은 UTF-8 (더 복잡한 반복)과 UTF-32 (크기 팽창)의 단점을 가지고 있지만 ICU와 같은 것들의 표준이다. 이를위한 라이브러리 interop 케이스를 만들 수 있습니다. –