Java UTF-16 преобразование в UTF-8

Обновить

December 2018

Просмотры

171 раз

2

Шаг 1: Выполнение вызова REST с помощью HttpClient в Twitter конечной точки и получить сообщение твит , содержащий смайлик. Twitter API , возвращает строку с кодировкой UTF-8.
Пример: Сообщение = 😄;
Шаг 2: Я использую Java , чтобы прочитать строку, используя InputStreamReader с кодировкой UTF-8. Тем не менее, длина струны оказывается 2, а не 1.
Как это может быть возможным, когда я явно разборе его помощью UTF-8?
В сети я нашел несколько ресурсов, где его упомянули , что смайлик высокого элемента коды характер, и , таким образом , Java считает , что это будет не менее 2 символов (суррогатная пара), не имеет смысла.
Может кто - нибудь помочь мне с этим?

1 ответы

5

У вас есть строка с длиной 2 - потому что length()свойство возвращает количество UTF-16 кодовых единиц, а не число символов Unicode. Имейте в виду , что Stringв Java действительно последовательность UTF-16 кодовых единиц, а не как последовательность символов.

Как вы говорите, что смайлики представлены с суррогатной парой - это U + 1F604, представленный в UTF-16, как U + U + D83D DE04.

Если вы звоните String.codePointCountвместо length(), вы получите 1:

public class Test {
    public static void main(String[] args) {
        String emoji = "\ud83d\ude04";
        System.out.println(emoji.length()); // 2
        System.out.println(emoji.codePointCount(0, emoji.length())); // 1
    }
}

Обратите внимание, что тот факт, что вы создали строку путем декодирования UTF-8 полностью не имеет отношения к его содержанию. Предполагая, что у вас есть строка, равная одному в моем примере коде выше, декодирование работало отлично.