2013-04-09 2 views
2

이 한국어 텍스트 (quoted-printable)는 "2013-03-22 = 0E? @ HD = 0F 05:30"은 MultiByteToWideChar에 의해 유니 코드로 변환되지 않습니다. 따옴표로 묶어서 인쇄 할 수있는 양식은이 텍스트를 여기에 배치하기위한 것으로 실제로 내용에는 0xE 및 0xF 바이트가 들어 있습니다.MultiByteToWideChar이 일부 한국어 문자를 인식하지 못합니다.

MultiByteToWideChar(50225, 0, bs.pData, bs.nSize, pData + nSize, nConvertedLen); 

= 0E? @ HD = 0F는 그대로 변환, 그 결과 유니 코드 0XE 및 0xF입니다 ASCII 문자가 포함됩니다. 그러나 나는이 두 문자 대신 몇 개의 한글 문자가 나타나야한다는 것을 알았다. 필자는 항상 국제 문자 시퀀스가 ​​127보다 큰 코드로 시작한다고 생각했지만 최근에 사실이 아니라고 판명되었습니다. 그러나 MultiByteToWideChar은 여전히 ​​내가 한 것처럼 생각하고 0xE 처리를 거부합니까? @H D 0xF는 50225 (또는 949) 코드 페이지의 비 ASCII 한글 문자로 사용됩니다. Encoding.GetEncoding (50255) .GetString과 같은 .NET 함수를 사용하여 동일한 컴퓨터에서 동일한 작업을 수행 할 때 변환 결과가 올바르게 표시되고 한국어 문자가 있습니다. 하지만 MultiByteToWideChar가 작동하지 않습니다. MultiByteToWideChar (MB_COMPOSITE 등)에 설정할 수있는 다른 플래그를 시도했지만 여전히 운이 없습니다.

MultiByteToWideChar를 제대로 작동 시키려면 어떻게해야합니까? 중요한 점은 WinXP SP3입니다. 다시, .NET 방식으로 잘 작동하고 내부적으로 Encoding.GetString MultiByteToWideChar 호출하는 것 같습니다.

답변

3

이것은 known issue입니다. 근본적인 원인은 50225에서 SHIFT IN (0x0E) 및 SHIFT OUT (0x0F)의 일관되지 않은 사용입니다. 인코딩으로 사용되지 않습니다.

이러한 바이트는 문자 자체가 아닙니다. 코드 페이지 (50225)는 예를 들어, UTF-8. UTF-8은 stateless입니다. 동일한 바이트 순서는 항상 같은 유니 코드로 디코딩됩니다. 50255에서 바이트 시퀀스의 디코딩은 이전에 소비 된 바이트, 특히 0x0E와 0x0F에 따라 달라집니다.

주어진 조언은 많은 의미가 있습니다. 모든 정상적인 유니 코드 인코딩을 사용하십시오. (개인적으로 UTF-8을 권하고 싶습니다.) 대신 MultiByteToWideChar를 사용

0

나는 suggested by Microsoft을하고 제대로 문자를 디코딩하는 대신 IMultiLanguage::ConvertStringToUnicode를 사용하는 것이 좋습니다. 유일한 "단점"은 MultiByteToWideChar가 Windows 2000에서 작동하는 Windows XP가 필요하다는 것입니다. 거대한 하향 IMO가 아닙니다.

IMultiLanguage는 인코딩 변환 쉽게 같은 IMultiLanguage :: GetCharsetInfo 또는 IMultiLanguage :: EnumCodePages 만들기 위해 다른 도구가 있습니다.

관련 문제