2013-04-26 6 views
0

Я проверяю, содержит ли переменная CString только] китайские символы. Диапазон Unicode для китайских иероглифов - 4E00 - 9FFF.Проверьте, содержит ли Cstring только китайские символы

Я делаю следующим образом:

CString str; 
char ch; 
GetDlgItemText(IDC_EDIT1, str); 

for(int i=0;i<str.GetLength();i++) { 
    ch=str[i]; 
    if(ch>='\u4E00'&&ch<='\u9FFF') { 
    //even if input chinese character here 'if' evaluates to false 
    SetDlgItemText(IDC_RICHEDIT21, str); 
    SendDlgItemMessage(IDC_RICHEDIT21, EM_REPLACESEL, TRUE, (LPARAM)(LPCTSTR)str); 
    } else 
    break; 

Но если я

if(ch=='\u4E00') 

и введите символ \ u4E00, то он работает отлично.

Так что мой вопрос в том, как найти погоду, символ находится между конкретным диапазоном Юникода?

Еще одна вещь: если я использую if(ch=='\u4e00'), тогда она дает true, но если я делаю if(ch<='\u4e00'), она возвращает false. Я не понимаю этого поведения!

Мой код

CString str; 
wchar_t ch; 
GetDlgItemText(IDC_EDIT1, str); 
for(int i=0;i<str.GetLength();i++) { 
    ch=str[i]; 
    if(ch<='\u4e01') { 
    //returns false, but returns true if(ch=='\u4e01') 
    SetDlgItemText(IDC_RICHEDIT21, str); 
    SendDlgItemMessage(IDC_RICHEDIT21, EM_REPLACESEL, TRUE, (LPARAM)(LPCTSTR)str); 
    else 
    break; 
} 
+4

Ум, вы используете символ, а не wchar. –

+0

Если я использую wchar, я получаю ошибку следующим образом: test3Dlg.cpp (155): ошибка C2065: 'wchar': uneclared identifier –

+0

Это 'WCHAR' (определяется заголовками Windows) или' wchar_t' для использования типа C++ , –

ответ

0

У меня есть ответ. Его можно сравнить следующим образом:

CString str; 
wchar_t ch; 
GetDlgItemText(IDC_EDIT1, str); 

for(int i=0;i<str.GetLength();i++) { 
    ch=str[i]; 
    if((unsigned int)ch>=0x4E00u&&(unsigned int)ch<=ox9FFFu) { 
    SetDlgItemText(IDC_RICHEDIT21, str); 
    SendDlgItemMessage(IDC_RICHEDIT21, EM_REPLACESEL, TRUE, (LPARAM)(LPCTSTR)str); 
    } else 
    break; 
0

Диапазон типа "полукокса" является -128 ~ 127 или 0 ~ 255 в зависимости от компилятора. Вы должны использовать «wchar_t» или «unsigned short», чтобы он варьировался от 0 до 65535, или переменная не может представлять символы Unicode.

Btw, вы не должны размещать SetDlgItemText и SendDlgItemMessage в этом блоке if. определите переменную «i» перед «for» и проверьте, соответствует ли значение i равному str.Length() после цикла.

+0

. Я заменил char на wchar_t, но проблема остается! –

+1

Вам также необходимо убедиться, что символы 'UNICODE' и' _UNICODE' определены глобально для вашего проекта или явно используют 'CStringW' и' GetDlgItemTextW' (и суффиксные версии WW всех функций SDK). @nomesh –

+0

, если я использую if (ch == '\ u4e00'), тогда он дает true, но если я делаю if (ch <= '\ u4e00'), он возвращает false. Я не отклоняю это поведение! помогите мне –

1

китайский иероглиф диапазоны:

  • U + 3400 - U + 4DB5
  • U + 4E00 - U + 62FF
  • U + 6300 - U + 77FF
  • U + 7800 - U + 8CFF
  • U + 8D00 - U + 9FCC
  • U + 20000 - U + 215FF
  • U + 21600 - U + 230FF
  • U + 23100 - U + 245FF
  • U + 24600 - U + 260FF
  • U + 26100 - U + 275FF
  • U + 27600 - U + 290FF
  • U + 29100 - U + 2A6DF
  • U + 2A700 - U + 2B734
  • U + 2B740 - U + 2B81D

Вы должны проверить все эти диапазоны быть полным и тщательным.

+1

Это означает, что вам необходимо обновить код, чтобы принять во внимание суррогаты UTF-16, чтобы обрабатывать китайские коды U + 20000 и выше. –