急!急!JAVA中ASCII转码问题??
发布网友
发布时间:2022-04-22 17:27
我来回答
共5个回答
热心网友
时间:2023-09-21 04:40
看了几位的回答,感觉有点好笑,楼主本身就出了一个假命题,几位回答都没有弄清字符集的转换,楼主也不知道自己本身就犯了一个致命错误,“你好”本身就是一个多位编码,你却硬要用低位码去解码,不出错才怪呢?
String s1 =new String(chinaString.getBytes("gb2312"),"ISO-8859-1");
这里的gb2312可以省略,系统会默认用你控制面板设定好的字符集,因为原来“你好”是多位编码,所以必须用多位编码去解码,也就是gb2312或utf-8去解码,这样chinaString.getBytes("gb2312")就变成一个byte数组,这时候你可以随意重新指定编码如iso-8859-1,这是s1就变成一个是iso-8859-1编码的字符串,如果你想重新转为中文,那么,你用什么字符集编码的,必须用什么字符集来解码,这里是iso-8859-1,可以这么来做
String s2 = new String(s1.getBytes("ISO-8859-1"),"gb2312");
这样s2又重新变回中文了,所以当你打印s2时,就是“你好”。
还有一个问题,为什么这里用iso-8859-1来重新编码,而不用其他的字符集呢?这里因为,其他字符集无法相互转码而发生编码丢失现象,你可以试试,把iso-8850-1换成utf-8试试,这无法重新转回来,这导致乱码现象,如果你ios-8850-1换成gbk,大部分是可以的,因为gbk兼容gb2312,但是,不是所有的都能相互转回来,最好用iso-8850-1来作为中间转码字符集,这是因为所有的字符集都对iso-8859-1兼容,不管是gbk还是gb2312,utf-8,都能完美地转换回来。
说了这么多,可能大家还有点迷糊,这应用在什么地方。我举个例子,大家知道,经常有人做网络爬虫,把网页下载下来,但是,网页编码各种各样,主要有iso-8859-1,gbk,gb2312,utf-8,网页以io字节流下载下来,要想把它转换字符流,也就是文字,这时候要知道编码是什么。怎么办呢?这样做,不管它,首先以iso-8859-1编码转换过来,然后再用正则表达式看看网页头部,如:
<meta content="text/html; charset=gb2312" http-equiv="Content-Type">,这时就知道这个网页的编码是gb2312,再利用这个式子
String s2 = new String(s1.getBytes("ISO-8859-1"),"gb2312");
s2就能正确显示网页内容。假如你用其他字符集如utf-8作为中间码,也能知道网页编码是gb2312,但这是你用式子
String s2 = new String(s1.getBytes("utf-8"),"gb2312"),就会出现乱码现象,所以最好用iso-8859-1作为中间码。
所以,楼主除了犯以上错误以外,还有,就不应该用US-ASCII作为中间码,否则,是不能转换为中文的,它们之间无法做到相互转换,只有iso-8859-1才能完美转换成其他编码。
热心网友
时间:2023-09-21 04:41
String s=new String(cascii,"ASCII");
这里把以ASCII存着的数组cascii转化为java内部可以使用的UTF8字符串。然后在任何平台上面,你用system.out.println(s)便可以输出中文了。(因为java的out.println自动帮你把内部的UTF8字符串转化为平台字符集的字符串再输出)
如果你是要写到网页的话,那么应该先用String.getBytes("ISO-8859-1")得到字节数组,然后再把该数组写到流里去。(一般J2EE容器都会让你设置写入到流的是什么编码,所以你不需要在网页代码里面转换输出流的字符集了;至于request的输入流的话,因为特殊情况可能要你在读取前设置下,但是一般情况下是不用的)
需要注意的是,如果你把某UTF8数组以GBK的形式转化为Java内部的字符串,然后再以String.getBytes("GBK")变回来数组,再以new String(cascii,"UTF8")变为字符串的话,部分字符会出错的。对于其他字符集之间的操作也是如此,原因不明。
PS:前面几位说的方法不是很好呢,感觉对Java的字符串和字符集都理解不透彻。比如说String s = new String(chinaString.getBytes("US-ASCII"),"GB2312"); 你把在Java里面的一个字符串chinaString解析成一个由ASCII码构成的字符数组,嗯,这个没什么问题。但是你又用这个数组以GB2312的形式构造成一个字符串?不会有问题咩?以一个字符集编码的字符数组转化为另一个字符集的字符串,怎么可能不出问题。部分字符不会出问题是因为各个字符集之间有交集,所以自然有没出错的时候。嗯,还是给个例子好了。
System.out.println(new String("“(美".getBytes("US-ASCII"),"GB2312"));
各位可以用字符串 "“(美" 校验一下看看你的方法能正常不。
补充:
好吧,我错了,我压根没注意到中文字符根本没法变成ASCII字符数组。。个悲剧的。。
但是我呃掉了,寻找逆流的鱼 你也别想好过,哇哈哈~~
诺,你这个东西也是乱码,看来字符集iso-8859-1可也不是完美的兼容呢。。-_-!!
String s2 = new String("“(美".getBytes("ISO-8859-1"),"gb2312");
哦,再废话下,你这个可是把ISO-8859-1编码了的字节序列用gb2312编码之后在Java内部以UTF8的形式存着呢。嗯,你看这个跟我前面说的对字符串和字符集的认识错误,有没有相似呢?
本来Java提供的String的构造函数String(byte[] bytes, String charsetName) 可是为了让我们从用charsetName字符集编码了的字节数组里面获得字符串的。而我们知道Java内部的字符串是用UTF8的形式存着的。也就是说,你用这个构造函数的时候Java已经帮你实现了从charsetName字符集的字符串转化为UTF8字符串了。嗯,你们估摸估摸吧,我也说不清呢。。
话说,他是不是给你gb2312编码的字符数组了呢?两个扩展的ASCII字节可以构成一个中文字符,所以有可能是他给你了gb2312编码的数组了,可是说出来确是ASCII数组了。
你试试String s=new String(cascii,"gb2312");
如果不行把gb2312换成utf8等字符集试试,如果再不行,呃掉吧。。
热心网友
时间:2023-09-21 04:41
看了几位回答感觉有点好笑楼主本身出了假命题几位回答都没有弄清字符集转换楼主也知道自己本身犯了致命错误好本身多位编码却硬要用低位码去解码出错才怪呢
String
s1
=new
String(chinaString.getBytes("gb2312"),"ISO-8859-1");
里gb2312省略系统会默认用控制面板设定好字符集因原来好多位编码所必须用多位编码去解码也gb2312或utf-8去解码样chinaString.getBytes("gb2312")变成byte数组时候随意重新指定编码iso-8859-1,s1变成iso-8859-1编码字符串想重新转文用字符集编码必须用字符集来解码里iso-8859-1,来做
String
s2
=
new
String(s1.getBytes("ISO-8859-1"),"gb2312");
样s2又重新变回文了所当打印s2时好
还有问题里用iso-8859-1来重新编码而用其字符集呢里因其字符集无法相互转码而发生编码丢失现象试试把iso-8850-1换成utf-8试试无法重新转回来导致乱码现象ios-8850-1换成gbk大部分因gbk兼容gb2312所有都能相互转回来好用iso-8850-1来作间转码字符集因所有字符集都对iso-8859-1兼容管gbk还gb2312utf-8都能完美地转换回来
说了多能大家还有点迷糊应用地方我举例子大家知道经常有人做网络爬虫把网页下载下来网页编码各种各样,主要有iso-8859-1,gbk,gb2312,utf-8,网页io字节流下载下来要想把转换字符流也文字时候要知道编码办呢样做管首先iso-8859-1编码转换过来再用正则表达式看看网页头部:
<meta
content="text/html;
charset=gb2312"
http-equiv="Content-Type">时知道网页编码gb2312,再利用式子
String
s2
=
new
String(s1.getBytes("ISO-8859-1"),"gb2312");
s2能正确显示网页内容假用其字符集utf-8作间码也能知道网页编码gb2312用式子
String
s2
=
new
String(s1.getBytes("utf-8"),"gb2312")会出现乱码现象所好用iso-8859-1作间码
所楼主除了犯上错误外还有应该用US-ASCII作间码否则能转换文们之间无法做相互转换只有iso-8859-1才能完美转换成其编码
热心网友
时间:2023-09-21 04:42
String s = new String(chinaString.getBytes("US-ASCII"),"GB2312");
GB2321 或者UTF-8 在这里随便你写,写你想变的格式
参考资料:如果您的回答是从其他地方引用,请表明出处
热心网友
时间:2023-09-21 04:42
1、在网页中输出中文。
JAVA在网络传输中使用的编码是"ISO-8859-1",故在输出时需要进行转化,如:
String str="中文";
str=new String(str.getBytes("GB2312"),"8859_1");
但假如在编译程序时,使用的编码是“GB2312”,且在中文平台上运行此程序,不会出现此问题,一定要注重。
2、从参数中读取中文
这正好与在网页中输出相反如:
str=new String(str.getBytes("8859_1"),"GB2312");
3、操作DB中的中文问题
一个较简单的方法是:在“控制面扳”中,把“区域”设置为“英语(美国)”。假如还会出现乱码,还可进行如下设置:
取中文时:str=new String(str.getBytes("GB2312"));
向DB中输入中文:str=new String(str.getBytes("ISO-8859-1"));
4、在jsp中的中文解决:
在“控制面扳”中,把“区域”设置为“英语(美国)”.
在JSP页面中加入:
假如还不行正常显示,则还要进行下面的转换:
如:name=new String(name.getBytes("ISO-8859-1"),"GBK");
就不会出现中文问题了。