2010-04-27 3 views
7

Windows와 다른 플랫폼에서 쉽게 char * 문자열을 사용하여 UTF-8로 처리 할 수 ​​있습니다.크로스 플랫폼 친화적 인 방법으로 C/C++에서 유니 코드 문자열을 처리하는 방법은 무엇입니까?

문제는 Windows에서 wchar * strings (W)를 사용하여 메시지를 수락하고 보내야한다는 것입니다. ANSI 함수 (A)를 사용하면 유니 코드를 지원하지 않습니다.

진정한 휴대용 응용 프로그램을 작성하려면 Windows에서 유니 코드로 컴파일해야합니다.

이제 코드를 깨끗하게 유지하기 위해 코드에서의 추악함을 최소화하는 방법으로 문자열을 처리하는 데 권장되는 방법을보고 싶습니다.

필요할 수있는 문자열의 종류 : std::string, std::wstring, std::tstring, char *, wchat_t *, TCHAR*, CString (ATL 일).

발생할 수있는 문제 :

  • cout/cerr/cin과 유니 코드 wcout,wcerr,wcin
  • 모든 이름이 넓은 문자열 기능과 TCHAR 매크로 변형 - strcmp, wcscmp_tcscmp 등이.
  • 코드 내부에 상수 문자열이 있습니다. TCHAR을 사용하면 코드를 _T() 매크로로 채워야합니다.

가장 좋은 것으로 보이는 접근 방법은 무엇입니까? (사례를 환영합니다)

개인적으로는 std::tstring 접근 방식을 사용 하겠지만 필요한 경우 전환을 어떻게 수행하는지 알고 싶습니다.

+1

http://utf8everywhere.org는이 모든 것을 설명합니다. –

답변

3

이 라이브러리를 확인하는 것이 좋습니다. http://cppcms.sourceforge.net/boost_locale/docs/
도움이 될 수도 있지만 지금은 도움이 될 것입니다.하지만 도움이 될 것이라고 생각합니다.

+0

최신 설명서는 http://cppcms.sourceforge.net/boost_locale/html/tutorial.html에 있습니다. – Artyom

+0

감사 : 어떻게 되가? 아직 끝났습니까? –

+1

잘 작동합니다.나는 bjam/boost-build가 ICU 라이브러리를 올바르게 찾을 수있게하고 boost-locale을 빌드하기 위해 boost-build에서 몇 가지 수정을 기다린다. – Artyom

1

Wnt32 API와 상호 작용하기 전에 모든 문자열을 UTF-8로 인코딩하여 UTF-16으로 변환 할 수 있습니다. 당신이 휴대용 코드를 작성하는 경우 몇 가지 쉬운

1

을 변환 기능을 사용하는 UTF8-CPP 도서관에서보세요 : (UTF-16 창을

1은 휴대용도있다 wchar_t를 사용하지 마십시오을하고 인코딩이 아니라 플랫폼 사이에 정의되지 않은/utf-32 다른 모든 것).

절대 TChar를 사용하지 말고 일반 std::string을 UTF-8로 인코딩하십시오.

Brain Damaged Win32 API를 사용할 때 UTF-8 문자열을 호출하기 전에 UTF-8 문자열을 UTF-16으로 변환하면됩니다.

https://stackoverflow.com/questions/1049947/should-utf-16-be-considered-harmful 또한 Windows 프로젝트에서 UTF-8을 기본 인코딩으로 채택하는 방법을 참조하십시오.

+1

을 실행하면'std :: string msg = "महसुस";', 나는 그것을 볼 수 없습니다. 모든 것이 물음표로 바뀝니다. 어떤 생각? –

+2

이 답변에서 언급 된 SO 게시물은 이제 죽은 링크입니다. 중요한 게시물 인 것처럼 보입니다. – Dan

+0

UTF-16을 사용하는 창에 대해 손상된 뇌는 없습니다. Windows는 Windows NT (1993 년 출시)로 유니 코드 지원을 시작했습니다. UTF-8은 1992 년 9 월 https://www.cl.cam.ac.uk/~mgk25/ucs/utf-8-history.txt의 개념으로 창안 되었기 때문에 Windows에서 채택 할 수있는 방법이 없었습니다. 사실 Windows는 매우 진보적 인 유니 코드 얼리 어답터였습니다. 아마도 너무 일찍 나타났습니다. –

관련 문제