[英]Java - Unable to read foreign characters
我之前已經成功使用過 ISO8859-13 字符編碼,但這次它似乎不起作用。
根據網站https://en.wikipedia.org/wiki/ISO/IEC_8859-13,它是一個有效字符。
這些是存儲在文件中的 3 個字符。 啊啊啊
這是正在使用的代碼。
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class ReadFile
{
public static void main(String[] arguments)
{
try
{
File inFile = new File("C:\\Downloads\\MyFile.txt");
if (inFile.exists())
{
System.out.println("File found");
BufferedReader in = new BufferedReader(
new InputStreamReader(new FileInputStream(inFile), "ISO8859-13"));
String line = null;
while ( (line = in.readLine()) != null )
{
System.out.println("Line Read: >" + line + "<");
}
}
else
{
System.out.println("File not found");
}
}
catch (IOException e)
{
}
}
}
帶有和/或不帶有 Eclipse 的 Windows 和 Linux 上的輸出是相同的。
Line Read: >?¤?¤?¤<
這以前適用於許多其他角色,但為什么不適用於此?
對於你所觀察到的,有很多可能的解釋。 最有可能的兩個,以及一些可用於確認您已找到原因的代碼:
也許您正在將其寫入無法呈現 ä 的終端,或者存在終端傳輸問題(終端最終只是一堆連接在一起的流和管道,它們是引擎蓋下的字節,所以如果一個該過程的一部分認為所有字節都被解釋為 UTF-8 編碼的文本,而另一個被解釋為 ISO-8859-13 編碼,你會遇到問題)。 鑒於您在 Windows 上看到與在 linux 上完全相同的輸出,這不太可能(如果您在 IDE 的“控制台”視圖中看到這一點,或者在不同系統上看到相同代碼的不同輸出,則很有可能)。 如果要測試它,請改為運行: System.out.println("unicode codepoint of the first character: " + (int) line.charAt(0));
- 這應該打印228
,這是 ä 的 unicode 代碼點。 如果沒有,那么您可以確定這不是(唯一的)問題。
如果是這樣,那么修復是使用另一個終端或設置混亂,我只是問另一個 SO 問題並提供有關您的設置的大量詳細信息(哪個操作系統,哪個終端客戶端, SET
打印什么,客戶端有編碼選項等)。
這也很容易測試: BufferedReader in = ....
行中注釋掉您的BufferedReader in = ....
並將其替換為: System.out.println(new FileInputStream(file).read());
- 這應該打印 228。如果它打印任何其他內容,則您的輸入文件實際上不是 ISO-8859-13。
如果是這樣,請找出實際的編碼並使用它。 例如,在 UTF-8 編碼中, ä
將在文件中以 2 個字節結束。 這已經意味着你的輸入文件只包含äää
之后甚至沒有換行符是 6 字節大(在 ISO-8859-13 中,它將是 3),並且原始字節,當你用fileInputStream.read()
,依次為: 195 164 195 164 195 164
。 因此,如果您運行上述代碼並打印 195 而不是 228 - 您的輸入可能是 UTF-8; 它絕對不在 ISO-8859-13 中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.