문제

클립 보드의 텍스트가 ISO 8859 또는 UTF-8인지 쉽게 감지 할 수있는 방법이 있는지 알고 싶습니다.

내 현재 코드는 다음과 같습니다.

    COleDataObject  obj;

    if (obj.AttachClipboard())
    {
        if (obj.IsDataAvailable(CF_TEXT))
        {
            HGLOBAL hmem = obj.GetGlobalData(CF_TEXT);
            CMemFile sf((BYTE*) ::GlobalLock(hmem),(UINT) ::GlobalSize(hmem));
            CString buffer;

            LPSTR str = buffer.GetBufferSetLength((int)::GlobalSize(hmem));
            sf.Read(str,(UINT) ::GlobalSize(hmem));
            ::GlobalUnlock(hmem);

            //this is my string class
            s->SetEncoding(ENCODING_8BIT);
            s->SetString(buffer);
        }
    }
}
도움이 되었습니까?

해결책

cf_locale at의 정의를 확인하십시오 이 Microsoft 페이지. 클립 보드에있는 텍스트의 로케일을 알려줍니다. 더 나은 것은 CF_UNICODETEXT를 대신 사용하는 경우 Windows가 UTF-16으로 변환됩니다.

다른 팁

UTF-8은 비 ASCII 바이트에 대한 정의 된 구조를 가지고 있습니다. 바이트> = 128을 스캔하고 감지 된 경우 유효한 UTF-8 문자열을 형성하는지 확인하십시오.

유효한 UTF-8 바이트 형식을 찾을 수 있습니다 위키 백과:

Unicode             Byte1           Byte2           Byte3           Byte4
U+000000-U+00007F   0xxxxxxx
U+000080-U+0007FF   110xxxxx        10xxxxxx
U+000800-U+00FFFF   1110xxxx        10xxxxxx        10xxxxxx
U+010000-U+10FFFF   11110xxx        10xxxxxx        10xxxxxx        10xxxxxx

오래된 답변 :

모든 ASCII 텍스트는 유효한 UTF-8이므로 UTF-8으로 해독 할 수 있으며 예상대로 작동합니다.

비 ASCII 문자가 포함되어 있는지 테스트하려면 바이트> = 128을 스캔 할 수 있습니다.

나는 착각 할 수 있지만 당신은 할 수 없다고 생각합니다. 편집자에 BOM이없는 UTF-8 파일을 열면 기본적으로 ISO-8859-1 (내 로케일)으로 표시되고 외국의 이상한 사용 외에는 ( 나) 악센트 숯, 나는 그것이 UTF-8이라는 강력한 시각적 힌트가 없다 (예 : html 또는 xml의 charset declaration) : 그것은 완벽하게 유효한 ANSI 텍스트이다.

John은 "모든 ASCII 텍스트는 유효한 UTF-8"을 썼지 만 그 반대는 사실입니다.

Windows XP+는 자연스럽게 UTF-16을 사용하고 클립 보드 형식을 사용하지만 Afaik은 특별한 처리없이 UTF-8을 무시합니다.
(실제로 UTF-8을 UTF-16 (또는 ANSI 등)으로 변환하는 API가 있습니다.

클립 보드에있는 유니 코드 버전을 사용할 수 있는지 obj.isdataavailable (cf_unicodetext)을 확인할 수 있습니다.

-아담

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top