正如标题所说...... 我从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?
答案 0 :(得分:6)
您似乎认为String
对象具有编码。那不对。编码用作从二进制数据(byte[]
或InputStream
)到文本数据(String
或char[]
等)的转换的一部分。
目前尚不清楚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"。