2012-07-07 141 views
5

正如标题说... 我读htto响应如何将在Windows-1250/Cp1250中编码的字符串转换为utf-8?



    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?

回答

6

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

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

目前尚不清楚其中UTF-8进来 - 你可能想写出在UTF-8之后的数据,但该结果将是byte[],而不是一个字符串。

+2

从技术上讲,'java.lang。String'有一个编码:UTF-16。 – 2015-06-03 11:29:00

4

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

3

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

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

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

-1

我认为使用扫描仪更好地阅读不同的字符集。

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

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

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

相关问题