下面的代码中的String s
和byte[] b
包含大致相同的事物的不同表示形式。
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import org.testng.annotations.Test;
public class Utf8Test {
@Test
public void test() throws UnsupportedEncodingException {
String s = "’";
byte[] b = new byte[] { (byte) 0xE2, (byte) 0x80, (byte) 0x99 };
System.out.println(s); // prints ’
String t = new String(b, Charset.forName("UTF-8"));
System.out.println(t); // prints ’
String u = new String(s.getBytes("ISO-8859-1"), Charset.forName("UTF-8"));
System.out.println(u); // prints ???
byte[] b2 = new byte[s.length()];
for(int i=0; i < s.length(); ++i) {
b2[i] = (byte) (s.charAt(i) & 0xFF);
}
String v = new String(b2, Charset.forName("UTF-8"));
System.out.println(v); // prints ?"
Assert.assertEquals(s,v); // FAIL
}
}
如何将String s
转换为与String t
相同的值?
我已经尝试了生成String u
和String v
的代码,并且结果显示在注释中。
XY问题
这实际上是一个XY问题。 String s
在HttpEntity
调用的HttpClient
中返回。我想要的只是正确解码的响应。上面的内容比整个HTTP堆栈要容易得多,因此让我们解决它。
答案 0 :(得分:1)
这似乎可行,但是我不明白为什么,我担心它可能取决于平台:
byte[] d = s.getBytes("cp1252");
String w = new String(d, Charset.forName("UTF-8"));
System.out.println(w); // prints ’