문제
UTF와 UC의 차이점은 무엇입니까?
C ++ 문자열에서 유럽 문자 세트 (UTF 사용)가 아닌 가장 좋은 방법은 무엇입니까? 다음에 대한 귀하의 추천을 알고 싶습니다.
- 코드 내부의 내부 표현
- 런타임에 문자열 조작
- 디스플레이 목적으로 문자열을 사용합니다.
- 최고의 스토리지 표현 (즉 파일)
- 와이어 전송 형식 (다른 아키텍처에있을 수 있고 다른 표준 로케일이있는 응용 프로그램 간 전송)
해결책
UTF와 UC의 차이점은 무엇입니까?
UCS 인코딩은 고정 너비이며 각 문자마다 사용되는 바이트 수로 표시됩니다. 예를 들어 UCS-2는 문자 당 2 바이트가 필요합니다. 사용 가능한 범위 외부의 코드 포인트가있는 문자는 UCS 인코딩에서 인코딩 할 수 없습니다.
UTF 인코딩은 가변 너비이며 문자를 저장하기 위해 최소 비트 수로 표시됩니다. 예를 들어, UTF-16은 문자 당 최소 16 비트 (2 바이트)가 필요합니다. 대형 코드 포인트가있는 문자는 UTF-16의 Astral 문자에 대해 더 많은 수의 바이트를 사용하여 인코딩됩니다.
- 코드 내부의 내부 표현
- 최고의 스토리지 표현 (예 : 파일)
- 와이어 전송 형식 (다른 아키텍처에있을 수 있고 다른 표준 로케일이있는 응용 프로그램 간 전송)
최신 시스템의 경우 가장 합리적인 저장 및 전송 인코딩은 UTF-8입니다. 기존 메일 서버의 경우 UTF-7, 제대로 작성되지 않은 텍스트 편집기의 경우 UTF-16 (UTF-16)이 적절할 수있는 특별한 경우가 있지만 UTF-8이 가장 일반적입니다.
선호하는 내부 표현은 플랫폼에 따라 다릅니다. Windows에서는 UTF-16입니다. 유닉스에서는 UCS-4입니다. 각각은 좋은 점이 있습니다.
- UTF-16 문자열은 UCS-4 문자열보다 더 많은 메모리를 사용하지 않습니다. 기본 다국어 평면 (BMP)에 캐릭터가있는 많은 큰 문자열을 저장하는 경우 UTF-16은 UCS-4보다 훨씬 적은 공간이 필요합니다. BMP 외부에서는 같은 양을 사용합니다.
- UCS-4는 추론하기가 더 쉽습니다. UTF-16 문자는 여러 "대리 쌍"에 분할 될 수 있으므로 문자열을 올바르게 분할하거나 렌더링하는 것이 어려울 수 있습니다. UCS-4 텍스트에는이 문제가 없습니다. UCS-4는 "char"배열의 ASCII 텍스트와 매우 유사하므로 기존 텍스트 알고리즘을 쉽게 포팅 할 수 있습니다.
마지막으로 일부 시스템은 UTF-8을 내부 형식으로 사용합니다. UTF-8 텍스트의 중간에 Null 바이트가 존재하지 않기 때문에 기존 ASCII-또는 ISO-8859 기반 시스템과 상호 작용 해야하는 경우 좋습니다. UTF-16 또는 UCS-4에 있습니다.
다른 팁
Joel Spolsky의 기사를 읽었습니까? 모든 소프트웨어 개발자가 절대적으로 절대적으로 최소한, 유니 코드 및 문자 세트에 대해 긍정적으로 알아야합니다 (변명 없음!)?
내가 제안 할게:
- 코드의 표현을 위해
wchar_t
또는 동등한. - 스토리지 표현의 경우 UTF-8.
- 와이어 표현의 경우 UTF-8.
스토리지 및 와이어 상황에서 UTF-8의 장점은 기계 엔지니어가 요인이 아니라는 것입니다. 다음과 같은 고정 크기 문자 사용의 이점 wchar_t
코드에서는 문자열을 스캔하지 않고도 문자열의 길이를 쉽게 찾을 수 있다는 것입니다.
UTC는 캐릭터 세트가 아닌 보편적 인 시간입니다 (UTC라는 숯불을 찾지 못했습니다).
내부 표현을 위해 사용하고 싶을 수도 있습니다 wchar_t
각 캐릭터와 문자열에 대한 std :: wstring. 각 문자마다 정확히 2 바이트를 사용하므로 찾는 것과 임의의 액세스가 빠릅니다.
스토리지의 경우 대부분의 데이터가 ASCII (IE Code> = 128)가 아닌 경우 직렬화와 거의 동일한 UTF-16을 사용할 수 있습니다. wstring
그리고 wchar_t
.
UTF-16은 Little Endian 또는 Big Endian 일 수 있으므로 와이어 운송의 경우 아키텍처 독립적 인 UTF-8로 변환하십시오.
코드 내부의 내부 표현에서 유럽 및 비 유럽 문자 모두에 대해이 작업을 수행하는 것이 좋습니다.
unnnn
u0020에서 u007e 범위의 문자, 약간의 공백 (예 : 줄 끝)을 일반 문자로 작성할 수 있습니다. u0080 이상의 것, 평범한 캐릭터로 작성하면 코드 페이지에서만 컴파일됩니다 (예 : 프랑스에서는 괜찮지 만 러시아에서는 러시아에서 OK, 일본에서는 중단하지만 중국에서는 미국에서 깨지는 등 .).