作者qrtt1 (有些事,有时候。。。)
看板java
标题Re: [闲聊] netbeans乱码的问题还没解决吧?
时间Sun Jul 29 15:28:09 2012
※ 引述《if4 (逍遥游)》之铭言:
: 之前...有人发问题文...问 netbeans 下遇到乱码的问题...
: 我也遇到...
: 也请教过我的老师...
: 他也没解决...
: 我现在不算已经解决...在 netbeans 下我依然有乱码...
: 但是我今天把 jar 弄出来後...
: 执行...
: 意外的发现没有乱码...这算是已经解决了吗?我也不知道...但是以 jar 形式
: 执行...确实没有乱码...
: 有乱码的...
: http://i303.photobucket.com/albums/nn131/if930/nbj01.jpg
: 没乱码的...
: http://i303.photobucket.com/albums/nn131/if930/nbj02.jpg
: 部分程式码...
: http://pastebin.com/1sQCNgTb
这事情有没有解决的关键是:你知不知道怎麽弄出乱码的呢?
如果你知道弄成乱码的『原因』并推测出正确显示的条件才是『解』
若是胡乱弄了,恰好发现能正常显示,那只是 work around。
首先,来谈一下你的程式码跟可以 reproduce 的程式有什麽差别。
0. 交待 reproduce 的环境与步骤
1. 程式必需可以执行且微小,但足够用来演示你的问题。
关於 0. 在你的文章中可以找到相关的线索,
但若您能明确交待会是更好的发问型式。
关於 1. 你的程式无法执行,会让想要协助你的人,多一道障碍。
通常是太闲的人才会去试着看它,
例如:像我这样脚扭伤在家哪都不能去的闲人。。
稍为整理一下,会像这样:
http://pastebin.com/1bZnTFBj
(只要剪下贴上到 IDE 内就能跑了。)
不过事实上只要:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
public class ShowData {
public static void main(String[] args) throws IOException {
URL httpurl = new URL("
http://tw.stock.yahoo.com/q/q?s=0050");
BufferedReader br = new BufferedReader(
new InputStreamReader(httpurl.openStream()));
String tmp;
while ((tmp = br.readLine()) != null) {
System.out.println(tmp);
}
br.close();
}
}
如果你没有简化到这个步骤,
能推测你可能未用过 debug 去检查是不是源头就出问题了。
因为当你简化到这步骤,你的问题范围就会缩小到
『为什麽 BufferedReader 在 NetBeans 下会产生乱码,
在 Windows Command Line 下却不会呢』
不确定你在向老师提问时有没有提到,你使用到 Reader。
因为一旦牵涉到 Reader 就会需要指定正确的编码。
你的情况是未指定,那麽程式执行时就会参考目前 JVM 的编码:
http://caterpillar.onlyfun.net/Gossip/Encoding/JVMEncoding.html
以你程式的情况来说,是没有指定编码的,能由你的执行结果推测:
1. 在 Windows Command Line 下取得的预设编码恰能正确显示文字
2. NetBeans 启动的 JVM 预设编码与 Windows Command Line 执行时不同
要验证这个想法,那当然是写程式出目前的 encoding:
import java.nio.charset.Charset;
public class ShowEncoding {
public static void main(String[] args) {
System.out.println("encoding: " + Charset.defaultCharset());
}
}
你得分别在 NetBeans 与 Windows Command Line 下执行,
以 osx 选中文语系来说,也有相似的情况,在 Eclipse 下是 utf-8
在 console 下是 Big5:
qty:TESTtest qrtt1$ java -classpath bin ShowEncoding
encoding: Big5
接着你在你正常时行的 Windows Command Line 多加参数:
java -Dfile.encoding=utf-8 ......
(你就会看到一样的乱码出现)
对你来说,要在 NetBeans 下能正常显示,你有二个选择:
1. 设定 jvm 启动参数 -Dfile.encoding=Big5
让它以 Big5 解读 Reader 的内容。
2. 正确指定 Reader 要使用的 charset
BufferedReader br = new BufferedReader(
new InputStreamReader(httpurl.openStream(), "Big5"));
另外,虽然 http header 不一定可靠,但还是值得检查一下 content-type:
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
public class ShowContentType {
public static void main(String[] args) throws IOException {
URL httpurl = new URL("
http://tw.stock.yahoo.com/q/q?s=0050");
HttpURLConnection huc = (HttpURLConnection) httpurl.openConnection();
System.out.println(huc.getHeaderField("Content-Type"));
}
}
结果为:text/html; charset=Big5
如果你的 case 都是写死的,那直接看 browser 实际上用什麽 encoding:
http://bit.ly/QUatdj
最後,如果你想要你写的程式不会换了 os 或执行环境就突然冒出乱码,
最好在开发时明确地指定你要用的预设编码为 utf-8,
并在该各别指定使用非预设编码的地方都写上。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.43.126.137
※ 编辑: qrtt1 来自: 114.43.126.137 (07/29 15:31)
※ 编辑: qrtt1 来自: 114.43.126.137 (07/29 15:33)
1F:推 if4:谢谢你详尽的解说 ^_^ 请容我慢慢消化...感恩 ^_^ 07/29 15:38
2F:推 if4:老实说...老师也没讲得这麽详细...你可以作我的老师...感恩^_^ 07/29 15:42
3F:推 if4:正确了...谢谢你的开导...已经不会乱码了...再一次谢谢你 ^_^ 07/29 15:50
4F:推 if4:建议板主把这篇编进精华文...谢谢 ^_^ 07/29 15:59
5F:推 Terrill:推文XD 08/06 19:43