powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Правильно ли отрабатывает String.getBytes(). Преверьте меня, плыз.
14 сообщений из 14, страница 1 из 1
Правильно ли отрабатывает String.getBytes(). Преверьте меня, плыз.
    #38941887
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
public class UtfTest {
    
    public static void main(String[] args) throws UnsupportedEncodingException{
        byte []sample = "["\ud800"]".getBytes("UTF-8");
        System.out.println("len="+sample.length);
        System.out.println("[0]="+sample[0]);
    }  
}



выдает:
1.8.0_20-b26
len=1
[0]=63

Вопрос: правильно ли это? Я читаю статью utf-8 в википедии, там написано что диапазон 0x800-0xffff представляется тремя байтами
...
Рейтинг: 0 / 0
Правильно ли отрабатывает String.getBytes(). Преверьте меня, плыз.
    #38941897
scf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
63 - это код символа "?".
Я думаю, что 0xd800 - это или неиспользуемый код, или он не поддерживается джавой.
...
Рейтинг: 0 / 0
Правильно ли отрабатывает String.getBytes(). Преверьте меня, плыз.
    #38941904
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотри таблицу символов. Скорее всего дело именно в самом символе. D800 - это суррогат а не конкретный символ. С символами работает нормально. Читай дальше про UTF
...
Рейтинг: 0 / 0
Правильно ли отрабатывает String.getBytes(). Преверьте меня, плыз.
    #38941908
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На сколько я понял, суррогат это такой префикс 2х-3х байтового символа, который сам по себе ничего не значит.
...
Рейтинг: 0 / 0
Правильно ли отрабатывает String.getBytes(). Преверьте меня, плыз.
    #38941916
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapok,

Обрати внимание и на методы класса Character - там есть и проверка на суррогаты.
...
Рейтинг: 0 / 0
Правильно ли отрабатывает String.getBytes(). Преверьте меня, плыз.
    #38941925
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм... String.getBytes() зело хитрый метод. Много depencencies.

Для символа который попал в диапазон

High Surrogate Area
Range: D800-DBFF
Isolated surrogate code points have no interpretation; consequently, no character code charts or names lists are provided for
this range.
See http://www.unicode.org/charts/ for access to a complete list of the latest character code charts

метод вернул вопросик '?'
...
Рейтинг: 0 / 0
Правильно ли отрабатывает String.getBytes(). Преверьте меня, плыз.
    #38941928
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Внутри UTF-8 и UTF-32 вообще не может быть суррогатов - суррогатные пары могут быть только в UTF-16.
...
Рейтинг: 0 / 0
Правильно ли отрабатывает String.getBytes(). Преверьте меня, плыз.
    #38941938
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нашел статью http://en.wikibooks.org/wiki/Unicode/Character_reference/D000-DFFF и далее по ссылкам.
там можно братить внимание на "Unicode range D800–DFFF is used as surrogate pair in UTF-16 (used by Windows) and CESU-8 transformation formats, allowing these encodings to represent the supplementary plane code points, whose values are too large to fit in 16 bits..."

Character.isHighSurrogate возвращает true для диапазона d800 - dbff
C перекодировка dc00 тоже идет в однобайтовый 63

видимо там действительно диапазон служебный.
...
Рейтинг: 0 / 0
Правильно ли отрабатывает String.getBytes(). Преверьте меня, плыз.
    #38941944
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как все сложно. Есть не только верхние, но и нажние суррогаты.
Вобщем, вцелом ясно куда копать...
...
Рейтинг: 0 / 0
Правильно ли отрабатывает String.getBytes(). Преверьте меня, плыз.
    #38941945
scf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Могу добавить, что джава как раз использует UTF-16. Так исторически сложилось, что тип char - 16-битный, поэтому, когда юникод вырос за пределы 65536 символов, начали использовать пары соседних char-ов для кодирования одного символа.

Именно поэтому, например, число, возвращаемое String.length(), не является длиной строки в *символах*
...
Рейтинг: 0 / 0
Правильно ли отрабатывает String.getBytes(). Преверьте меня, плыз.
    #38941952
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
эээ...
а можно пример такого?
...
Рейтинг: 0 / 0
Правильно ли отрабатывает String.getBytes(). Преверьте меня, плыз.
    #38941968
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос снимается. В описании Characher все написано.
...
Рейтинг: 0 / 0
Правильно ли отрабатывает String.getBytes(). Преверьте меня, плыз.
    #38941997
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovВнутри UTF-8 и UTF-32 вообще не может быть суррогатов - суррогатные пары могут быть только в UTF-16.
Ну, значит с точки зрения UTF-8 это просто зарезервированные значения, которые в Unicode не имеют соответствующих символов.
...
Рейтинг: 0 / 0
Правильно ли отрабатывает String.getBytes(). Преверьте меня, плыз.
    #38942845
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коды из "суррогатного диапазона" - повреждённый UTF-8/-32.
Технически ничто не мешает вставлять их хоть по одному, хоть парой, но результат будет именно таким.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Правильно ли отрабатывает String.getBytes(). Преверьте меня, плыз.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]