读书人

请教byte[]怎么判断内容是纯英文还是中

发布时间: 2012-02-06 15:52:44 作者: rapoo

请问byte[]如何判断内容是纯英文还是中英混杂,求思路,谢谢
请问byte[]如何判断内容是纯英文还是中英混杂,求思路,谢谢

[解决办法]
先new成字符串
然后用char遍历这个字符串
中文在某个范围,英文在某个范围
[解决办法]
System.out.println("中国".length());
System.out.println("ab".length());
[解决办法]
先new成字符串
然后用char遍历这个字符串
中文在某个范围,英文在某个范围
[解决办法]
正则表达式?
[解决办法]
UTF-16能显示中文,能显示英文,那就直接用UTF-16吧

刚大概测试了下,貌似英文的字节范围在大小写都包含在65-122
中文的大概都是负数,我只是猜测啊。

楼主最好自己试试,找个汉字范围把所有汉字的byte打印出来。
[解决办法]

探讨

UTF-16能显示中文,能显示英文,那就直接用UTF-16吧

刚大概测试了下,貌似英文的字节范围在大小写都包含在65-122
中文的大概都是负数,我只是猜测啊。

楼主最好自己试试,找个汉字范围把所有汉字的byte打印出来。

[解决办法]
Java code
 byte[] b1="中国".getBytes("GBK");//[-42, -48, -71, -6]    byte[] b2="中国".getBytes("UTF-8");//[-28, -72, -83, -27, -101, -67]    byte[] b3="中国".getBytes("UTF-16");//[-2, -1, 78, 45, 86, -3]        byte[] b4="ab".getBytes("GBK");//[97, 98]    byte[] b5="ab".getBytes("UTF-8");//[97, 98]    byte[] b6="ab".getBytes("UTF-16");//[-2, -1, 0, 97, 0, 98]    System.out.println(new String(b6,"GBK"));//  a b    System.out.println(new String(b6,"UTF-16"));//ab
[解决办法]
探讨

引用:

UTF-16能显示中文,能显示英文,那就直接用UTF-16吧

刚大概测试了下,貌似英文的字节范围在大小写都包含在65-122
中文的大概都是负数,我只是猜测啊。

楼主最好自己试试,找个汉字范围把所有汉字的byte打印出来。

还是用正则表达式来测试我觉得比较好,英文字母一共就那么几个,正则表达式也很好写。这个byte也可能不是给U……

[解决办法]
Java code
public static boolean containsZH(byte[] arr,String charset)throws Exception{        int byteLen = arr.length;        String str = new String(arr,charset);        int strLen = str.length();        return (byteLen != strLen);    }    public static void main(String[] args) throws Exception{        System.out.println(containsZH("中国".getBytes("GBK"),"GBK"));        System.out.println(containsZH("aa".getBytes("GBK"),"GBK"));        System.out.println(containsZH("中国".getBytes("UTF-8"),"UTF-8"));        System.out.println(containsZH("aa".getBytes("UTF-8"),"UTF-8"));        System.out.println(containsZH("aa中国".getBytes("UTF-8"),"UTF-8"));    }
[解决办法]
探讨

Java code

public static boolean containsZH(byte[] arr,String charset)throws Exception{
int byteLen = arr.length;
String str = new String(arr,charset);
int strLen = str.lengt……

[解决办法]
探讨

Java code

byte[] b1="中国".getBytes("GBK");//[-42, -48, -71, -6]
byte[] b2="中国".getBytes("UTF-8");//[-28, -72, -83, -27, -101, -67]
byte[] b3="中国".getBytes("UTF-16");//[-2, -1, 78, 45, 86, -……



[解决办法]
Java code
import java.util.regex.Pattern;public class E {    public static void main(String[] args) {                Pattern p=Pattern.compile(".*[\\u4E00-\\u9FA5].*");        System.out.println(p.matcher("abca").matches());        System.out.println(p.matcher("abca中国").matches());        System.out.println(p.matcher("中国abca").matches());        System.out.println(p.matcher("ab中国ca").matches());        System.out.println(p.matcher("中国").matches());        }}
[解决办法]
不会的,如果是utf16发过来,你直接转成utf16的string就行了。
Java code
import java.io.UnsupportedEncodingException;import java.util.regex.Pattern;import java.nio.charset.Charset;public class E {    public static void main(String[] args) throws UnsupportedEncodingException {                Pattern p=Pattern.compile(".*[\\u4E00-\\u9FA5].*");        System.out.println(p.matcher("abca").matches());        System.out.println(new String("abc".getBytes("UTF16"), Charset.forName("UTF16")));        System.out.println(new String("abc中国".getBytes("UTF16"), Charset.forName("UTF16")));    }}
[解决办法]
之所以是乱码,我猜是因为在new string时,因为没有指定使用对应的charset,所以导致byte[]转string使用了系统默认的charset
[解决办法]
收到的byte[]是如何产生的?
[解决办法]
用UTF8 16位的话,字符是双字节,英文高位为0,低位是ASCII吗,查找ASCII码表可以知道a-z,A-Z,如果是中文
也可以查utf8编码表找出开始和结束位置,其他语言也有相应范围。
[解决办法]
我猜测,返回的byte[]使用的是UTF-8格式。
没有理由将返回值英文使用gbk,而中文使用utf-16的。你试试将返回的byte[]不论内容全部用utf-8转换成string

英文,因为utf-16是定长两个字节,比如之前的zbc,解析起来就被变成zb c + null的情况。而utf-8是变长,可以是1到6个字节长。
[解决办法]
还有,可能需要设置IDE的编码格式为UTF-8
[解决办法]
尽量弄到对方封装用的编码吧,本来想建议#11的方法,但是发现在UTF16下会出问题

读书人网 >Java Web开发

热点推荐