2011-06-04 85 views
7

所以我試圖讓我的程序輸出一個帶有名稱列表的文本文件。一些名字有怪異的字符,例如Åström。如何讓日食在unicode中打印奇怪的字符?

我已經抓住了名的列表,這些從在「UTF-8」編碼的網頁,或者至少我敢肯定它,因爲頁面源說

「元HTTP的當量=「Content-Type」content =「text/html;字符集= UTF-8" /「

這是我到目前爲止已經試過:

public static void write(List<String> list) throws IOException { 
     Writer out = new OutputStreamWriter(new FileOutputStream("test.txt"), "UTF-8"); 
     try { 
      for (int i=0;i<list.size();i++) { 
       try { 
        byte[] utf8Bytes = list.get(i).getBytes("UTF-8"); 
        out.write(new String(utf8Bytes, "UTF-8")); 
       } catch (UnsupportedEncodingException e) { 
        e.printStackTrace(); 
       } 

       out.write(System.getProperty("line.separator")); 

      } 
     } 
     finally { 
     out.close(); 
     } 
    } 

,我,爲什麼它不工作有點困惑。我得到的輸出是「strström」,這很奇怪。

有人可以請指出我在正確的方向嗎?謝謝!

,並在另一個不相關的音符,有沒有寫一個新行到一個文本文件除了笨重

out.write(System.getProperty(「line.separator」))一個簡單的方法;

我有嗎?我在某個地方看到了這個網站,並且它可以工作,但我只是想知道是否有更簡潔的方法。

+1

當你檢查它時,你用什麼來打開文件?程序可能會檢測到錯誤的編碼。 – 2011-06-04 00:12:41

+0

此外,要檢查網頁的編碼,請嘗試查看檢測到的編碼。根據瀏覽器的不同,它可能位於Chrome的「查看」菜單或「扳手菜單 - >編碼」下。 – 2011-06-04 00:17:38

+0

我正在打開記事本中的文件。當我將這個詞複製並粘貼到記事本中時,角色顯示正確,但是當我運行程序時,有趣的東西出現了。 – wynnch 2011-06-04 00:27:03

回答

19

將您的Eclipse > Preferences > General > Workspace > Text file encoding設置爲UTF-8。

+0

哇,我不能相信答案是這麼簡單。非常感謝!!! – wynnch 2011-06-06 18:36:42

+0

非常好!如果需要,您還可以在「項目>屬性>資源」中爲每個項目設置不同的編碼。 – trashgod 2011-06-06 20:12:16

3

內容的確在UTF-8中,如果打印到控制檯,它看起來沒問題。可能導致問題的原因是字符串的解碼和編碼是不必要的。使用java.io.PrintWriter代替OutputStreamWriter。它有最後打印出帶有系統行分隔符的字符串的方法println。它看起來像這樣:

printStream.println(list.get(i)); 

另外,當打開文件看它嘗試使用瀏覽器。它們允許您在打開編碼後選擇編碼,以便您可以快速嘗試多種編碼以查看真正使用的編碼。

1

記事本不是特別豐富的編輯器。它會嘗試猜測文檔編碼,有時候會用unexpected results。 「純文本」文檔不包含關於其編碼的任何元數據,這給了它們一定的限制。 Windows應用程序(包括記事本)通常依賴字節順序標記(Java字符串中的U + FEFF或"\uFEFF")來確定編碼是否爲Unicode格式。這可能有助於記事本;這對你的網頁問題是沒用的。

HTML 4規範定義了how output encoding should be set。除了指定元編碼之外,您還應該設置Content-Type HTTP標頭。

你沒有提到你在你的web應用中使用什麼。一個servlet應該設置內容類型setContentType("text/html; charset=UTF-8");一個JSP應該使用頁面指令來做同樣的事情。其他視圖技術將提供類似的機制。


byte[] utf8Bytes = list.get(i).getBytes("UTF-8"); 
out.write(new String(utf8Bytes, "UTF-8")); 

該代碼執行一些無用的操作;它將字符數據從UTF-16轉換爲UTF-8,然後從UTF-8轉換回UTF-16,然後將數據寫入Writer(將再次將UTF-16轉碼爲UTF-8)。這段代碼是等價的:

String str = list.get(i); 
out.write(str); 

使用PrintWriter獲得新行的支持。


您可以用Java hereherehere閱讀更多關於字符編碼。