Re: [閒聊] netbeans亂碼的問題還沒解決吧?
※ 引述《if4 (逍遙遊)》之銘言:
: 之前...有人發問題文...問 netbeans 下遇到亂碼的問題...
: 我也遇到...
: 也請教過我的老師...
: 他也沒解決...
: 我現在不算已經解決...在 netbeans 下我依然有亂碼...
: 但是我今天把 jar 弄出來後...
: 執行...
: 意外的發現沒有亂碼...這算是已經解決了嗎?我也不知道...但是以 jar 形式
: 執行...確實沒有亂碼...
: 有亂碼的...
: http://i303.photobucket.com/albums/nn131/if930/nbj01.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)
推
07/29 15:38, , 1F
07/29 15:38, 1F
推
07/29 15:42, , 2F
07/29 15:42, 2F
推
07/29 15:50, , 3F
07/29 15:50, 3F
推
07/29 15:59, , 4F
07/29 15:59, 4F
推
08/06 19:43, , 5F
08/06 19:43, 5F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):