Java-无法读取外来字符
我以前成功地使用过ISO8859-13字符编码,但这次它似乎不起作用 根据网站,它是一个有效字符 这些是文件中存储的3个字符。 äää 下面是正在使用的代码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 {
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: >?¤?¤?¤<