2014-05-11 3 views
-2

wchar_t (2 바이트 또는 4 바이트) 사용과 비 서구 언어 용 텍스트 처리 프로그래밍에 UTF-8 인코딩을 사용하는 것의 차이점은 무엇입니까?비 서구 언어와 함께 wchar_t 대신 UTF-8을 사용하면 불편한 점이 있습니까?

wchar_t를 사용할 때 C 또는 C++ 라이브러리에서 넓은 버전의 문자열 함수를 동일한 방식으로 사용할 수 있고 비 와이드 형으로 쉽게 사용할 수 있습니다. 표준 스트링 함수의 다양한 버전을 사용하는 것에 비해 서구 텍스트가 아닌 문자열에 몇 가지 추가 처리를 추가하는 UTF-8에 몇 가지 문제점이 있습니까?

+1

관련 MS 와이드 printf/scanf 기능이 표준과 호환되지 않습니다. 또한, 귀하의 질문은 꽤 편견이 있습니다. 어떤 것이 든, 나는 UTF-8에 대한 모든 방법을 제안하고 MS API를 호출 할 때만 변환을 제안합니다. – Deduplicator

+1

참고 : 리눅스에서 모든 일반 문자열 기능은 문제없이 기본적으로 utf-8에서 작동합니다. Windows 프로그램에 관해서 이야기 할 때만 문제가 있습니다. –

+0

@Deduplicator 당신이 문자열을 그냥 통과한다면 나는 당신과 동의 할 것입니다. 그러나 실제 문자열 조작 (특히 전체 코드 포인트 고려)을 수행해야하는 경우 'char32_t'는 항상 단위 당 하나의 코드 포인트가되도록 보장되므로 바람직한 직렬화입니다. 나는 여전히 UTF-8로 출력 할 것입니다. – Mgetz

답변

3

라이브러리 함수가 UTF-8에서 작동한다고 가정하면 (일반적으로 Windows에서는 그렇지 않습니다) 실제로 라이브러리 함수를 사용하는 한 실제 문제는 없습니다. 그러나 문자열 배열의 개별 요소를 수동으로 해석하는 코드를 작성하는 경우 코드 포인트가 UTF-8로 된 단일 바이트 이상임을 고려한 코드를 작성해야합니다. 특히 영어 이외의 문자를 처리 할 때는 (예 : 'ä', 'ö', 'ü'와 같은 독일어/스칸디나비아 문자 포함). 또한 엔트리 당 16 비트가 있더라도 하나의 코드 포인트가 2 개의 16 비트 엔트리를 차지하는 상황을 발견 할 수 있습니다.

이것을 고려하지 않으면 별도의 부품이 처리를 "혼동"시킬 수 있습니다. 코드 포인트의 중간에있는 것을 사물의 중간 인 것과는 다른 의미로 인식합니다.

코드 포인트의 가변 길이는 예를 들어 문자열 길이 및 하위 문자열과 같은 모든 흥미로운 영향을줍니다. 길이는 문자열을 포함하는 배열의 요소 수에 해당합니다. 코드 포인트의 수.

어떤 인코딩이 사용 되든, 예를 들어 아라비아어에서는 개별 문자를 함께 연결해야하는 경우가 있습니다. 이것은 실제로 캐릭터를 그릴 때만 중요하지만 최소한 염두에 두어야 할 가치가 있습니다. (내 글에 대한!)

용어 :

문자는 화면에 표시 할 수있는 문자/기호 등을 =.

코드 포인트 = 문자열의 문자 표현은 문자열 배열의 하나 이상의 요소 일 수 있습니다.

문자열 배열 = 문자열의 저장은, 캐릭터의 고정 된 크기 (예를 들어 8 비트, 16 비트, 32 비트, 64 비트)

문자열 요소 = 하나의 유닛의 요소로 구성 정렬.

+1

"문자"에는 많은 의미가 있습니다 (예 : byte, codeunit, codepoint, grapheme, grapheme-cluster). 이 Q & A는 실제로 명시 적으로 차별화되어야합니다. – Deduplicator

+0

예, 좋은 지적입니다. –

+0

(나는 실제로는 할 수 없다.)하지만 화면에 표시되는 기호는 문자가 아닌 글리프 (glyph)이다. ;) – jalf