Java-无法读取外来字符

Java-无法读取外来字符,java,unicode,file-io,character,Java,Unicode,File Io,Character,我以前成功地使用过ISO8859-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 {

我以前成功地使用过ISO8859-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)
        {
        }

    }
}
导入java.io.BufferedReader;
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.IOException;
导入java.io.InputStreamReader;
公共类读取文件
{
公共静态void main(字符串[]参数)
{
尝试
{
File infle=新文件(“C:\\Downloads\\MyFile.txt”);
如果(infle.exists())
{
System.out.println(“找到文件”);
BufferedReader in=新的BufferedReader(
新的InputStreamReader(新文件InputStream(infle),“ISO8859-13”);
字符串行=null;
而((line=in.readLine())!=null)
{

System.out.println(“行读取:>”+Line+“对于您正在观察的内容,有许多可能的解释。最有可能的两种解释,以及一些代码,您可以使用它们来确认您已找到原因:

选项1:终端问题 可能您正在将其写入无法呈现ä的终端,或者存在终端传输问题(终端最终只是一组连接在一起的流和管道,它们是隐藏在引擎盖下的字节,因此,如果流程的一部分认为所有字节都同意所有字节都将被解释为UTF-8编码的文本,而另一部分被解释为ISO-8859-13编码的文本,那么就会出现问题)。如果您在windows上看到的输出与在linux上看到的输出完全相同,则不太可能出现这种情况(如果您在IDE的“console”视图中看到这种情况,或者在不同系统上看到相同代码的不同输出,则尤其可能)。如果您要测试它,请运行:
System.out.println(“第一个字符的unicode代码点:”+(int)line.charAt(0));
-这应该打印
228
,这是ä的unicode码点。如果没有,那么您可以确定这不是(唯一)问题

如果是这样的话,那么解决办法就是使用另一个终端或干扰设置,我只需要问另一个SO问题,并提供大量有关设置的详细信息(哪个操作系统,哪个终端客户端,设置了什么
打印,客户端是否有编码选项,等等)

选项2:它实际上不是ISO-8859-13 这也很容易测试:注释掉您的
BufferedReader in=..
行,并将其替换为:
System.out.println(新文件inputstream(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中。

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

选项1:终端问题 可能您正在将其写入无法呈现ä的终端,或者存在终端传输问题(终端最终只是一组连接在一起的流和管道,它们是隐藏在引擎盖下的字节,因此,如果流程的一部分认为所有字节都同意所有字节都将被解释为UTF-8编码的文本,而另一部分被解释为ISO-8859-13编码的文本,那么就会出现问题)。如果您在windows上看到的输出与在linux上看到的输出完全相同,则不太可能出现这种情况(如果您在IDE的“console”视图中看到这种情况,或者在不同系统上看到相同代码的不同输出,则尤其可能)。如果您要测试它,请运行:
System.out.println(“第一个字符的unicode代码点:”+(int)line.charAt(0));
-这应该打印
228
,这是ä的unicode码点。如果没有,那么您可以确定这不是(唯一)问题

如果是这样的话,那么解决办法就是使用另一个终端或干扰设置,我只需要问另一个SO问题,并提供大量有关设置的详细信息(哪个操作系统,哪个终端客户端,设置了什么打印,客户端是否有编码选项,等等)

选项2:它实际上不是ISO-8859-13 这也很容易测试:注释掉您的
BufferedReader in=..
行,并将其替换为:
System.out.println(新文件inputstream(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中。

我通过十六进制编辑器打开文件,注意到它是c3 a4,这是UTF-8。从ISO8859-13更改为UTF-8后,预期的输出是可见的e、 最大的问题是,当打开一个文件时,应该如何确定是否应该使用ISO8859-13或UTF-8?通过询问谁编写了它。没有算法
 Line Read: >?¤?¤?¤<