一、http://hilliate.blog.hexun.com/11600190_d.html
String.getBytes().length != String.length()
String.getBytes().length取的是字节数,因为中文是全角字符,所以每个中文的字节数都为2
String.length()取的是字符长度,按中文的个数来截取。
但是这样有bug 因为中文是全角字符没错,但是并非全角字符就全部是中文
另外的解决方法如下:
String str = "中国chinese";
for(int i =0 ;i < str.length() ; i ++)
{
System.out.println(str.substring(i, i+1).matches("[\\u4e00-\\u9fa5]+"));
}
这是取的中文在Unicode中的编码区间,而且将字符中的每一个substring都拿出来与字符区间相比
最终很容易判断出字符中是否有中文。
二、http://blog.csdn.net/zhengjianqi/archive/2008/07/04/2612385.aspx
package test;
import java.util.Random;
public class IsChineseOrEnglish {
// GENERAL_PUNCTUATION 判断中文的“号
// CJK_SYMBOLS_AND_PUNCTUATION 判断中文的。号
// HALFWIDTH_AND_FULLWIDTH_FORMS 判断中文的,号
public static boolean isChinese(char c) {
Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
|| ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
|| ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
|| ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {
return true;
}
return false;
}
public static void isChinese(String strName) {
char[] ch = strName.toCharArray();
for (int i = 0; i < ch.length; i++) {
char c = ch[i];
if (isChinese(c) == true) {
System.out.println(isChinese(c));
return;
} else {
System.out.println(isChinese(c));
return;
}
}
}
public static void main(String[] args) {
Random r = new Random();
for(int i=0;i<20;i++)
System.out.println(r.nextInt(10)+1);
isChinese("き");
isChinese("中国");
}
}
三、http://topic.csdn.net/t/20040512/16/3059368.html
1)JAVA
自己写的珍藏代码:
/**
* 用getBytes(encoding):返回字符串的一个byte数组
* 当b[0]为 63时,应该是转码错误
* A、不乱码的汉字字符串:
* 1、encoding用GB2312时,每byte是负数;
* 2、encoding用ISO8859_1时,b[i]全是63。
* B、乱码的汉字字符串:
* 1、encoding用ISO8859_1时,每byte也是负数;
* 2、encoding用GB2312时,b[i]大部分是63。
* C、英文字符串
* 1、encoding用ISO8859_1和GB2312时,每byte都大于0;
* <p/>
* 总结:给定一个字符串,用getBytes("iso8859_1")
* 1、如果b[i]有63,不用转码; A-2
* 2、如果b[i]全大于0,那么为英文字符串,不用转码; B-1
* 3、如果b[i]有小于0的,那么已经乱码,要转码。 C-1
*/
private static String toGb2312(String str) {
if (str == null) return null;
String retStr = str;
byte b[];
try {
b = str.getBytes("ISO8859_1");
for (int i = 0; i < b.length; i++) {
byte b1 = b[i];
if (b1 == 63)
break; //1
else if (b1 > 0)
continue;//2
else if (b1 < 0) { //不可能为0,0为字符串结束符
retStr = new String(b, "GB2312");
break;
}
}
} catch (UnsupportedEncodingException e) {
// e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
return retStr;
}
2)JS
用javascript不是很好解决吗?
<script language="JavaScript">
if (/[^\x00-\xff]/g.test(this.value)) {
alert('为汉字!');
}else{
alert('非汉字!');
}
</script>
3)、思路:首先判断一个字节的asc码,如果大于127,则判断紧接着的下一个字节,如果还大于127,则这两个字节就是一个汉字(未验证)