2010-05-07 1 views
3

Visual C++ 프로젝트를 GCC로 이식 할 때 wchar_t 데이터 유형이 기본적으로 4 바이트 UTF-32라는 것을 알았습니다. 나는 컴파일러 옵션으로이를 오버라이드 할 수 있지만, RTL의 전체 wcs * (wcslen, wcscmp 등) 부분은 4 바이트의 넓은 문자열을 가정하기 때문에 사용할 수 없게 렌더링됩니다.GCC에 2 바이트 (UCS-2) 와이드 문자열

지금은 처음부터이 함수 중 5-6을 다시 구현했고 #define은 내 구현을 정의했습니다.하지만 좀 더 우아한 옵션이 있습니다. 예를 들어 2 바이트 wchar-t가있는 GCC RTL 빌드가 조용히 앉아 있습니다. 어딘가, 연결되기를 기다리고 있니?

GCC의 특정 특징은 Mac OS X, Cygwin 및 Debian Linux Etch에 포함 된 Xcode입니다.

답변

0

재 구현 5-6 * 기능, 내 구현을 #define에 의해 정의. 다시 쓰기

1

ICU library을 살펴보십시오. UTF-16 API가있는 이식 가능한 라이브러리입니다.

+0

내 모든 MSVC 넓은 문자열 코드 미안, 무엇을 찾고 있어요되지 않습니다. UCS-2 RTL과의 소스 호환성을 원합니다. –

+1

* 내 회사는 그런 도서관을 파는 중이다. 나는 ICU가 가장 가까운 대안이라고 합리적으로 확신한다. – bmargulies

1

wchar_t는 구현에 따라 정의되었습니다. 해당 데이터 형식으로 이식 할 수있는 방법은 없습니다.

리눅스 시스템은 일반적으로 전체 UCS-2 붕괴가 그렇게 좋지 않은 것으로 선언되고 UTF-8을 인코딩으로 사용한 후에 나중에 유니 코드 지원을 얻는 이점이있었습니다. 모든 시스템 API는 여전히 char *에서 작동하며 유니 코드에 안전합니다. Qt는, ICU 등 Cygwin에서 쉽게 윈도우와 맞 물리는 만들기 위해 2 바이트의 wchar_t를 갖추고 있음을

참고 :

귀하의 최상의 선택은 당신을 위해 이것을 관리하는 라이브러리를 사용한다.

2

하지만 좀 더 우아한 옵션이 있습니다. 예를 들어 어딘가에 조용히 앉아 있고 연결되기를 기다리는 2 바이트 wchar-t가있는 GCC RTL 빌드가 있습니까?

아니요. 이것은 플랫폼 관련 문제이며 GCC 문제는 아닙니다.

즉, Linux 플랫폼 ABI는 wchar_t이 32 비트 폭으로 지정되므로 ICU가 널리 사용되는 완전히 새로운 라이브러리를 사용해야하거나 4 비트를 처리하도록 코드를 포팅해야합니다. 바이트 wchar_t s. 링크 할 수있는 모든 라이브러리는 GCC의 -fshort-wchar을 사용하는 경우 4 바이트 wchar_t, 그리고 이라고 가정합니다.

그러나 Linux의 경우 거의 모든 사람이 모든 멀티 바이트 인코딩에 대해 UTF-8로 표준화했습니다. 일반적인 WCS의

+0

포인트가 찍혔습니다. 레코드의 경우, UTF-8의 중요한 문자열 처리는 비닐 봉지를 빨아들입니다. 문자열의 i 번째 문자 (바이트가 아님)로 반복하는 것은 O (i) 연산입니다. –

+0

그러나 요즘은 거의 모든 Linux 시스템에 구성된 로케일이므로 처리해야 할 부분입니다. – greyfade

+3

@Steva : UTF-16도 같은 문제가 있습니다. UCS-2 (pre Win2k)와 UTF-16 (Win2k +)을 혼동하지 마십시오. –