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 中。
我之前用过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 中。