又遇到乱码问题了

Silence_Smile 2010-07-02 04:20:01

URL url = new URL("http://weather.xcyh.org/xml");
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = "",result = "";
while( (line =br.readLine()) != null ){
result +="\n"+line;
}
result = new String(result.getBytes(),"UTF-8");
System.out.println(result);

用HttpURLConnection得到一个xml,这个xml的编码是utf-8,但是打印出来一句话里有的正常有的是??,很奇怪
<?xml version="1.0" ?>
<weatherinfo>
<cityname>无锡</cityname>
<citycode>101190201</citycode>
<citydesc>江苏 无锡</citydesc>
<spell>Wuxi</spell>
<areacode>0510</areacode>
<zipcode>214000</zipcode>
<longitude>E120.288</longitude>
<latitude>N31.574</latitude>
<publishtime>2010-07-02 11:00</publishtime>
<data>
<date>2010-07-02</date>
<icon>d04|n04</icon>
<weather>雷阵??/weather>
<temperature>36??28??/temperature>
<winddirect>西南??-4??/winddirect>
</data>
<data>
<date>2010-07-03</date>
<icon>d04|n04</icon>
<weather>雷阵??/weather>
<temperature>32??26??/temperature>
<winddirect>西风3-4级转西北??-4??/winddirect>
</data>
<data>
<date>2010-07-04</date>
<icon>d04|n04</icon>
<weather>雷阵??/weather>
<temperature>32??26??/temperature>
<winddirect>西北??-4??/winddirect>
</data>
<data>
<date>2010-07-05</date>
<icon>d01|n07</icon>
<weather>多云转小??/weather>
<temperature>32??25??/temperature>
<winddirect>东风3-4??/winddirect>
</data>
<data>
<date>2010-07-06</date>
<icon>d01|n01</icon>
<weather>多云</weather>
<temperature>32??24??/temperature>
<winddirect>东风3-4??/winddirect>
</data>
<data>
<date>2010-07-07</date>
<icon>d01|n01</icon>
<weather>多云</weather>
<temperature>32??24??/temperature>
<winddirect>东风3-4??/winddirect>
</data>
<data>
<date>2010-07-08</date>
<icon>d01|d01</icon>
<weather>多云</weather>
<temperature>29??29??/temperature>
<winddirect>东风3-4??/winddirect>
</data>
<live>
<updatetime>16:00</updatetime>
<temperature>35.2??/temperature>
<humidity>50%</humidity>
<winddirect>西风小于3??/winddirect>
</live>
</weatherinfo>
...全文
323 43 打赏 收藏 转发到动态 举报
写回复
用AI写文章
43 条回复
切换为时间正序
请发表友善的回复…
发表回复
ilearn123 2010-07-03
  • 打赏
  • 举报
回复
mark
sun0322 2010-07-02
  • 打赏
  • 举报
回复
想要在doc下运行

除了javac -encoding UTF-8 *.java
还要做如下两步

1。chcp 65001//utf-8 回复命令为 chcp 936//即GBK

2。字体修改为:Lucida Console。
sun0322 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 40 楼 silence_smile 的回复:]
由于JDK是国际版的,在编译的时候,如果我们没有用-encoding参数指定我们的JAVA源程序的编码格式,则javac.exe首先获得我们操作系统默认采用的编码格式,也即在编译java程序时,若我们不指定源程序文件的编码格式,JDK首先获得操作系统的file.encoding参数(它保存的就是操作系统默认的编码格式,如WIN2k,它的值为GBK),然后JDK就把我们的java源程序从file.encoding编码格式转化为JAVA内部默认的UNICODE格式放入内存中。然后,javac把转换后的unicode格式的文件进行编译成.class类文件,此时.class文件是UNICODE编码的,它暂放在内存中,紧接着,JDK将此以UNICODE编码的编译后的class文件保存到我们的操作系统中形成我们见到的.class文件。对我们来说,我们最终获得的.class文件是内容以UNICODE编码格式保存的类文件,它内部包含我们源程序中的中文字符串,只不过此时它己经由file.encoding格式转化为UNICODE格式了。当我们不加设置就编译时,相当于使用了参数:javac -encoding gbk XX.java,当然就会出现不兼容的情况。

