Как преобразовать восьмеричную последовательность символов в юникод в Java - PullRequest
0 голосов
/ 30 мая 2018

Привет Есть следующая строка,

Let\342\200\231s start with the most obvious question first. This is what an \342\200\234unfurl\342\200\235 is

Предполагается, что будет отображаться как Первые три числа (\342\200\231) фактически представляют восьмеричную последовательность http://graphemica.com/%E2%80%99и его Unicode-эквивалент \u2019

Аналогично \342\200\234 представляет восьмеричную последовательность http://graphemica.com/%E2%80%9C, а Unicode-эквивалент \u201C

. Есть ли какая-либо библиотека или функция, которую яможно использовать для преобразования этих восьмеричных последовательностей в их эквивалент юникода?

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Показанные вами байты являются (представлением) кодировки UTF-8, которая является лишь одной из многих форм Unicode.Java разработан для обработки таких кодировок как последовательности байтов (таких как массивы, а также потоки), но не как символы и строки.Несколько более чистый способ заключается в том, чтобы фактически использовать байты, но тогда вам придется иметь дело с тем фактом, что байты Java подписаны (-128 .. +127), а все многобайтовые коды UTF-8 находятся (по замыслу) в верхней половине 8.-бит пробел:

byte[] a = {'L','e','t',(byte)0342,(byte)0200,(byte)0231,'s'};
System.out.println (new String (a,StandardCharsets.UTF_8));
// or arguably uglier
byte[] b = {'L','e','t',0342-256,0200-256,0231-256,'s'};
System.out.println (new String (b,StandardCharsets.UTF_8));

Но если вы хотите что-то ближе к вашему оригиналу, вы можете немного обмануть, обработав строку (из беззнаковых символов), которая на самом деле содержит UTF-8байт, как если бы он содержал 8-битные символы, которые образуют диапазон Unicode 0000-00FF, который определен так же, как ISO-8859-1:

byte[] c = "Let\342\200\231s".getBytes(StandardCharsets.ISO_8859_1);
System.out.println (new String (c,StandardCharsets.UTF_8));
0 голосов
/ 30 мая 2018

В Java это невозможно с Octals, только с Hexa.

Это прекрасно работает:

System.out.println("\u2019");

Вероятно, по чисто историческим причинам Java поддерживает восьмеричные escape-последовательности ввсе.Эти escape-последовательности возникли в C (или, может быть, в предшественниках C B и BCPL), во времена, когда компьютеры, подобные PDP-7, управляли Землей, и большая часть программ была сделана на сборке или непосредственно в машинном коде, и восьмеричное было предпочтительным числомоснова для написания кодов инструкций, и не было Unicode, только ASCII, поэтому трех восьмеричных цифр было достаточно для представления всего набора символов.

К тому времени, когда появились Unicode и Java, восьмеричное в значительной степени уступило местошестнадцатеричное в качестве предпочтительной числовой базы, когда десятичное просто не будет.Так что у Java есть escape-последовательность, которая принимает шестнадцатеричные цифры.Вероятно, восьмеричная escape-последовательность поддерживалась просто для того, чтобы программистам на C было комфортно и чтобы было легко копировать и вставлять строковые константы из программ на C в программы на Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...