2016-12-19 10 views
1

Windows에서 Linux로 응용 프로그램을 이식했을 때 문자 인코딩에 문제가 발생했습니다. Visual Studio에서 액센트가있는 문자 (예 : 'é' 'à')는 wchar_t (g ++에서는 4 바이트)으로 간주되는 반면, Visual Studio에서는 1 바이트 (char). 필자의 코드에서는 악센트 부호가있는 문자를 사용하여 문자 비교를했기 때문에 단위 테스트가 실패했습니다 (리눅스에서와 같이 멀티 바이트입니다).악센트 부호가있는 문자 (wchar_t)를 char로 변환하는 방법은 무엇입니까?

'û'와 같은 악센트 부호가있는 문자를 Linux의 Windows 인코딩 (1 바이트)으로 변환 할 수 있습니까? 아니면 코드를 리팩토링하고 std::wstring을 사용해야합니까?

+2

wchar_t는 Windows에서는 2 바이트 (UTF-16), 다른 시스템에서는 4 바이트 (UTF-32)입니다. 데이터가 실제로 1 바이트 문자를 사용하고 있다면, 대신에'char'를 사용하고 있기 때문에 charset 코드 페이지 처리의 대상이됩니다. 이를 Linux로 이식하려면 데이터를 UTF 인코딩 (8, 16 또는 32)으로 다시 인코딩 한 다음 휴대용 유니 코드 비교를 사용해야합니다. –

+0

프랑스어 액센트 문자 크기는 Windows 시스템에서 1 바이트 (char)입니다. 그래서 내 코드에서 문자 비교 (예 : if (strMystring [i] == 'é') ...) Linux에서 사용할 수있었습니다 텍스트 편집기가 원본 인코딩을 엉망으로 만들었으므로 이제는 단위 테스트가 제대로 작동하지 않으므로 적합한 휴대용 솔루션을 찾아야합니다. – Aminos

+2

'strMystring'이 라틴 인코딩 된 8 비트 문자열이고 소스 파일 자체가 라틴어로 인코딩되어 일치하는 경우에만'if (strMystring [i] == 'é')'가 작동합니다. 이것은 휴대용이 아닙니다. 좁은 문자열을 사용하여 비 ASCII 데이터를 비교하는 것을 권장하지 않습니다. UTF-8을 사용하는 경우가 아니면 로케일 특정이므로 좁은 문자열을 사용하는 것이 좋습니다. 대신 넓은 문자열을 사용하십시오. –

답변

1

'é'을 Windows의 한 문자에 저장할 수 있으면 응용 프로그램이 UNICODE없이 컴파일되었고 확실하게 Win 1252 인코딩으로 컴파일되었을 것입니다.

리눅스에서 일반적인 utf-8 인코딩은 'é' should require 2 characters입니다. 이로 인해 컴파일러에서 경고가 발생합니다. 그리고 얻은 문자를 사용한다면 인코딩의 일부만을 나타낼 것이므로 char 비교에 의한 char은 무의미합니다.

당신은 문자열의 개별 문자를 사용하여 알고리즘을 유지하려면, 당신은 더 나은 wchar_twstring (또는 이벤트 이식성 : char32_tu32string) 작업 것입니다.

C + +로 문자 인코딩 및 유니 코드에 대해 더 자세히 알고 싶다면 James McNellis의 우수한 비디오 tutorial on unicode with C++을 따뜻하게 추천 해 드릴 수 있습니다.