【问题标题】:Java - Unable to read foreign charactersJava - 无法读取外来字符
【发布时间】:2020-10-21 21:26:33
【问题描述】:

我之前已经成功使用过 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: >?¤?¤?¤<

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

【问题讨论】:

    标签: java unicode file-io character


    【解决方案1】:

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

    选项 #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 问题并提供有关您的设置的大量详细信息(哪个操作系统,哪个终端客户端,@ 987654323@打印,客户端是否有编码选项等)。

    选项 #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 个字节),并且当您使用 @987654328 读取它们时,原始字节@,按顺序排列:195 164 195 164 195 164。因此,如果您运行上面的代码并打印 195 而不是 228 - 您的输入可能是 UTF-8;它绝对不在 ISO-8859-13 中。

    【讨论】:

    • 我通过十六进制编辑器打开文件,发现它是 c3 a4,即 UTF-8。从 ISO8859-13 更改为 UTF-8 后,预期的输出是可见的。最大的问题是,在打开文件时,应该如何确定应该使用 ISO8859-13 还是 UTF-8 之类的东西?
    • 通过询问谁写的。没有算法、公式或任何其他要知道的东西。烦人,不是吗?
    猜你喜欢
    • 1970-01-01
    • 2013-11-22
    • 2016-09-04
    • 2014-05-27
    • 1970-01-01
    • 2015-04-05
    • 1970-01-01
    • 2015-01-20
    • 2013-04-12
    相关资源
    最近更新 更多