簡體   English   中英

從文件讀取特殊字符-Java

[英]Reading special characters from File - Java

我正在從具有以下屬性的文本文件中讀取數據:

編碼:ANSI
文件類型:PC

現在,該文件包含許多特殊字符,例如度數符號(º)等。我正在使用以下代碼讀取此文件:

File file = new File("C:\\X\\Y\\SpecialCharacter.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));

如果文件編碼為ANSI,則上面的代碼無法正確讀取文件行中的特殊字符:
“降低熱量並慢火煮,直到產品達到內部溫度165ºF”, reader.readLine()將輸出:
“降低熱量並慢燉,直到產品達到內部溫度165°F”

當我將文件的編碼更改為UTF-8時,該行將按文件中的原樣進行讀取,而不會弄亂特殊字符。

我的問題是,數據什么時候弄亂了? 將數據存儲在文件中還是從文件中讀取數據? 在記事本中打開文件會正確顯示所有特殊字符。 這是怎么發生的?

十六進制轉儲輸出:

          -0 -1 -2 -3  -4 -5 -6 -7  -8 -9 -A -B  -C -D -E -F

00000000- 4C 6F 77 65  72 20 68 65  61 74 20 61  6E 64 20 73 [Lower heat and s]
00000001- 69 6D 6D 65  72 20 75 6E  74 69 6C 20  70 72 6F 64 [immer until prod]
00000002- 75 63 74 20  72 65 61 63  68 65 73 20  69 6E 74 65 [uct reaches inte]
00000003- 72 6E 61 6C  20 74 65 6D  70 65 72 61  74 75 72 65 [rnal temperature]
00000004- 20 6F 66 20  31 36 35 BA  46                       [ of 165.F       ]

“ ANSI”不是特定的編碼-它是編碼的完整集合 讀取文件時,您需要使用正確的編碼。 例如,您完全有可能使用Windows-1252編碼,這意味着您可能想嘗試傳遞“ Cp1252”作為編碼名稱。

實際上,您傳遞的是“ UTF-8”, 它不是通常稱為ANSI的編碼之一。 您需要找出文件使用的確切編碼,然后在InputStreamReader參數中指定該編碼。

我的問題是,數據什么時候弄亂了? 將數據存儲在文件中還是從文件中讀取數據?

假設編碼能夠代表您感興趣的所有字符,那么僅當您讀取文件時才可以。 基本上,您試圖讀取它,就像它實際上是另一種編碼一樣。 記事本正在執行某種啟發式編碼檢測,或者恰好在這種特定情況下使用正確的默認值。

new InputStreamReader(new FileInputStream(file), "UTF-8")用於讀取UFT-8編碼的文件:如果您要讀取編碼不同的文件(例如Win 1252),則應相應地更改第二個參數。

文本文件永遠不會“陷入混亂”地進行編碼:它以某種編碼存儲,並且在讀取文本文件時應使用相同的編碼,以便系統可以解釋該原始字節流並關聯每個[字節組] [s]帶有正確的字符[或Unicode代碼點,如果我們正在執行Unicode],則可以看到“正確的”字形。

希望這可以澄清一點。

干杯

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM