检查Cstring是否只包含中文字符

时间:2013-04-26 03:34:14

标签: c++ unicode mfc operators

我正在检查CString变量是否只包含中文字符。中文字符的Unicode范围是4E00 - 9FFF。

我的做法如下:

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的符号,然后就可以了。

所以我的问题是,如何找到特定Unicode范围之间的字符天气?

还有一件事:如果我使用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;
}

3 个答案:

答案 0 :(得分: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 :(得分:0)

“char”类型的范围是-128~127或0~255,具体取决于您的编译器。 您应该使用“wchar_t”或“unsigned short”使其范围为0到65535,或者varible不能表示unicode字符。

顺便说一下,你不应该在“if”块中放置SetDlgItemText和SendDlgItemMessage。在“for”之前定义变量“i”,并在循环之后检查i的值是否等于str.Length()。

答案 2 :(得分: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;