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)
        {
        }

    }
}

在 Windows 和 Linux 上 and/or 没有 Eclipse 的输出是相同的。

 Line Read: >?¤?¤?¤<

这以前适用于许多其他角色,但为什么不适用于这个?

对于您所观察到的现象,可能有多种解释。最有可能的两个,以及一些您可以用来确认您已找到原因的代码:

选项 #1:终端问题

也许您正在将此写入无法呈现 ä 的终端,或者存在终端传输问题(终端最终只是一堆连接在一起的流和管道,它们是字节hood,所以如果过程的一部分认为所有字节都被解释为 UTF-8 编码文本,而另一个部分则认为所有字节都被解释为 ISO-8859-13 编码,你就会遇到问题)。鉴于您在 windows 上看到与在 linux 上完全相同的输出,这不太可能(如果您在 IDE 的 'console' 视图中看到这一点,则特别有可能,或同一代码在不同系统上的不同输出)。如果您想测试它,请改为 运行:System.out.println("unicode codepoint of the first character: " + (int) line.charAt(0)); - 这应该打印 228,这是 ä 的 unicode 代码点。如果没有,那么您可以确定这不是(唯一的)问题。

如果是这样,解决方法是,好吧,使用另一个终端或弄乱设置,我只想问另一个 SO 问题并提供有关您的设置的大量详细信息(OS,其中终端客户端,SET 打印什么,客户端是否有编码选项等)。

选项 #2:它实际上不是 ISO-8859-13

这也很容易测试:注释掉你的 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 中。