用C++判断字符串是否为中文



------
需要用C++判断一个字符串是否为中文,环境为Linux,另外该字符串可以为英文和法文等。请教各位高手。
------
int main() 

char szText[] = "我是CIW."; 
char szChinese[3] = {0}; 

int i = 0, nLen = strlen(szText); 
for(; i < nLen; i++) 

if( szText[i] >= 0 && szText[i] <= 127 ) //不是全角字符? 
printf("%c\n", szText[i]); 
else //是全角字符 
szChinese[0] = szText[i], szChinese[1] = szText[i + 1], printf("%s\n", szChinese), i++; //中文是2个字节,所以i++ 


return 0; 
}

------
 
printf("%c\n", szText[i]); 这一句去掉,要不会干扰结果。
------
帮顶
全角和半角
------
....无语...不会
------
引用 5 楼 waizqfor 的回复:
C/C++ code//字符串是否含有中文,true 表示含有中文,false 表示不含中文boolTForm1::isContainEng(AnsiString ID)
{boolrtn=false;try{
AnsiString::TStringMbcsByteType temp;for(inti=0;i<ID.Length();i++)
{
temp=ID.ByteType(i);if(temp!=mbSingleByte)


------
大哥你还包含法文啊,你去查下unicode中文吗分布位置吧?
估计查下就好解决你的问题了
------
用宽字符,根据UNICODE值来判断
------
dddd
------
关注
------
引用 8 楼 racket2008 的回复:
用宽字符,根据UNICODE值来判断

------
mark
------
mark 一下。。。UNIX没玩过!
------
markkkk
------
汗`````` 判断一个String为中文, 如果定义一个中文String的话,strcmp函数就可以判断,如果自由输入判断的话,需要用Unicode

Up..Up..

------
没玩过linux
------
引用 1 楼 jichre 的回复:

if( szText[i] >= 0 && szText[i] <= 127 ) //不是全角字符?


------
mark

------
引用楼主 love603 的帖子:
需要用C++判断一个字符串是否为中文,环境为Linux,另外该字符串可以为英文和法文等。请教各位高手。

------
没想到啥好方法 似乎可以用

AnsiString::TStringMbcsByteType temp; 捕获异常


UP
------
linux下的unicode解决方案大部分是utf8,只能去看utf8的文档.
而且中文的utf8编码还不连续.
个人不看好utf8的中文编码.兼容性不好.
中文编码还是国标的兼容性比较好.
unicode16和gb18030大部分是兼容的.
------
最好先了解清楚编码的概念和意义。
------
关注一下
------
mark
------
mark
------
路过
------
根据下列代码, 就可以查找出字符中间的中文内容, 如果需要判断是否有法文字符,就需要判断当前 代码页


void SplitChar(const wxString& sOri, std::vector<wxString>& vectStr)
{
const char *cValue = sValue.c_str();
int iNO = 0;
while(iNO < strlen(cValue))
{
BYTE b1 = (BYTE)cValue[iNO];
if(b1<=127)
{
wxString s = sValue.Mid(iNO, 1);
vectStr.push_back(s);
iNO++;
continue;
}
if(strlen(cValue) > iNO+1 )
{
BYTE b2 = (BYTE)cValue[iNO +1];
if(
((b1 >= 0xA1 && b1 <= 0xA9) && (b2 >= 0xA1 && b2 <= 0xFE) ) || //GBK1
((b1 >= 0xB0 && b1 <= 0xF7) && (b2 >= 0xA1 && b2 <= 0xFE) ) || //GBK2 6763
((b1 >= 0x81 && b1 <= 0xA0) && (b2 >= 0x40 && b2 <= 0xFE) ) || //GBK3 
((b1 >= 0xAA && b1 <= 0xFE) && (b2 >= 0x40 && b2 <= 0xA0) ) || //GBK4
((b1 >= 0xA8 && b1 <= 0xA9) && (b2 >= 0x40 && b2 <= 0xA0) ) //GBK5
)
{
wxString s = sValue.Mid(iNO, 2);
vectStr.push_back(s);
iNO+=2;
continue;
}
if(strlen(cValue) > iNO+3)
{
BYTE b1 = (BYTE)cValue[iNO];
BYTE b2 = (BYTE)cValue[iNO +1];
BYTE b3 = (BYTE)cValue[iNO +2];
BYTE b4 = (BYTE)cValue[iNO +3];
if((b1 >=0x81 && b1<= 0xFE) &&
(b2 >=0x30 && b2<= 0x39) &&
(b3 >=0x81 && b3<= 0xFE) &&
(b4 >=0x30 && b4<= 0x39) )//GB18030
{
wxString s = sValue.Mid(iNO, 4);
vectStr.push_back(s);
iNO+=4;
continue;
}
}
}
//WMQ::MyAssert(false, "45CF90B3-16B14198-C24EB224-17E49DC8", true);
wxString s = sValue.Mid(iNO, 1);
vectStr.push_back(s);
iNO++;
continue; 
}

}

------
unicode 不知怎么判断 顶一下
------
UP
------
up
------
引用 20 楼 fz_zhou 的回复:
引用楼主 love603 的帖子:

Unicode/GBK/gb2312/gb18030/UTF-8

不知道编码来判断是不是中文,只能是猜,不能完全给出正确结果.



------
不懂,帮顶,不好意思。
------
利用字符串指针,逐个读取,判断是否为汉字即可
------
好,正在寻求答案
------
引用 32 楼 cppfaq 的回复:
引用 20 楼 fz_zhou 的回复:
引用楼主 love603 的帖子:

Unicode/GBK/gb2312/gb18030/UTF-8

不知道编码来判断是不是中文,只能是猜,不能完全给出正确结果.



对的,只能猜
11. 如何判断一个文本文件是ANSI还是Unicode?
判断如果文本文件的开头两个字节是0xFF和0xFE,那么就是Unicode,否则是ANSI。

12. 如何判断一段字符串是ANSI还是Unicode?
用IsTextUnicode进行判断。IsTextUnicode使用一系列统计方…

------
up
------
up
------
Unicode/GBK/gb2312/gb18030/UTF-8 

不知道编码来判断是不是中文,只能是猜,不能完全给出正确结果. 



对的,只能猜 
11. 如何判断一个文本文件是ANSI还是Unicode? 
判断如果文本文件的开头两个字节是0xFF和0xFE,那么就是Unicode,否则是ANSI。 

12. 如何判断一段字符串是ANSI还是Unicode? 
用IsTextUnicode进行判断。IsTextUnicode使用一系列统计方…
------
linux没玩过!
------
study
------
顶1楼
------
学习一下
------
不管是多字节,还是UNICODE,一个字节一个字节去看最高的bit,是否为1, 为1 就是汉字。
如果是UNICODE,那么你可以拿出第一个字节,如果高位是1,那么接着拿下一个字节,这两个字节是一个汉字,如果是0, 那么这个字节的内容就是你要的字符,高字节可以忽略。
------
必须逐个字符读取,根据字符范围进行判断,根据文件头是不行的,文件头可以改
------
用什么转换啊?

------
ding
------
好东西啊谢谢分享啊
------
mark

------
2个字节一个中文,一个字节一个Char型变量。第一个字节数〉128说明其为GB编码
------
关注..
------
严重关注~~~
------
关注
------
用正则行不?
------
关注
------
引用 28 楼 wwwwbb78 的回复:
根据下列代码, 就可以查找出字符中间的中文内容, 如果需要判断是否有法文字符,就需要判断当前 代码页


void SplitChar(const wxString& sOri, std::vector <wxString>& vectStr)
{
const char *cValue = sValue.c_str();
int iNO = 0;
while(iNO < strlen(cValue))
{
BYTE b1 = (BYTE)cValue[iNO];
if(b1 <=127)
{
wxString s = sValue.Mid(iNO, 1);
vectStr.push_back(s);
iNO++;
continue;


------
引用 44 楼 zwh37333 的回复:
不管是多字节,还是UNICODE,一个字节一个字节去看最高的bit,是否为1, 为1 就是汉字。
如果是UNICODE,那么你可以拿出第一个字节,如果高位是1,那么接着拿下一个字节,这两个字节是一个汉字,如果是0, 那么这个字节的内容就是你要的字符,高字节可以忽略。

------
关注中。。。
------
关注中,学习中。。。。。。
------
首先,汉字是双字节的编码格式!  
  汉字的第一字节:是从0xB0 开始编码  
  汉字的第二字节:是从0xA1 开始编码  
  有了以上的了解,就不难识别出是中文,还是其他的编码!  
  程序中只需要判断( 第一字节>0xB0 && 第二字节>0xA1 )就好!  
  以上在中文操作系统win 98/me/2000/xp 上调试成功  
   
  以上是个人意见仅供参考,如有错误请各位指正!  

------
修正:  
  程序中只需要判断( 第一字节>0xB0 && 第二字节>0xA1 )就好!  
   
  应该为:  
  程序中只需要判断( 第一字节>=0xB0 && 第二字节>=0xA1 )就好!  
   
  让各位见笑了!  

------
...................................
------
up
------
mark
------
判断字节数,然后根据实际编码情况(Unicode/GB2312/GBK等),确定是否中文。
------
挺实际的问题,顶!
------
学习了,纯帮顶!
------
不会,给个java的,参考参考
把每两个字符组合一起用正则表达式来判断[^\u4e00-\u9fa5]
JAVA:

import java.util.regex.*;
public class Test
{
  public static void main(String[] args) 
  {
  String str = "Matrix-绿茵汗将";
  String regEx = "[\u4e00-\u9fa5]";
  Pattern p=Pattern.compile(regEx);
  Matcher m=p.matcher(str);
  boolean hasChinese=m.find();
  if (hasChinese)
  {
  System.out.println("字符串含有中文字符");
  }
  else
  {
  System.out.println("字符串中没有中文字符");
  }
  }
}


javascript:

f(/[^\x00-\xff]/g.test(frm.aaa.value)){
  alert("不能含有汉字,请重新输入");
  return false;
  }


正则表达式

[^\u4e00-\u9fa5] 匹配非汉字,如果返回true,则字符串不是全部由汉字组成;如果返回false,则字符串全部由汉字组成。

[^0-9] 匹配非数字,如果返回true,则字符串不是全部由数字组成;如果返回false,则字符串全部由数字组成。
 


------
mark
------
貌似很多高手。。。
------
这个就是编码的自动识别了,只有先识别了是什么编码的文本,才能针对性的去判断是否为中文。

基本思路是

1.判断当前文本的编码

2.判断出来后,读入字符串中并把它统一转换成unicode或者utf-8的字符串。

3.根据unicode或者utf-8的编码中中文字符的编码范围来判断每个字符是不是中文。


这里面最难的是第一条,这个最成功的典范是ie,firefox这些浏览器中编码识别的实现。基本思路是猜,因为BOM是可以改的,甚至可以没有。

因此靠bom等来识别编码是错误的思路。。只能是猜,基于某种算法来猜,只要算法合理则基本上不会出错,但不可能是100%,你看有时候ie看网页

不是也会乱码啊,那就是猜错了。。。

因为firefox是开源的,所以判断编码的源代码在网上有下的,你找找看。
------
汉字的编码多了去了,双字节就一定是中文????
------
引用 18 楼 afeiqiang 的回复:
引用 1 楼 jichre 的回复:

if( szText[i] >= 0 && szText[i] <= 127 ) //不是全角字符? 

 
这仅仅能判断非英文字符,不能断定是中文,还可能是其他国家的文字

------
引用 61 楼 henry3695 的回复:
修正:
程序中只需要判断( 第一字节>0xB0 && 第二字节>0xA1 )就好!

应该为:
程序中只需要判断( 第一字节>=0xB0 && 第二字节>=0xA1 )就好!

让各位见笑了!

------
up 72楼
------
mark
------
没玩过LINUX,不过是好贴
------
引用 72 楼 zjsflyer 的回复:
这个就是编码的自动识别了,只有先识别了是什么编码的文本,才能针对性的去判断是否为中文。

基本思路是

1.判断当前文本的编码

2.判断出来后,读入字符串中并把它统一转换成unicode或者utf-8的字符串。

3.根据unicode或者utf-8的编码中中文字符的编码范围来判断每个字符是不是中文。


这里面最难的是第一条,这个最成功的典范是ie,firefox这些浏览器中编码识别的实现。基本思路是猜,因为BOM是可以改的,甚至可…

------
up
------
mark...
------
mark
------
Study
------
xueix
------
学习
------
在unicode 字符串中,中文的范围是在4E00..9FFF:CJK Unified Ideographs。

通过对字符的unicode编码进行判断来确定字符是否为中文。

protected bool IsChineseLetter(string input,int index)
  ......{
  int code = 0;
  int chfrom = Convert.ToInt32("4e00", 16); //范围(0x4e00~0x9fff)转换成int(chfrom~chend)
  int chend = Convert.ToInt32("9fff", 16);
  if (input != "")
  ......{
  code = Char.ConvertToUtf32(input, index); //获得字符串input中指定索引index处字符unicode编码
   
  if (code >= chfrom && code <= chend)  
  ......{
  return true; //当code在中文范围内返回true

  }
  else
  ......{
  return false ; //当code不在中文范围内返回false
  }
  }
  return false;
 }

------
UP~! Mark
------
UP
------
貌似还没有结果~~
------
看不懂
------
学习一下,不是十分了解
------
学习,关注
------
学习一下,UP
------
学习了,谢谢
------
我查了一下,找到了这个猜字符编码的算法代码,叫chartdet 它是mozilla firefox使用的自动字符集探测算法

这个算法的最初作者是frank Tang,C++源代码在http://lxr.mozilla.org/mozilla/source/intl/chardet/,可以从http://www.mozilla.org/projects/intl/chardet.html得到更多关于这个算法的信息。


jchardet是mozilla自动字符集探测算法代码的java移植,其源代码可以从sourceforge下载





------
你看看它的文档,然后可以就可以编译成lib调用。

只要用chardet先判断出你的字符源(例如来自txt文档的内容,网页等等)的编码,就可以用这种编码把文本读入字符串并转换成你想要的编码中,然后就可以根据在这种编码中汉字的范围判断是不是汉字。

------
学习
------
引用 72 楼 zjsflyer 的回复:
这个就是编码的自动识别了,只有先识别了是什么编码的文本,才能针对性的去判断是否为中文。

基本思路是

1.判断当前文本的编码

2.判断出来后,读入字符串中并把它统一转换成unicode或者utf-8的字符串。

3.根据unicode或者utf-8的编码中中文字符的编码范围来判断每个字符是不是中文。


这里面最难的是第一条,这个最成功的典范是ie,firefox这些浏览器中编码识别的实现。基本思路是猜,因为BOM是可以改的,甚至可以没有…

------
说啦这麽多!没有人给出确认代码或答案?
桂ICP备07017180号