怎样判断字符串的编码是UTF8还是UTF16?采用如下方式区别不出来
if (str.equals(new String(str.getBytes("UTF8"), "UTF8"))) 
...
还望大虾指点。。
谢谢

解决方案 »

  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还是UTF16if (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.   

    文中有很多地方的准确性值得怀疑,一些判断字符属于哪种编码的函数,是否准确我表示怀疑,特别是以下这个函数
    跟楼主用的方法差不多了,但据我的了解 
    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,蝶恋 失控姐ζ 丅誸仴彡激动网高清..