Почему моя строка java короче по длине, чем массив byte[], из которого она была сгенерирована?

Я читаю большой двоичный объект из базы данных MySql, используя JDBC. Я знаю, что результирующий массив байтов хорош, я отправил его по HTTP в виде строкового литерала чисел для каждого байта и успешно загрузил результат (jpg). (просто чтобы доказать, что данные сервлета mysql -> java хороши).

Построение новой строки из этого массива байтов с использованием UTF-8 дает строку короче по длине, чем массив байтов, и значения, которые я не могу расшифровать. Если UTF-8 составляет ПО КРАЙНЕЙ МЕРЕ 1 байт на символ, не должна ли результирующая строка быть МИНИМУМ длиной массива байтов, из которого она сгенерирована? (для этого конкретного примера длина байта составляет 12 079 474 байта, а результирующая длина строки составляет 11 501 845)

Спасибо за ваше время!


person DWR    schedule 31.12.2016    source источник
comment
Вы противоречите собственному утверждению. если несколько байтов составляют char, то длина char будет меньше, верно? Также посмотрите здесь   -  person Gurwinder Singh    schedule 31.12.2016
comment
.jpg — это не текст, это двоичные данные. нет смысла пытаться интерпретировать байты изображения jpg как строку.   -  person nos    schedule 31.12.2016
comment
Если вам нужны двоичные данные в виде строки, рассмотрите возможность преобразования каждого байта в шестнадцатеричный или аналогичный для двунаправленной операции.   -  person Bohemian♦    schedule 31.12.2016
comment
Ой ну спасибо! Я подтолкнула меня в правильном направлении. Я хочу, чтобы строка каждого байта интерпретировалась как его юникод CODEPOINT, а не строка массива байтов, интерпретируемая как литерал UTF-8.   -  person DWR    schedule 31.12.2016
comment
Но если массив bye содержит двоичные данные, например изображение в формате jpg, в первую очередь не будет никаких кодовых точек для извлечения. Вы не можете обращаться с двоичными данными, как если бы это был текст, вы можете обращаться с текстом только как с текстом.   -  person Remy Lebeau    schedule 04.01.2017


Ответы (1)


В ваших байтах у вас есть данные, которые интерпретируются как байты продолжения, т.е. в UTF-8 они имеют особое значение и образуют один символ Юникода из нескольких байтов. Вот почему ваша строка короче количества байтов.

person Marc Balmer    schedule 31.12.2016