【问题标题】:Check whether a Cstring contains only Chinese characters检查Cstring是否只包含中文字符
【发布时间】:2013-04-26 03:34:14
【问题描述】:

我正在检查一个 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&lt;='\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;
}

【问题讨论】:

  • 嗯,你用的是char,不是wchar。
  • 如果我使用 wchar 我得到如下错误,test3Dlg.cpp(155): error C2065: 'wchar' : undeclared identifier
  • WCHAR(由 Windows 标头定义),或 wchar_t 使用 C++ 类型。
  • 这是中日韩统一表意文字的范围。不要忘记 CJK 部首补充、康熙部首、CJK 符号和标点、CJK 统一表意文字扩展 A、CJK 兼容表意文字、CJK 统一表意文字扩展 B、CJK 统一表意文字扩展 C、CJK 统一表意文字扩展 D 或 CJK 兼容表意文字补充。请注意,其中一些高于 U+FFFF。不要忘记即将推出的 CJK Unified Ideographs Extension E 或 F,它们还没有代码点。您可能需要重新考虑您要完成的工作。
  • 您忽略了来自编译器的警告。不。铸造只会给你挖一个更深的洞。宽字符文字需要在前面加上 L,例如 L'\u4e00'

标签: c++ unicode mfc operators


【解决方案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

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

【讨论】:

  • 这意味着您必须更新代码以考虑 UTF-16 代理项才能处理中文代码点 U+20000 及更高版本。
【解决方案2】:

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

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

【讨论】:

  • 我用 wchar_t 替换了 char 但问题仍然存在!
  • 您还需要确保为您的项目全局定义了UNICODE_UNICODE 符号,或者显式使用CStringWGetDlgItemTextW(以及所有的W 后缀版本) SDK 功能)。 @nomesh
  • 如果我使用 if(ch=='\u4e00') 那么它会给出 true ,但如果我这样做 if(ch
  • @NomeshGajare 在编译过程中是否有关于这段代码的警告?您也可以尝试: 1. 使用 CStringW 代替 CString。 2. 使用GetDlgItemTextW 代替GetDlgItemText。 3. 使用 SetDlgItemText 代替 SetDlgItemText。 4. 使用 SendDlgItemMessageW 代替 SendDlgItemMessage。
【解决方案3】:

我得到了答案。可以这样比较:

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;

【讨论】:

    猜你喜欢
    • 2011-07-11
    • 2010-12-27
    • 2017-07-04
    • 2013-02-07
    • 2013-03-08
    • 1970-01-01
    • 2017-11-02
    • 2012-01-14
    • 1970-01-01
    相关资源
    最近更新 更多