Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 检查Cstring是否仅包含中文字符_C++_Unicode_Mfc_Operators - Fatal编程技术网

C++ 检查Cstring是否仅包含中文字符

C++ 检查Cstring是否仅包含中文字符,c++,unicode,mfc,operators,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

我正在检查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;
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;
并输入\u4E00的符号,则其工作正常

所以我的问题是,如何找到字符是否位于特定Unicode范围之间

还有一件事:如果我使用
if(ch=='\u4e00')
那么它会给出true,但是如果我使用
if(ch的话,“char”类型的范围是-128~127或0~255,这取决于你的编译器。
您应该使用“wchar_t”或“unsigned short”将其范围设置为0到65535,否则变量不能表示该unicode字符


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

我得到了答案。可以按如下方式进行比较:

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;
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;
CString-str;
世界卫生组织;
GetDlgItemText(IDC_EDIT1,str);

对于(int i=0;i=0x4E00u&&(无符号int)ch汉字范围:

  • 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

您必须检查所有这些范围是否完整和彻底。

Um,您使用的是char,而不是wchar。如果我使用wchar,我会得到如下错误,test3Dlg.cpp(155):错误C2065:“wchar”:未声明的标识符的
wchar
(由Windows标题定义)使用CC++类型,这是CJK统一表意的范围。不要忘记CJK激进补充、康熙激进、CJK符号和标点符号、CJK统一表意扩展A、CJK兼容表意、CJK统一表意扩展B、CJK统一表意扩展C、CJK统一表意文字EX。张力D或CJK兼容表意文字补充。请注意,其中一些在U+FFFF以上。不要忘记即将推出的CJK统一表意文字扩展E或F,它们还没有代码点。您可能需要重新思考您试图实现的目标。您忽略了编译器的警告。不要。强制转换只会给您带来麻烦更深的洞。宽字符文本需要在前面加一个L,比如
L'\u4e00'
i用wchar\u t替换了char,但问题仍然存在!您还需要确保为项目全局定义
UNICODE
\u UNICODE
符号,或者显式使用
CStringW
GetDlgItemTextW
(以及所有SDK函数的
W
后缀版本)。@nomeshif如果我使用if(ch=='\u4e00'),那么它会给出true,但是如果我使用if(ch@NomeshGajare编译过程中是否有关于这段代码的任何警告?您也可以尝试:1.使用CStringW而不是CString。2.使用GetDlgItemTextW而不是GetDlgItemText。3.使用SetDlgItemText而不是SetDlgItemText。4.使用SendDlgItemMessageW而不是SendDlgItemMessage。这意味着您必须更新代码才能使用UTF-16 su为了处理U+20000及更高的中文代码点,请考虑。