2013-07-29 3 views
4

다른 플랫폼 (Windows 및 Linux)의 인코딩에 문제가 있습니다. 윈도우에서는 wchar_t의 크기가 2 바이트인데 반해 Linux에서는 4 바이트입니다. wchar_t를 두 플랫폼에서 같은 크기로 "표준화"할 수 있습니까? 추가 라이브러리없이 구현하기가 어렵습니까? 지금은 printf/wprintf API를 목표로하고 있습니다. 데이터는 소켓 통신을 통해 전송됩니다. 고맙습니다.다른 플랫폼에서 wchar_t 인코딩

+2

'wchar_t '로 할 수있는 유용한 것들은 이식성이 없으며'wchar_t'로 할 수있는 유용한 것들은 유용하지 않습니다. 죄송합니다. 다른 것을 사용하십시오. –

답변

3

다른 플랫폼과 아키텍처에서 유니 코드 데이터를 보내려면 UTF-8 인코딩과 (8 비트) char을 사용하는 것이 좋습니다. UTF-8에는 endiannes 문제가없는 것과 같은 몇 가지 이점이 있습니다 (UTF-8은 단순한 바이트 순서입니다. 대신 UTF-16 및 UTF-32 모두 little-endian 또는 big-endian이 될 수 있습니다 ...).

Windows에서 Windows API는 UTF-16에서 작동하기 때문에 Win32 API 경계에서 UTF-8 텍스트를 UTF-16으로 변환하면됩니다. 이를 위해 MultiByteToWideChar() API를 사용할 수 있습니다.

+1

이것이 정답 인 이유에 대한 자세한 내용은 http://www.utf8everywhere.org/를 참조하십시오. –

+0

고마워, 왜 내가이 hehe에 대해 생각할 수 없는지 생각하고있어. Solved :-) – user2399415

0

나는이 문제를 해결하기 위해 전송하기 전에 모든 문자열을 UTF-8로 변환해야한다고 생각합니다. Windows에서는 WideCharToMultiByte 함수를 사용하여 wchar_t 문자열을 UTF-8 문자열로 변환하고 MultiByteToWideChar을 사용하여 UTF-8 문자열을 wchar_t 문자열로 변환합니다.

Linux에서는 일들이 쉽지 않습니다. wctombmbtowc 기능을 사용할 수 있지만 변환 대상은 기본 로케일 설정에 따라 다릅니다. 따라서 이들을 UTF-8 및 유니 코드로 /로 변환하려면 로케일이 UTF-8 인코딩을 사용하도록 설정해야합니다.

This 문서는 좋은 자료 일 수도 있습니다.

+0

리눅스에서는'iconv_open ("UTF-8", "WCHAR_T")'을 사용하여'iconv()'변환 디스크립터를 열고'wchar_t' 문자열을 UTF-8 문자열로 변환 할 수 있습니다. 반대로). – caf