簡體   English   中英

Java - 無法讀取外來字符

[英]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: >?¤?¤?¤<

這以前適用於許多其他角色,但為什么不適用於此?

對於你所觀察到的,有很多可能的解釋。 最有可能的兩個,以及一些可用於確認您已找到原因的代碼:

選項#1:終端問題

也許您正在將其寫入無法呈現 ä 的終端,或者存在終端傳輸問題(終端最終只是一堆連接在一起的流和管道,它們是引擎蓋下的字節,所以如果一個該過程的一部分認為所有字節都被解釋為 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打印什么,客戶端有編碼選項等)。

選項#2:它實際上不是 ISO-8859-13

這也很容易測試: 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.

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