Re: [閒聊] netbeans亂碼的問題還沒解決吧?

看板java作者 (有些事,有時候。。。)時間13年前 (2012/07/29 15:28), 編輯推噓5(500)
留言5則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《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)

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
推文XD
08/06 19:43, 5F
文章代碼(AID): #1G5EOBLp (java)
文章代碼(AID): #1G5EOBLp (java)