采用如下方式区别不出来
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出来是乱码.
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编码
还忘高人指点。。。
补充说明一下:
函数原型如下
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数组是何种编码的,我们遇到这种情况的时候,一般需要发送方同时发送编码信息过来. 如果没有这个信息是不能知道字节数组的编码的. 当然各种编码有一定规则,如果有 大量数据,通过复杂的算法是可以估计出字节数组是何种编码.
如果只得几个字节的字节数组是无法确定编码的。
如果对方是按标准来办事,发过来的字节数组会带上编码信息的,可能是头几个字节,又或者通过其它参数传过来.
就这句代码来看,是不能判断字节流是否是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
我用这种方法测试了,当传入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
文中有很多地方的准确性值得怀疑,一些判断字符属于哪种编码的函数,是否准确我表示怀疑,特别是以下这个函数
跟楼主用的方法差不多了,但据我的了解
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出来是乱码.
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编码
还忘高人指点。。。
补充说明一下:
函数原型如下
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数组是何种编码的,我们遇到这种情况的时候,一般需要发送方同时发送编码信息过来. 如果没有这个信息是不能知道字节数组的编码的. 当然各种编码有一定规则,如果有 大量数据,通过复杂的算法是可以估计出字节数组是何种编码.
如果只得几个字节的字节数组是无法确定编码的。
如果对方是按标准来办事,发过来的字节数组会带上编码信息的,可能是头几个字节,又或者通过其它参数传过来.
就这句代码来看,是不能判断字节流是否是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
我用这种方法测试了,当传入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
文中有很多地方的准确性值得怀疑,一些判断字符属于哪种编码的函数,是否准确我表示怀疑,特别是以下这个函数
跟楼主用的方法差不多了,但据我的了解
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,蝶恋 失控姐ζ 丅誸仴彡激动网高清..