Проблема с Unicode: как преобразовать в ответ HttpClient? - PullRequest
0 голосов
/ 10 октября 2018

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, поэтому давайте решим это вместо этого.

1 Ответ

0 голосов
/ 10 октября 2018

Это похоже на работу, но я не понимаю почему, и я волнуюсь, это может зависеть от платформы:

byte[] d = s.getBytes("cp1252"); 
String w = new String(d, Charset.forName("UTF-8"));
System.out.println(w); // prints ’
...