【问题标题】:BufferedReader returns ISO-8859-15 String - how to convert to UTF16 String?BufferedReader 返回 ISO-8859-15 字符串 - 如何转换为 UTF16 字符串?
【发布时间】:2009-07-01 15:46:45
【问题描述】:

我有一个 FTP 客户端类,它返回指向文件的 InputStream。我想用 BufferedReader 逐行读取文件。问题是,客户端以二进制模式返回文件,并且文件具有 ISO-8859-15 编码。

【问题讨论】:

  • 我不明白 UTF-8 是如何在这里涉及的 - Java 在内部使用 UTF-16,而不是 UTF-8。
  • 对不起,应该是UTF-16。固定。

标签: java character-encoding


【解决方案1】:

如果文件/流/任何内容确实包含 ISO-8859-15 编码文本,您只需在创建 InputStreamReader 时指定:

BufferedReader br = new BufferedReader(
    new InputStreamReader(ftp.getInputStream(), "ISO-8859-15"));

然后readLine() 将以 Java 的本机编码(是 UTF-16,而不是 UTF-8)创建有效的字符串。

【讨论】:

  • 我很确定,除非您使用带有编码器参数的构造函数形式,而不仅仅是字符串或字符集,否则您不会收到格式错误的输入异常。
  • @tchrist:你说的是接受 CharsetDecoder 参数的 ISR 构造函数,对吧?确实,所有其他 ctor 创建了 替换 无效字符而不是抛出异常的解码器。但我认为 ISO-8859-15 解码器无论如何都不会抛出异常。每个可能的字节值都映射到一个有效字符,这是它可以检测到格式错误的输入的唯一方法。
  • 是的,没错。问题是当你请求 UTF-8 却没有得到它时——并且没有得到异常!!同样对于输出,如果您(愚蠢地)默认为平台默认编码,在 Mac 上至少用? 字符替换不可映射的代码点,同样既没有警告也没有异常。我已经习惯了在这些领域使用 Perl 的更安全的行为,而 Java 的默认设置完全被破坏了。因此,我们的整个代码库(Java 部分,而不是 Perl 部分)充满了令人讨厌的错误。几乎让您想要对标准 Java 库进行猴子补丁。 几乎。 ☺
【解决方案2】:

试试这个:

BufferedReader br = new BufferedReader(
                        new InputStreamReader(
                            ftp.getInputStream(),
                            Charset.forName("ISO-8859-15")
                        )
                    );
String row = br.readLine();

【讨论】:

    【解决方案3】:

    原始字符串采用 ISO-8859-15,因此 InputStreamReader 读取的字节流将采用这种编码。所以使用该编码读入(在 InputStreamReader 构造函数中指定)。这告诉 InputStreamReader 传入的字节流在 ISO-8859-15 中并执行适当的字节到字符的转换。

    现在它将采用标准 Java UTF-16 格式,然后您就可以随心所欲了。

    我认为当前的问题是您正在使用默认编码读取它(通过未在 InputStreamReader 中指定编码),然后尝试转换它,到那时为时已晚。

    对这类类使用默认行为通常会以悲痛告终。最好尽可能指定编码,和/或通过-Dfile.encoding默认VM编码

    【讨论】:

    • 一定是误点击,抱歉,撤消已经太迟了:(
    【解决方案4】:

    你试过了吗:

    BufferedReader r = new BufferedReader(new InputStreamReader("ISO-8859-1"))
    ...
    

    【讨论】:

    • s/b ISO-8859-15,不是 ISO-8859-1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 2020-01-25
    • 2018-03-03
    相关资源
    最近更新 更多