如何将windows-1250 / Cp1250中编码的String转换为utf-8?

时间:2012-07-07 18:12:34

标签: java string

正如标题所说...... 我从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?

5 个答案:

答案 0 :(得分:6)

您似乎认为String对象具有编码。那不对。编码用作从二进制数据(byte[]InputStream)到文本数据(Stringchar[]等)的转换的一部分。

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

目前还不清楚UTF-8的用武之地 - 之后您可能希望以UTF-8写出数据,但结果是byte[],而不是字符串

答案 1 :(得分:4)

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

答案 2 :(得分:3)

编码具有规范(唯一)名称和其他不同的名称,并且不区分大小写。例如" UTF-8"是规范名称,但是一些Java版本支持它是" UTF8&#34 ;;它更多地写入了常见用法。同样适用于" Windows-1250,"您可能也会在HTML页面中看到它。 " CP1250" (Code-Page)是一个java内部名称。

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

byte,InputStream,OutputStream< - >字符串,字符,读者,作家

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编码)字符串,String内部使用char,UTF-16。 字符串常量作为UTF-8(更紧凑)存储在.class文件中。

答案 3 :(得分:0)

假设Apache Commons IO,请使用one of the methods that specifies an encoding

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

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

答案 4 :(得分:-1)

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

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

方法next()在应用程序的charset中返回String值。

测试"捷克语"来自" cp1250"到" UTF-8"。