0

我正在检查 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')then 它给出 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

3 回答 3

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

您必须检查所有这些范围以确保其完整和彻底。

于 2013-04-26T12:09:29.583 回答
0

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

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

于 2013-04-26T03:48:07.217 回答
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;
于 2013-04-26T10:31:32.923 回答