C++ 检查Cstring是否仅包含中文字符
我正在检查CString变量是否只包含]个汉字。汉字的Unicode范围为4E00-9FFF 我的工作如下: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 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及更高的中文代码点,请考虑。