急!急!JAVA中ASCII转码问题??

我用java开发的,根据业务需要,要把字符集为ascii的byte[],转为中文?

String chinaString = "你好";
byte[] cascii = chinaString.getBytes("US-ASCII");
有什么方法以将 byte[] cascii 里的内容,转为中文?
String s1 = new String(chinaString.getBytes("US-ASCII"),"GB2312");
String s2 = new String(chinaString.getBytes("US-ASCII"),"UTF-8");
String s3 =new String(chinaString.getBytes("ISO-8859-1"),"GBK");
和其他的字节符都方试过了,都不行!打印出来的都是:??

回:寻找逆流的鱼 -- 不是我想用ACSII码,而是前面我说了是业务需要,对方的接口返回给我的就是这样,我也很无耐。所以在这里向大侠们请教!

看了几位的回答,感觉有点好笑,楼主本身就出了一个假命题,几位回答都没有弄清字符集的转换,楼主也不知道自己本身就犯了一个致命错误,“你好”本身就是一个多位编码,你却硬要用低位码去解码,不出错才怪呢?
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才能完美转换成其他编码。
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-10-22
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等字符集试试,如果再不行,呃掉吧。。
第2个回答  2019-10-04
看了几位回答感觉有点好笑楼主本身出了假命题几位回答都没有弄清字符集转换楼主也知道自己本身犯了致命错误好本身多位编码却硬要用低位码去解码出错才怪呢
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才能完美转换成其编码
第3个回答  2009-10-21
String s = new String(chinaString.getBytes("US-ASCII"),"GB2312");

GB2321 或者UTF-8 在这里随便你写,写你想变的格式

参考资料:如果您的回答是从其他地方引用,请表明出处

第4个回答  2009-10-21
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");
就不会出现中文问题了。

急!急!JAVA中ASCII转码问题??
这里因为,其他字符集无法相互转码而发生编码丢失现象,你可以试试,把iso-8850-1换成utf-8试试,这无法重新转回来,这导致乱码现象,如果你ios-8850-1换成gbk,大部分是可以的,因为gbk兼容gb2312,但是,不是所有的都能相互转回来,最好用iso-8850-1来作为中间转码字符集,这是因为所有的字符集都...

JAVA不能直接获得输入字符的ASCAII值吗?为什么还要利用utf-8进行文字...
AscII不能做到包含所有字符,换句话说就是不能实现国际化,java内部是用unicode编码的,UTF-8是unicode的一种实现。

Oracle库采用的是ascii编码,也就是英文字符集库。java通过jdbc查询出 ...
使用 ASCII 7bit 当中间缓存字符集,我们无法保存汉字编码的 8bit 数据,最终显示成问号,这步已经失真了。这里面我们要想到我们的 GB2312 或 UTF8 这样的字符集本身都是假设一个字节的最高位 (8bit 中的第1个 bit)是有特殊意义的,当我们用 US7ASCII 是它忽略掉这个位只处理后面7-bit 的。...

我反编译JAVA文件,有一些汉字信息就变成了\项 了
针对你的问题,在 cmd 窗口中执行下面的命令即可(需要将 jdk文件夹\/bin 加入到 path 环境变量中):native2ascii -reverse C:\\abc.java c:\\abc2.java (这里abc.java表示你的含有 \\uxxxx 字符的java文件;c:\\abc2.java 表示转后后的文件)下面附上完整的 使用方法:--- native2ascii用法解析 na...

\\xd0\\xa1\\xc4\\xac是什么的转码,要怎么转回去啊,用native2ascii不...
先前转错了吧,这种是ASCII,但不是JAVA的格式的、是普通的 ASCII 。JAVA的是 \目\前\用\戶:

java程序读取properties配置文件出现中文乱码
)。这样可以将乱码转换为中文。不过,这种方法需要对后续的"password"等属性值也进行类似的操作。如果你熟悉反射机制,那么使用反射可以更方便地进行这种转码处理。总之,通过上述两种方式,可以有效地解决Java程序读取properties配置文件时的中文乱码问题,选择哪种方法取决于你的编程习惯和对反射的理解程度。

如何将普通的txt文本格式转换成ASCII啊?
用来将别的文本类文件(比如*.txt,*.ini,*.properties,*.java等等)编码转为Unicode编码。一.获取native2ascii安装了jdk后,假如你是在windows上安装,那么在jdk的安装目录下,会有一个bin目录,其中native2ascii.exe正是。二.使用方法命令行格式: native2ascii.exe -[options] [inputfile [output...

Java中如何将gbk装换为ansi
对于java,在字符集间进行转换时比较常用的功能,尤其在web应用中。首先我们要先了解一些知识点:一、关键技术点:1、当前流行的字符编码格式有:US-ASCII、ISO-8859-1、UTF-8、UTF-16BE、UTF-16LE、UTF-16、GBK、GB2312等,其中GBK、GB2312是专门处理中文编码的。2、String的getBytes方法用于按指定...

java 怎么判断文本内容的编码
利用java.io.Properties的load方法读入属性文件虽然方便,但如果属性文件中有中文,在读入之后就会发现出现乱码现象。发生这个原因是load方法使用字节流读入文本,在读入后需要将字节流编码成为字符串,而它使用的编码是“iso-8859-1”,这个字符集是ASCII码字符集,不支持中文编码, 方法一:使用显式的转码:[java] view plai...

native2ascii使用方法
首先,确认JAVA_HOME路径下的native2ascii命令行工具已经准备就绪。然后,指定原始文件的路径,即"D:\\src\\resources.properties",这是含有非Unicode字符的文件。接着,指定转换后的目标文件路径,即"D:\\classes\\resources.properties",这个文件将会接收转换后的Unicode字符。执行转换的命令如下:JAVA_HOME\\...

相似回答