检测字符串中是否含有中文
2017-02-09 08:14
204 查看
检测字符串中是否含有中文:
思路:
我们都知道,英文字符串和中文字符串最大的区别在于每一个英文字符占用一个字节,而每一个中文字符占用两个字节。
知道这一点,就为我们检测字符串中是否有中文提供了实现思路,那就是将字符串先转换为字节数组,并获取字节数组的长度,然后与原字符串的长度作比较,如果字节数组的长度大于字符串的长度,那么,目标字符串中就含有中文字符。
代码:
public static boolean isContainChinese(String str){
return !(str.length()==str.getBytes().length);
}
测试:
将测试字符串String|testString="abc中文def"作为参数,执行此方法,返回结果为"true",也就是测试字符串中包含中文,测试结果正确。
问题:
到这里,是不是这个问题就解决了呢?我们再来做一个测试:
我们将测试字符串String|testString2="abcdef"作为参数,执行此方法,返回结果也为"true",看到这你会发现,不对啊,我的测试字符串里没有中文的。
细心的人一眼就可以看出问题所在了,原因是测试字符串中含有"def"这三个全角字符。
我们都知道,中文是全角字符,每一个占用两个字节,但是!不是所有的全角字符都是中文,这就是问题所在。
现在我们来具体说一下解决方案:
Java代码检测:
思路:中文在Unicode中有一个编码区间(4e00-9fa5),我们只需要逐个检测字符串中的字符是否有在这个编码区间的就可以了
代码:
public static boolean isIncludeChinese(String str){
boolean flag = false;
for (int i = 0; i < str.length(); i++) {
flag = str.substring(i,i+1).matches("[\\u4e00-\\u9fa5]+");
if(flag)
return flag;
}
return flag;
}
测试:
将String|testStr = "abcdef"作为参数,执行方法,返回false
将String|testStr = "abc中文"作为参数,执行方法,返回true
js代码检测:
思路:同Java代码检测的思路相同
代码:
function isContainChinese(str){
return (/.*[\u4e00-\u9fa5]+.*$/.test(str));
}
测试:
执行代码:
var testStr = "abc中文def";
alert(isContainChinese(testStr));
页面弹出"true"
执行代码:
var testStr = "abcdef";
alert(isContainChinese(testStr));
页面弹出"false"
到个里,检测字符串中是否含有中文的问题就解决了,另外,在网上看到一个有趣的小程序,贴出来分享:
import java.io.*;
public class Demo9 {
public static void main(String[] args) {
FileWriter fw = null;
try {
fw = new FileWriter("D:/TestFileWriterUnicod.txt");
for(int c=0; c<=50000; c++) {
fw.write(c);
}
fw.close();
} catch(FileNotFoundException e) {
System.out.println("系统没有找到该文件!");
System.exit(-1);
} catch(IOException e) {
System.out.println("文件读写出现错误!");
System.exit(-1);
}
System.out.println("\n\n打印Unicode完毕!");
}
}
执行完这段代码后,到计算机D盘,打开TestFileWriterUnicod.txt,就可以看到所有的Unicode字符了
思路:
我们都知道,英文字符串和中文字符串最大的区别在于每一个英文字符占用一个字节,而每一个中文字符占用两个字节。
知道这一点,就为我们检测字符串中是否有中文提供了实现思路,那就是将字符串先转换为字节数组,并获取字节数组的长度,然后与原字符串的长度作比较,如果字节数组的长度大于字符串的长度,那么,目标字符串中就含有中文字符。
代码:
public static boolean isContainChinese(String str){
return !(str.length()==str.getBytes().length);
}
测试:
将测试字符串String|testString="abc中文def"作为参数,执行此方法,返回结果为"true",也就是测试字符串中包含中文,测试结果正确。
问题:
到这里,是不是这个问题就解决了呢?我们再来做一个测试:
我们将测试字符串String|testString2="abcdef"作为参数,执行此方法,返回结果也为"true",看到这你会发现,不对啊,我的测试字符串里没有中文的。
细心的人一眼就可以看出问题所在了,原因是测试字符串中含有"def"这三个全角字符。
我们都知道,中文是全角字符,每一个占用两个字节,但是!不是所有的全角字符都是中文,这就是问题所在。
现在我们来具体说一下解决方案:
Java代码检测:
思路:中文在Unicode中有一个编码区间(4e00-9fa5),我们只需要逐个检测字符串中的字符是否有在这个编码区间的就可以了
代码:
public static boolean isIncludeChinese(String str){
boolean flag = false;
for (int i = 0; i < str.length(); i++) {
flag = str.substring(i,i+1).matches("[\\u4e00-\\u9fa5]+");
if(flag)
return flag;
}
return flag;
}
测试:
将String|testStr = "abcdef"作为参数,执行方法,返回false
将String|testStr = "abc中文"作为参数,执行方法,返回true
js代码检测:
思路:同Java代码检测的思路相同
代码:
function isContainChinese(str){
return (/.*[\u4e00-\u9fa5]+.*$/.test(str));
}
测试:
执行代码:
var testStr = "abc中文def";
alert(isContainChinese(testStr));
页面弹出"true"
执行代码:
var testStr = "abcdef";
alert(isContainChinese(testStr));
页面弹出"false"
到个里,检测字符串中是否含有中文的问题就解决了,另外,在网上看到一个有趣的小程序,贴出来分享:
import java.io.*;
public class Demo9 {
public static void main(String[] args) {
FileWriter fw = null;
try {
fw = new FileWriter("D:/TestFileWriterUnicod.txt");
for(int c=0; c<=50000; c++) {
fw.write(c);
}
fw.close();
} catch(FileNotFoundException e) {
System.out.println("系统没有找到该文件!");
System.exit(-1);
} catch(IOException e) {
System.out.println("文件读写出现错误!");
System.exit(-1);
}
System.out.println("\n\n打印Unicode完毕!");
}
}
执行完这段代码后,到计算机D盘,打开TestFileWriterUnicod.txt,就可以看到所有的Unicode字符了
相关文章推荐
- Java GC系列(1):Java垃圾回收简介
- 利用Wifidog实现微信wifi连接
- [置顶] 2016年总结:教师路的开启,爱情味的初尝 (下)
- 循环队列
- 详解js的异步编程技术的方法
- 1st round, 67 Add Binary
- Microsoft.XMLHTTP对象详解 2006年的文章
- go语言panic机制的原理
- MSXML2.XMLHTTP.4.0对象
- ApplicationContext
- Android神奇"控件"一一RemoteViews
- Leetcode 205. Isomorphic Strings
- 142. Linked List Cycle II
- VT-x is disabled in the BIOS android开发遇到的第一个问题 vts BIOS设置
- 141. Linked List Cycle
- 287. Find the Duplicate Number
- Map接口
- 云计算设计模式(六)——命令和查询职责分离(CQRS)模式
- CoreCLR源码探索(三) GC内存分配器的内部实现
- .Net基础体系和跨框架开发普及