Конвертировать Unicode в UTF-8 - PullRequest
0 голосов
/ 24 февраля 2020

Возможно, на мой вопрос уже ответили на StackoverFlow, но я не могу его найти. Моя проблема проста: я запрашиваю данные через API, и возвращаемые данные содержат символы Юникода, например:

"SpecialOffer":[{"title":"Offre Vente Priv\u00e9e 1 jour 2019 2020"}]

Мне нужно преобразовать "\ u00e9e" в "é". Я не могу сделать "replaceAll", потому что я не могу знать все символы, которые будут заранее.

Я пытаюсь это сделать:

byte[] utf8 = reponse.getBytes("UTF-8")
String string = new String(utf8, "UTF-8");

Но строка все еще имеет "\ u00e9e "

Также это:

byte[] utf8 = reponse.getBytes(StandardCharsets.UTF_8);
String string = new String(utf8, StandardCharsets.UTF_8);

Также пробовал это:

    string = string.replace("\\\\", "\\");
    byte[] utf8Bytes = null;
    String convertedString = null;
    utf8Bytes = string.getBytes("UTF8") -- Or StandardCharsets.UTF_8 OR UTF-8 OR UTF_8;
    convertedString = new String(utf8Bytes, "UTF8") -- Or StandardCharsets.UTF_8 OR UTF-8 OR UTF_8;;
    System.out.println(convertedString); 
    return convertedString;

Но это тоже не работает.

Я тестировал другие методы, но я думаю, что я удалил все, как это не сработало, поэтому я не могу показать их здесь.

Я уверен, что есть очень простой метод, но я не должен искать с правильным словарем на целое rnet. Можете ли вы помочь мне, пожалуйста?

Я sh вам очень хороший день, и большое спасибо заранее.

Ответы [ 3 ]

0 голосов
/ 24 февраля 2020

Вы можете использовать небольшую json библиотеку

String jsonstring = "{\"SpecialOffer\":[{\"title\":\"Offre Vente Priv\\u00e9e 1 jour 2019 2020\"}]}";
JsonValue json = JsonParser.parse(jsonstring);
String value = json.asObject()
    .first("SpecialOffer").asArray().get(0)
    .asObject().first("title").asStringLiteral().stringValue();
System.out.println(" result: " + value);

или

String text = "Offre Vente Priv\\u00e9e 1 jour 2019 2020";
System.out.println(" result: " + JsonEscaper.unescape(text));
0 голосов
/ 24 февраля 2020

Проблема, которую я не видел, заключается в том, что API возвращает не «\ u00e9e», а «\\ u00e9e», поскольку это была последовательность символов, а не символ Юникода! Поэтому я должен воссоздать все юникоды, и все работает отлично!

int i=0, len=s.length();
        char c;
        StringBuffer sb = new StringBuffer(len);
        while (i < len) {
            c = s.charAt(i++);
            if (c == '\\') {
                if (i < len) {
                    c = s.charAt(i++);
                    if (c == 'u') {
                        // TODO: check that 4 more chars exist and are all hex digits
                        c = (char) Integer.parseInt(s.substring(i, i+4), 16);
                        i += 4;
                    } // add other cases here as desired...
                }
            } // fall through: \ escapes itself, quotes any character but u
            sb.append(c);
        }
        return sb.toString();

Найти это решение можно здесь: Java: Как создать юникод из строки "\ u00C3" et c

0 голосов
/ 24 февраля 2020

Метод String.getBytes требует допустимого Charset [1]

Начиная с javado c [2], допустимые значения

  • US-ASCII
  • ISO-8859-1
  • UTF-8
  • UTF-16BE
  • UTF-16LE
  • UTF-16

Так что вам нужно использовать UTF-8 в методе getBytes.

[1] https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#getBytes - java .nio.charset.Charset- [2] https://docs.oracle.com/javase/8/docs/api/java/nio/charset/Charset.html

...