解决办法是:应该使用-encoding参数指明编码方式:javac -encoding UTF-8 XX.java [/Quote]

挺好!
Silence_Smile 2010-07-02
  • 打赏
  • 举报
回复
由于JDK是国际版的,在编译的时候,如果我们没有用-encoding参数指定我们的JAVA源程序的编码格式,则javac.exe首先获得我们操作系统默认采用的编码格式,也即在编译java程序时,若我们不指定源程序文件的编码格式,JDK首先获得操作系统的file.encoding参数(它保存的就是操作系统默认的编码格式,如WIN2k,它的值为GBK),然后JDK就把我们的java源程序从file.encoding编码格式转化为JAVA内部默认的UNICODE格式放入内存中。然后,javac把转换后的unicode格式的文件进行编译成.class类文件,此时.class文件是UNICODE编码的,它暂放在内存中,紧接着,JDK将此以UNICODE编码的编译后的class文件保存到我们的操作系统中形成我们见到的.class文件。对我们来说,我们最终获得的.class文件是内容以UNICODE编码格式保存的类文件,它内部包含我们源程序中的中文字符串,只不过此时它己经由file.encoding格式转化为UNICODE格式了。当我们不加设置就编译时,相当于使用了参数:javac -encoding gbk XX.java,当然就会出现不兼容的情况。

解决办法是:应该使用-encoding参数指明编码方式:javac -encoding UTF-8 XX.java
Silence_Smile 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 sxzlc 的回复:]

你自己练习,还是工作需求?
[/Quote]
自己做个东西

这里有个解释,不错
由于JDK是国际版的,在编译的时候,如果我们没有用-encoding参数指定我们的JAVA源程序的编码格式,则javac.exe首先获得我们操作系统默认采用的编码格式,也即在编译java程序时,若我们不指定源程序文件的编码格式,JDK首先获得操作系统的file.encoding参数(它保存的就是操作系统默认的编码格式,如WIN2k,它的值为GBK),然后JDK就把我们的java源程序从file.encoding编码格式转化为JAVA内部默认的UNICODE格式放入内存中。然后,javac把转换后的unicode格式的文件进行编译成.class类文件,此时.class文件是UNICODE编码的,它暂放在内存中,紧接着,JDK将此以UNICODE编码的编译后的class文件保存到我们的操作系统中形成我们见到的.class文件。对我们来说,我们最终获得的.class文件是内容以UNICODE编码格式保存的类文件,它内部包含我们源程序中的中文字符串,只不过此时它己经由file.encoding格式转化为UNICODE格式了。当我们不加设置就编译时,相当于使用了参数:javac -encoding gbk XX.java,当然就会出现不兼容的情况。 

解决办法是:应该使用-encoding参数指明编码方式:javac -encoding UTF-8 XX.java
sun0322 2010-07-02
  • 打赏
  • 举报
回复
你自己练习,还是工作需求?
sun0322 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 silence_smile 的回复:]
引用 32 楼 sxzlc 的回复:

引用 31 楼 silence_smile 的回复:
引用 29 楼 sxzlc 的回复:

引用 28 楼 silence_smile 的回复:
引用 25 楼 sxzlc 的回复:

System.out.println(new String("东南风4-5级".getBytes("utf-8"),"utf-8"));
这样不就转回来了……
[/Quote]

你如果有awt,那就直接导出jar看看有没有乱码?
如果没有awt,那你在doc下运行下程序,看看出不出乱码?
Silence_Smile 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 35 楼 sxzlc 的回复:]

引用 34 楼 silence_smile 的回复:
引用 32 楼 sxzlc 的回复:

引用 31 楼 silence_smile 的回复:
引用 29 楼 sxzlc 的回复:

引用 28 楼 silence_smile 的回复:
引用 25 楼 sxzlc 的回复:

