怎样判断字符串的编码是UTF8还是UTF16?

时间:2023-01-10 20:39:54
怎样判断字符串的编码是UTF8还是UTF16?

采用如下方式区别不出来
if (str.equals(new String(str.getBytes("UTF8"), "UTF8"))) 
...


还望大虾指点。。
谢谢

12 个解决方案

#1


字符串的编码只有一种,jvm会根据系统来决定,比如: jdk 1.6 + 中文windows 环境下, 字符串的编码是GBK, 就是说所有字符串变量都是用gbk, 不会是utf-8,还是utf-16等编码.   如果你把一个utf-8 编码的字节数组"赋给" 一个字符串如: 
str = new String("你好".getBytes("utf-8")) 
结果str是乱码,因为中文windows下字符串是gbk码, java把utf-8编码的字节当成gbk来解释。

就是说,如果你想判断字符串是什么编码,可以说只有一种gbk (jdk 1.6 + 中文windows 环境下,不同操作系统可能不同).

另外上例中 str.getBytes() 得出的字节数组是 -28, -67, -96, -27, -91, -67 , 如果你问这个字节数组是什么编码,实际上是不确定的, 当然java会认为它是gbk,所以str出来是乱码.

#2


问题中没有描述清楚,
补充说明一下:
函数原型如下
public static String getString(byte[] baBuf, int iBegin, int iLength)
{

这里 baBuf 是byte的数组, 从证书文件中取得,(内容为某人的姓名)

问题是,如何判断这个baBuf里面的内容是UTF8还是UTF16编码,

看到网上有篇帖子 使用下面这种方式 可以区分出ISO-8859-1、GBK、UTF8编码
String str = new String(baBuf, iBegin, iLength);
if (str.equals(new String(str.getBytes("UTF8"), "UTF8"))) 
...

试验了,可是当baBuf中的是采用UTF16编码,这种方法 就不能区别 是UTF8还是UTF16编码

还忘高人指点。。。

#3


if (str.equals(new String(str.getBytes("UTF8"), "UTF8")) 
就这句代码来看,是不能判断字节流是否是UTF8的呀, 就是说无论baBuf实际上是什么编码,你这句代码都会返回true,起不了判断的作用.


另外, 根据你说的情况,应该是不能确定传进来的baBuf数组是何种编码的,我们遇到这种情况的时候,一般需要发送方同时发送编码信息过来. 如果没有这个信息是不能知道字节数组的编码的.   当然各种编码有一定规则,如果有 大量数据,通过复杂的算法是可以估计出字节数组是何种编码. 
如果只得几个字节的字节数组是无法确定编码的。

如果对方是按标准来办事,发过来的字节数组会带上编码信息的,可能是头几个字节,又或者通过其它参数传过来.

#4


比如 网页的request 对象中就有网页的编码信息,这是必须的,否则,接收的网页不知道编码就处理不了数据.  reponse 对象输出时,也是带有编码信息的,如果我们不指定就是系统默认而已.  我想说的是,凡是这种数据交换都一定要有编码信息. 

#5


首先谢谢楼上兄弟!

我用这种方法测试了,当传入UTF16编码的baBuf,可以判断出不是GBK、不是ISO-8859-1编码,
可是测不出是UTF8还是UTF16

if (str.equals(new String(str.getBytes("UTF8"), "UTF8")) 
...
if (str.equals(new String(str.getBytes("UTF16"), "UTF16")) 
...
这两个if都会返回true

#6



public static boolean isUTF_8(byte[] file){
if(file.length<3)
return false;
if((file[0]&0xFF)==0xEF && 
(file[1]&0xFF)==0xBB &&
(file[2]&0xFF)==0xBF)
return true;
return false;
}

LZ判断是否为UTF-8就可以了

#7


补充下,上面的方法适用于判断文件使用的字符集.
byte[] file
是一个文件转换的byte[]

#8


一个字符串不可能根据它本身判断是UTF-8还是UTF-16还是其它编码。
如果根据字符串本身能判断出编码只能说是一派胡言。

#9


一个字符串不可能根据它本身判断是UTF-8还是UTF-16还是其它编码。
如果根据字符串本身能判断出编码只能说是一派胡言。

#10


http://worldant.blog.sohu.com/96068137.html
根据自身判断,是参考这边日志中的方法

#11


引用 10 楼 chenglinfive 的回复:
http://worldant.blog.sohu.com/96068137.html 
根据自身判断,是参考这边日志中的方法

文中有很多地方的准确性值得怀疑,一些判断字符属于哪种编码的函数,是否准确我表示怀疑,特别是以下这个函数
跟楼主用的方法差不多了,但据我的了解 
str.equals(new String(str.getBytes(encode), encode))
这行代码总会返回true, 无论str这个参数是什么,这个函数总会返回gb2312. 我不知道楼主是如何测试的。 但我的测试过,总是返回gb2312,正符合我的理论.
希望有高手发表意见.

/**
     * 判断字符串的编码
     *
     * @param str
     * @return
     */
    public static String getEncoding(String str) {
        String encode = "GB2312";
        try {
            if (str.equals(new String(str.getBytes(encode), encode))) {
                String s = encode;
                return s;
            }
        } catch (Exception exception) {
        }
        encode = "ISO-8859-1";
        try {
            if (str.equals(new String(str.getBytes(encode), encode))) {
                String s1 = encode;
                return s1;
            }
        } catch (Exception exception1) {
        }
        encode = "UTF-8";
        try {
            if (str.equals(new String(str.getBytes(encode), encode))) {
                String s2 = encode;
                return s2;
            }
        } catch (Exception exception2) {
        }
        encode = "GBK";
        try {
            if (str.equals(new String(str.getBytes(encode), encode))) {
                String s3 = encode;
                return s3;
            }
        } catch (Exception exception3) {
        }
        return "";
    }
}

#12


这是因为你没有找到特殊的字符而已,你看这个字符会返回来什么card,蝶恋 失控姐ζ 丅誸仴彡激动网高清..

#1


字符串的编码只有一种,jvm会根据系统来决定,比如: jdk 1.6 + 中文windows 环境下, 字符串的编码是GBK, 就是说所有字符串变量都是用gbk, 不会是utf-8,还是utf-16等编码.   如果你把一个utf-8 编码的字节数组"赋给" 一个字符串如: 
str = new String("你好".getBytes("utf-8")) 
结果str是乱码,因为中文windows下字符串是gbk码, java把utf-8编码的字节当成gbk来解释。

就是说,如果你想判断字符串是什么编码,可以说只有一种gbk (jdk 1.6 + 中文windows 环境下,不同操作系统可能不同).

另外上例中 str.getBytes() 得出的字节数组是 -28, -67, -96, -27, -91, -67 , 如果你问这个字节数组是什么编码,实际上是不确定的, 当然java会认为它是gbk,所以str出来是乱码.

#2


问题中没有描述清楚,
补充说明一下:
函数原型如下
public static String getString(byte[] baBuf, int iBegin, int iLength)
{

这里 baBuf 是byte的数组, 从证书文件中取得,(内容为某人的姓名)

问题是,如何判断这个baBuf里面的内容是UTF8还是UTF16编码,

看到网上有篇帖子 使用下面这种方式 可以区分出ISO-8859-1、GBK、UTF8编码
String str = new String(baBuf, iBegin, iLength);
if (str.equals(new String(str.getBytes("UTF8"), "UTF8"))) 
...

试验了,可是当baBuf中的是采用UTF16编码,这种方法 就不能区别 是UTF8还是UTF16编码

还忘高人指点。。。

#3


if (str.equals(new String(str.getBytes("UTF8"), "UTF8")) 
就这句代码来看,是不能判断字节流是否是UTF8的呀, 就是说无论baBuf实际上是什么编码,你这句代码都会返回true,起不了判断的作用.


另外, 根据你说的情况,应该是不能确定传进来的baBuf数组是何种编码的,我们遇到这种情况的时候,一般需要发送方同时发送编码信息过来. 如果没有这个信息是不能知道字节数组的编码的.   当然各种编码有一定规则,如果有 大量数据,通过复杂的算法是可以估计出字节数组是何种编码. 
如果只得几个字节的字节数组是无法确定编码的。

如果对方是按标准来办事,发过来的字节数组会带上编码信息的,可能是头几个字节,又或者通过其它参数传过来.

#4


比如 网页的request 对象中就有网页的编码信息,这是必须的,否则,接收的网页不知道编码就处理不了数据.  reponse 对象输出时,也是带有编码信息的,如果我们不指定就是系统默认而已.  我想说的是,凡是这种数据交换都一定要有编码信息. 

#5


首先谢谢楼上兄弟!

我用这种方法测试了,当传入UTF16编码的baBuf,可以判断出不是GBK、不是ISO-8859-1编码,
可是测不出是UTF8还是UTF16

if (str.equals(new String(str.getBytes("UTF8"), "UTF8")) 
...
if (str.equals(new String(str.getBytes("UTF16"), "UTF16")) 
...
这两个if都会返回true

#6



public static boolean isUTF_8(byte[] file){
if(file.length<3)
return false;
if((file[0]&0xFF)==0xEF && 
(file[1]&0xFF)==0xBB &&
(file[2]&0xFF)==0xBF)
return true;
return false;
}

LZ判断是否为UTF-8就可以了

#7


补充下,上面的方法适用于判断文件使用的字符集.
byte[] file
是一个文件转换的byte[]

#8


一个字符串不可能根据它本身判断是UTF-8还是UTF-16还是其它编码。
如果根据字符串本身能判断出编码只能说是一派胡言。

#9


一个字符串不可能根据它本身判断是UTF-8还是UTF-16还是其它编码。
如果根据字符串本身能判断出编码只能说是一派胡言。

#10


http://worldant.blog.sohu.com/96068137.html
根据自身判断,是参考这边日志中的方法

#11


引用 10 楼 chenglinfive 的回复:
http://worldant.blog.sohu.com/96068137.html 
根据自身判断,是参考这边日志中的方法

文中有很多地方的准确性值得怀疑,一些判断字符属于哪种编码的函数,是否准确我表示怀疑,特别是以下这个函数
跟楼主用的方法差不多了,但据我的了解 
str.equals(new String(str.getBytes(encode), encode))
这行代码总会返回true, 无论str这个参数是什么,这个函数总会返回gb2312. 我不知道楼主是如何测试的。 但我的测试过,总是返回gb2312,正符合我的理论.
希望有高手发表意见.

/**
     * 判断字符串的编码
     *
     * @param str
     * @return
     */
    public static String getEncoding(String str) {
        String encode = "GB2312";
        try {
            if (str.equals(new String(str.getBytes(encode), encode))) {
                String s = encode;
                return s;
            }
        } catch (Exception exception) {
        }
        encode = "ISO-8859-1";
        try {
            if (str.equals(new String(str.getBytes(encode), encode))) {
                String s1 = encode;
                return s1;
            }
        } catch (Exception exception1) {
        }
        encode = "UTF-8";
        try {
            if (str.equals(new String(str.getBytes(encode), encode))) {
                String s2 = encode;
                return s2;
            }
        } catch (Exception exception2) {
        }
        encode = "GBK";
        try {
            if (str.equals(new String(str.getBytes(encode), encode))) {
                String s3 = encode;
                return s3;
            }
        } catch (Exception exception3) {
        }
        return "";
    }
}

#12


这是因为你没有找到特殊的字符而已,你看这个字符会返回来什么card,蝶恋 失控姐ζ 丅誸仴彡激动网高清..