2010-04-29 2 views
12

C++ ICU 라이브러리를 시작하는 데 어려움을 겪고 있습니다. 나는 간단한 예제를 얻으려고 노력했지만, 심지어 실패했다. UTF-8 문자열을 출력 한 다음 거기에서부터 이동하려고합니다. 여기ICU가있는 C++ UTF-8 출력

내가 무엇을 가지고 : 여기

#include <unicode/unistr.h> 
#include <unicode/ustream.h> 

#include <iostream> 

int main() 
{ 
    UnicodeString s = UNICODE_STRING_SIMPLE("привет"); 

    std::cout << s << std::endl; 

    return 0; 
} 

는 출력 :

$ g++ -I/sw/include -licucore -Wall -Werror -o icu_test main.cpp 
$ ./icu_test 
пÑÐ¸Ð²ÐµÑ 

내 터미널 및 글꼴 지원 UTF-8과 나는 정기적으로 UTF-8로 터미널을 사용합니다. 내 소스 코드는 UTF-8입니다.

ICU가 문자열을 UTF-16으로 저장하기 때문에 출력 스트림을 UTF-8로 설정해야 할 필요가 있다고 생각하지만 실제로 확신이 없으며 ustream.h에서 제공하는 연산자가 어쨌든 그렇게해라.

도움을 주시면 감사하겠습니다. 감사합니다. 당신이 출력을 파일로 작성하는 경우 실패 터미널 있는지 여부를 결정하는 것입니다

(중 터미널에서 파이프를 사용하여 리디렉션, 또는 프로그램 자체에서 파일 스트림을 열어) 어떻게됩니까

+1

std :: wcout을 사용해 보셨습니까? – Milan

+1

예, ICU는 연산자 <<를 제공하지 않는 것 같습니다. 그래서 g ++에서 오류 목록이 길어집니다. – Isaac

+0

wcout에 버그를 신고 했습니까? (제발? :) (칭의와 함께?) –

답변

12

프로그램이 작동합니다

UnicodeString s("привет"); 

사용 된 매크로를 only for strings that contain "invariant characters", i.e., only latin letters, digits, and some punctuation입니다.

앞에서 언급했듯이 입력/출력 코드 페이지는 까다 롭습니다. 당신은 말했다 :

내 터미널과 글꼴 지원 UTF-8 및 나는 정기적으로 UTF-8로 터미널을 사용합니다. 내 소스 코드는 UTF-8입니다.

사실 일 수도 있지만 ICU는 그 사실을 알지 못합니다. 프로세스 코드 페이지가 다를 수 있습니다 (iso-8859-1라고 가정 해 봅시다). 출력 코드 페이지가 다를 수도 있습니다 (shift-jis라고합시다). 그런 다음 프로그램이 작동하지 않습니다. 그러나 API UNICODE_STRING_SIMPLE을 사용하는 불변 문자는 여전히 작동합니다.

희망이 도움이됩니다.

SRL, ICU dev에

+0

고마워요! 그것은 실제로 효과가 있습니다. 당신이 'icu dev'로 서명했기 때문에 ICU 도움말을위한 IRC 채널에 대해 알고 있습니까? 나는 수색했다. 그러나 나는 아무것도 발견 할 수 없었다. – Isaac

+0

IRC 채널에 대해 잘 모릅니다. 인기가 있습니까? 가끔은 여기에서 (때로는 다른 웹 검색을 통해) 볼 수 있지만 http://icu-project.org의 icu 지원 메일 링리스트 및 버그 데이터베이스가 주요 채널입니다. 재미있는 아이디어입니다. 당신은 거기에 그것을 제안 할 수 있습니다. 저는 C/C++ 용 ICU의 기술 책임자입니다. –

+0

글쎄, 나는 지난 며칠 동안 유니 코드 솔루션을 찾기 위해 많은 노력을 해왔고 ICU는 내가 읽은 모든 소스에서 C++에 대한 '최고의'것으로 간주됩니다. 동일한 출처의 모든 사람들은 또한 문서가 심각하게 부족하고 동일한 것을 말하는 다른 포럼 게시물이 많이 있다고 불평합니다. 내가 '안녕하세요 세상'스타일의 프로그램을 작동시킬조차 수 없다는 것을 감안할 때, 나는 이것에 동의 할 것이다. 미안하다. 나는 그것이 당신의 잘못이 아니라는 것을 알고 있습니다. 그러나 영향력이 있다면, 문서 개선에 대한 제안을하십시오. – Isaac

2

출력을 올바르게 처리 할 수 ​​있습니다.

디버거에서 출력 문자열을 검사하면 어떻게됩니까? 올바른 값을 포함하고 있습니까? 문자열 의 UTF-8 인코딩이처럼 보이는지 확인하고 디버거에서 얻은 결과와 비교하십시오. 또는 각 바이트의 정수 값을 인쇄하여 올바른지 확인하십시오.

인코딩 작업시 텍스트가 시스템에 출력 될 때 발생하는 변환 자체 또는 프로그램 자체에 문제가 있는지 여부를 결정하는 것은 항상 까다로워 야하지만 필수적입니다. 방정식에서 터미널을 제거하고 프로그램이 올바른 출력을 생성하는지 확인하십시오. 당신은 단지에 이니셜을 변경하는 경우

+0

파일에 쓰는 것은 인코딩 디버깅에 아주 좋은 단계입니다. –

+0

방금 ​​파일에 작성 했으므로 같은 결과가 나옵니다. 지금 당장 디버거를 살펴볼 것입니다. – Isaac

1

operator<<(ostream, UnicodeString)는 ICU의 "기본 계산기"를 사용하여 UTF16와 문자 사이의 변환합니다.AFAIU, "default converter"(명시 적으로 ucnv_setDefaultName()으로 설정하지 않은 경우)는 ICU가 컴파일 된 플랫폼 및 방식에 따라 다릅니다. ucnv_getDefaultName()에서 무엇을 얻나요?

+1

FWIW 독립 실행 형 도구 'icuinfo'는 4.4로 기본 코드 페이지를보고합니다. 기본 변환기는 많은 야생하고 멋진 곳에서 올 수 있습니다. –

+0

내 문제가 해결되었지만 질문에 대답하기 위해 'en_GB'가 표시됩니다. – Isaac

+1

icuinfo는 다음과 같이 반환해야합니다. 기본 로캘 : en_US ... 기본 변환기 : UTF-8 –