【问题标题】:java encoding issue while reading stream读取流时出现java编码问题
【发布时间】:2014-06-17 09:41:15
【问题描述】:

我正在尝试从 ftp 文件夹下载内容。有一个以标准化 xml 代码开头的 xml 文件。

< ?xml version="1.0" encoding="utf-8"?>

当我读取这些文件(使用 java.net.Socket)并获取输入流然后尝试转换为字符串时,不知何故我得到了一些新字符。整个 xml 文档以“?”开头例如。 "?....."

BufferedInputStream reader = new BufferedInputStream(sock.getInputStream());

然后我使用以下代码从该阅读器获取一个字符串。

StringBuilder sb = new StringBuilder();

String line;
BufferedReader br = new BufferedReader(new InputStreamReader(reader));

while ((line = br.readLine()) != null) {
    sb.append(line);
}
System.out.println ("sb.toString()");

不确定这里发生了什么。为什么我要介绍一些特殊的字符?任何建议将不胜感激

然后我只是使用以下代码读取文件并在控制台中看到一些特殊字符

BufferedReader reader = new BufferedReader(new     FileReader("c:/Users/appd922/DocumentMeta06122014.xml"));
StringBuffer sb = new StringBuffer();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line);
}

String output = sb.toString();
System.out.println("reading from file"+output);

我开始输出了 “正在读取文件

我从哪里得到这些特殊字符?

注意-忽略上面给出的 xml 文件行中的空格。如果没有那个空格,我不能用适当的 xml 在这里写。

【问题讨论】:

  • 如果文件已使用 UTF-8 编码正确读取,前三个字节将被读取为单个 byte order mark 字符,'\ufeff',一个特殊的 Unicode 字符,专门用于文本文档中的第一个字符,软件可以使用它来确定文档的整体编码(包括字节顺序,如果使用 UTF-16 或 UTF-32)。在您的情况下,它显示为三个字符“”,因为您使用 FileReader 使用系统的默认字符集,该字符集假定每个字节是一个字符。
  • 是否适合将 BOM 包含在带有 prolog 的 xml 文档中?

标签: java encoding ftp


【解决方案1】:

创建InputStreamReader从ftp读取文件时指定编码,例如:

BufferedReader br = new BufferedReader(new InputStreamReader(reader, "utf-8"));

否则,InputStreamReader 使用默认编码。另外,在读取下载的文件时指定编码。 FileReader 使用默认平台编码。使用InputStreamReader并指定编码,例如:

BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), "utf-8"));

【讨论】:

    【解决方案2】:

    这些字符被称为 BOM,字节顺序标记。如果您将InputStreamReader 的编码设置为“UTF-8”,您可以看到它们被解释为单个字符,即 BOM 字符。

    不幸的是,您必须自己处理这个字符,因为 Java 不会为您处理:java utf-8 and bom。通常你只是去掉它的流。祝你好运。

    【讨论】:

    • 是的,我必须处理 BOM 的代码,我删除了这个字符 - "\uFEFF"。它奏效了。谢谢
    猜你喜欢
    • 2012-07-17
    • 2013-10-18
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多