System.out.println(new String("东南风4-5级".getBytes(……
[/Quote]
在本地的确还是乱码,看来跟JDK的默认编码有关啊!
sun0322 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 silence_smile 的回复:]
引用 32 楼 sxzlc 的回复:

引用 31 楼 silence_smile 的回复:
引用 29 楼 sxzlc 的回复:

引用 28 楼 silence_smile 的回复:
引用 25 楼 sxzlc 的回复:

System.out.println(new String("东南风4-5级".getBytes("utf-8"),"utf-8"));
这样不就转回来了……
[/Quote]

你这么做,程序导出jar包后,运行不出乱码吗?
Silence_Smile 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 sxzlc 的回复:]

引用 31 楼 silence_smile 的回复:
引用 29 楼 sxzlc 的回复:

引用 28 楼 silence_smile 的回复:
引用 25 楼 sxzlc 的回复:

System.out.println(new String("东南风4-5级".getBytes("utf-8"),"utf-8"));
这样不就转回来了?


关于“这样不就转回来了?”你……
[/Quote]
搞定了,更改Eclipse默认编码!
Window->Preferences->General->Workspace->Text file encoding
将其改为UFT-8即可。
这样收到的内容默认就认为是utf-8了
Silence_Smile 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 sxzlc 的回复:]

引用 31 楼 silence_smile 的回复:
引用 29 楼 sxzlc 的回复:

引用 28 楼 silence_smile 的回复:
引用 25 楼 sxzlc 的回复:

System.out.println(new String("东南风4-5级".getBytes("utf-8"),"utf-8"));
这样不就转回来了?


关于“这样不就转回来了?”你……
[/Quote]
搞不定...
sun0322 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 silence_smile 的回复:]
引用 29 楼 sxzlc 的回复:

引用 28 楼 silence_smile 的回复:
引用 25 楼 sxzlc 的回复:

System.out.println(new String("东南风4-5级".getBytes("utf-8"),"utf-8"));
这样不就转回来了?


关于“这样不就转回来了?”你仔细看看我的注释,

还有,字符串中没有数字

S……
[/Quote]

怎么解决?
Silence_Smile 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 sxzlc 的回复:]

引用 28 楼 silence_smile 的回复:
引用 25 楼 sxzlc 的回复:

System.out.println(new String("东南风4-5级".getBytes("utf-8"),"utf-8"));
这样不就转回来了?


关于“这样不就转回来了?”你仔细看看我的注释,

还有,字符串中没有数字

String testDecodeStr ……
[/Quote]
恩,果然是这样
sun0322 2010-07-02
  • 打赏
  • 举报
回复
我觉得这个程序取得从网络传过来的编码是以下这样的

String testEncodeStr = new String("东南风4-5级".getBytes("utf-8"));
sun0322 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 silence_smile 的回复:]
引用 25 楼 sxzlc 的回复:

System.out.println(new String("东南风4-5级".getBytes("utf-8"),"utf-8"));
这样不就转回来了?
[/Quote]

关于“这样不就转回来了?”你仔细看看我的注释,

还有,字符串中没有数字

String testDecodeStr = new String(testEncodeStr.getBytes("GBK"),"UTF-8");//这么就转回来了
Silence_Smile 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 sxzlc 的回复:]
[/Quote]
System.out.println(new String("东南风4-5级".getBytes("utf-8"),"utf-8"));
这样不就转回来了?
  • 打赏
  • 举报
回复
utf-8吧
Silence_Smile 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 sxzlc 的回复:]

引用 23 楼 silence_smile 的回复:
引用 22 楼 sxzlc 的回复:

Java code

//问题可以简化为这样,有人能解决吗

String testEncodeStr = new String("东南风4-5级".getBytes("utf-8"));
//涓滃崡椋?-5绾?
//从网络得到的字符是utf-8编码
//我知道以……

这个网站……
[/Quote]
我手机就是转了一下码,转成utf-8就行了啊!不过手机是用HttpConnection取的数据
手机里可以这么用的new String(result,"utf-8");然后就是对的
sun0322 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 silence_smile 的回复:]
引用 22 楼 sxzlc 的回复:

Java code

//问题可以简化为这样,有人能解决吗

String testEncodeStr = new String("东南风4-5级".getBytes("utf-8"));
//涓滃崡椋?-5绾?
//从网络得到的字符是utf-8编码
//我知道以……

这个网站的数据我在J2ME中取过,手机上都是没有问题的,很奇怪
[/Quote]

你手机的系统编码是什么?如果是UTF-8,那应该没有问题!

要是能把这个转回来,那问题就解决了!

String testEncodeStr = new String("东南风4-5级".getBytes("utf-8"));


xm8205515 2010-07-02
  • 打赏
  • 举报
回复
各位都是高手
加载更多回复(23)

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