5

正如标题所说...我从 htto 响应中读取内容

 

    InputStream is = response.getEntity().getContent();
    String cw = IOUtils.toString(is);
    byte[] b = cw.getBytes("Cp1250");
    String x = StringUtils.newStringUtf8(b);
    String content = new String(b, "UTF-8");

    System.out.println(content);

 

我已经尝试了很多变化。我对用作字符串的正确编码常量有点困惑。windows-1250 或 Cp1250。UTF-8 还是 utf-8 还是 utf8?

4

5 回答 5

6

您似乎认为一个String对象具有编码。这是不正确的。编码用作从二进制数据(abyte[]InputStream)到文本数据(aStringchar[]等)的转换的一部分。

目前尚不清楚IOUtils.toString在做什么,但几乎可以肯定它会丢失数据或至少处理不当。如果您的数据最初位于 Windows-1250 中,那么您应该使用InputStreamReader包装,在构造函数调用InputStream中指定字符集。InputStreamReader

目前尚不清楚 UTF-8 的来源 - 之后您可能想用 UTF-8写出数据,但结果将是byte[],而不是字符串。

于 2012-07-07T18:31:55.503 回答
5

你正在向后转换。您需要将输入数据作为byte数组获取,然后用于String(byteArray, "Cp1250")创建 String 对象。然后,如果您想要 UTF-8,请使用String.getBytes("UTF-8").

于 2012-07-07T18:24:28.327 回答
3

编码具有规范(唯一)名称和其他不同的名称,并且不区分大小写。例如,“UTF-8”是规范名称,但有些 Java 版本支持它是“UTF8”;它被更多地写入了常用用法。“Windows-1250”也是如此,您可能还会在 HTML 页面中看到它。“Cp1250”(代码页)是一个 java 内部名称。

在java byte[] 是二进制数据,String(内部Unicode)是文本。 两者之间的转换需要编码,通常是可选的,采用操作系统默认值。

字节、输入流、输出流 <-> 字符串、字符、读取器、写入器

String cw = IOUtils.toString(is, "UTF-8"); // InputStream is binary gives byte[], hence give encoding
byte[] b = cw.getBytes("Cp1250");
String x = new String(b, "Cp1250");
String content = s;

System.out.println(content);

为了允许这种通用(qua 编码)字符串,字符串在内部使用 char、UTF-16。字符串常量以 UTF-8(更紧凑)的形式存储在 .class 文件中。

于 2012-07-07T19:08:43.823 回答
1

假设 Apache Commons IO,使用指定编码的方法之一

String cw = IOUtils.toString(is, "windows-1250");

Java 中的所有字符串都是隐式的 UTF-16。其他编码通常使用字节数组表示。

于 2012-07-07T18:53:11.357 回答
-1

我认为最好使用 Scanner 阅读不同的字符集。

    FileInputStream is = new FileInputStream(fileOrPath);
    Scanner scanner = new Scanner(is, "cp1250");
    String out = scanner.next();

并且方法以应用程序的字符集next()返回String值。

测试从“cp1250”到“UTF-8”的“捷克语”。

于 2015-04-22T17:40:30.627 回答