Как узнать, принадлежит ли символ определенной кодовой странице, используя c ++ или вызывая winapi - PullRequest
1 голос
/ 10 марта 2010

Как мы можем узнать, принадлежит ли символ определенной кодовой странице? или Как мы можем определить, подходит ли Charcter для текущего активного IME для приложения.

Ответы [ 4 ]

2 голосов
/ 11 марта 2010

Два предыдущих ответа правильно предложили использовать MultiByteToWideChar, затем WideCharToMultiByte, чтобы преобразовать ваш символ UTF-8 в UTF-16, а затем в текущую кодовую страницу Windows (CP_ACP). Проверьте результат WideCharToMultiByte, чтобы увидеть, было ли преобразование успешным.

Что было не ясно из исходного вопроса, так это то, что у вас есть особая проблема с хинди. Для этого языка ваш вопрос не имеет смысла, поскольку для хинди нет кодовой страницы Windows ANSI, как отметил Крис Бекке. Следовательно, вы никогда не сможете преобразовать хинди в CP_ACP, и WideCharToMultiByte всегда завершится ошибкой.

Насколько я понимаю, чтобы использовать хинди в Windows, вы должны быть Unicode-приложением, которое вызывает API-интерфейсы Unicode.

2 голосов
/ 10 марта 2010
  • Во-первых, преобразуйте строку символов UTF-8 в UTF-16, используя MultiByteToWideChar
  • Теперь, измените процесс, используя WideCharToMultiByte , передав желаемую кодовую страницу в качестве первого параметра.

Используйте флаг WC_ERR_INVALID_CHARS, и WideCharToMultiByte сразу потерпит неудачу, если будут использованы недопустимые символы. Если вы хотите узнать, какие символы не представлены в целевой кодовой странице, используйте параметры lpDefaultChar и lpUsedDefaultChar.

LPCWSTR pszUtf16; // converted from utf8 source character
UINT nTargetCP = CP_ACP;
BOOL fBadCharacter = FALSE;
if(WideCharToMultiByte(nTargetCP,WC_NO_BEST_FIT_CHARS,pszUtf16,NULL,0,NULL,&fBadCharacter)
{
  if(fBadCharacter)
  {
    // at least one character in the string was not represented in nTargetCP
  } 
}
0 голосов
/ 10 марта 2010

Спасибо, Крис .. Я запускаю следующий код

#define CP_HINDI 0 
#define CP_JAPANESE 932
#define CP_ENGLISH 1252

wchar_t wcsStringJapanese = 'あ';
wchar_t wcsStringHindi = 'र';
wchar_t wcsStringEnglish = 'A';

int main()  
{ 

    BOOL usedDefaultCharacter = FALSE;

    /* Test for ENGLISH */
    WideCharToMultiByte( CP_ENGLISH,
                        0, &wcsStringEnglish,
                        -1,  
                        NULL,
                        0, 
                        NULL, 
                        &usedDefaultCharacter); 
    printf("usedDefaultCharacters for English? %d \n",usedDefaultCharacter);

    usedDefaultCharacter = FALSE;

    /*TEST FOR JAPANESE */

     WideCharToMultiByte( CP_JAPANESE,
                         0,
                         &wcsStringJapanese,
                        -1,  
                        NULL,
                        0, 
                        NULL, 
                        &usedDefaultCharacter); 
    printf("usedDefaultCharacters for Japanese? %d \n",usedDefaultCharacter);

    //TEST FOR HINDI 
    usedDefaultCharacter = FALSE;

    WideCharToMultiByte( CP_HINDI,
                        0, 
                        &wcsStringHindi,
                        -1,  
                        NULL,
                        0, 
                        NULL, 
                        &usedDefaultCharacter); 
    printf("usedDefaultCharacters for Hindi? %d \n",usedDefaultCharacter);   

}

Приведенный выше код возвращает:

использовали символы по умолчанию для английского? 0

использовали символы по умолчанию для японцев? 0

использовали символы по умолчанию для хинди? 1 * * +1010

Третья строка неверна, так как кодовая страница для хинди равна 0, а переданная строка состоит из символа хинди, и все же для usedDefaultChar установлено значение 1 ..., что не должно быть.

0 голосов
/ 10 марта 2010

Используя функции Windows WideCharToMultiByte и MultiByteToWideChar, вы можете конвертировать между UTF-8 и 16-битными символами Unicode.Функции имеют аргументы, чтобы указать кодовую страницу и указать поведение, если встречается недопустимый символ.

...