2011-10-25 4 views
1

알아볼 수없는 기괴한 유니 코드 관련 문제가 발생했습니다.유니 코드 변환 문제 C++

기본적으로 명령 줄에서 수동으로 실행하면 다양한 입력에 대해 mbtowcs()가 성공적으로 호출되는 명령 줄 응용 프로그램이 있습니다 (http://www.cplusplus.com/reference/clibrary/cstdlib/mbstowcs). /)는 문자열을 조작하고 적절한 출력을 반환합니다.

응용 프로그램이 monit을 통해 자동으로 실행될 때마다이 함수는 정확한 바이트 수를 더 이상 변환하지 않으며 기본적으로 출력이 왜곡되어 유니 코드 오류 다이아몬드가 산재 해 있습니다. 나는 동일한 입력에 대해 이것을 테스트했다.

이것이 로케일 또는 컴퓨터의 일부 설정 (Ubuntu 서버 11.04)과 관련이 있다고 생각됩니다. 나는 setlocale (LC_CTYPE, "");을 호출하고있다. 내 시작 기능에서 성공적으로.

내 코드가 제대로 작동하려면 어떤 시스템 설정을 변경해야하는지 조언 해 줄 수 있습니까?

업데이트 : 문제를 해결 할 수 있습니다

setlocale(LC_CTYPE, "en_US.UTF-8"); 

setlocale(LC_CTYPE, ""); 

을 변경하는 것 같은데. 누구나 이것이 필요한 이유에 대한 정보를 제공하거나이를 피하기 위해 시스템 설정을 어떻게 바꿀 수 있습니까?

+0

왜 처음에는 setlocale()을 호출합니까? UTF-8은 Linux의 모든 문자열에 대한 기본 인코딩으로 널리 사용됩니다. –

답변

0

바이트 문자열에서 wchar_t 문자열로 변환하는 것이 로캘에 의존해야한다는 것이 있습니다. 이것은 mbstowcs 함수가 바이트 문자열을 입력하는 문자 인코딩을 알아야하기 때문에 일반적으로 로케일을 사용하여 추측을 돕습니다.

귀하의 의견 바이트 인 경우 :

다음
C3 B6 

으로 해석하는 경우 UTF-8의

00F6 

wchar_t 순서입니다 그러나 그 문자열 ISO-8859-1로 해석하는 경우 문자열 öö 이는

00C3 00B6 

wchar_t의 시퀀스는 이제 어떤 바이트 시퀀스는 특정 encodin 유효하지 gs, 당신의 유니 코드 오류 다이아몬드를 설명 할 가능성이 있습니다. 로케일을 어지럽히고 싶지 않은 경우 iconv 라이브러리를 대신 사용할 수 있습니다. wchar_t 유형은 일반적으로 UTF-32 인코딩 (LE 또는 BE) 중 하나에 해당하지만 휴대용이 될지 여부는 잘 모르겠습니다.

+0

나는 wchar_t를 누가 리눅스에서 사용할 것인가? 그리고 그 이유는 무엇인가? –

+0

텍스트/문자 분석을 할 때 유용합니다. 예 : 공백, 문자, 숫자 등을 감지 함 – Sodved

+0

유용하지 않음)) utf8everywhere.org –