如何将以windows-1250/Cp1250编码的字符串转换为utf-8?

5
如题所述... 我从http响应中读取内容

    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个回答

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

6
你似乎认为String对象有一个编码,这是不正确的。编码是用作从二进制数据(byte[]InputStream)到文本数据(Stringchar[]等)的转换的一部分。
并不清楚IOUtils.toString在做什么,但它几乎肯定会丢失数据或至少处理不当。如果您的数据最初是使用Windows-1250编码的,则应该使用一个包装InputStreamInputStreamReader,并在InputStreamReader构造函数调用中指定字符集。
不清楚UTF-8何时才会发挥作用 - 你可能想要以UTF-8格式输出数据,但结果将是一个byte[]而不是字符串。

3
从技术角度来说,java.lang.String 有一个编码:UTF-16。 - Jannik Jochem

3

编码有一个规范的名称和其他变化的名称,不区分大小写。例如,“UTF-8”是规范名称,但在一些Java版本中它被称为“UTF8”,并且更多地被写入常用语中。同样地,“Windows-1250”也可能出现在HTML页面中。“Cp1250”(代码页)是Java内部名称。

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

byte、InputStream、OutputStream <-> String、char、Reader、Writer

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);

为了支持通用的(即编码)字符串,String内部使用char和UTF-16编码。字符串常量以UTF-8编码格式存储在.class文件中(更为紧凑)。


1
假设使用Apache Commons IO,可以使用指定编码的方法之一
String cw = IOUtils.toString(is, "windows-1250");

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


-1

我认为最好使用Scanner来读取不同字符集。

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

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

在从"cp1250"到"UTF-8"测试了"czech language"。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接