Боюсь, у меня есть вопрос по деталям довольно перенасыщенной темы, я много искал, но не мог найти четкого ответа на эту конкретную, очевидную, очень важную проблему:
При преобразовании байта [] в строку с использованием UTF-8 каждый байт (8 бит) становится 8-битным символом, кодируемым UTF-8, но каждый символ UTF-8 сохраняется как 16-битный символ в Java.Это верно?Если да, это означает, что каждый тупой символ Java использует только первые 8 бит и потребляет вдвое больше памяти?Это тоже правильно?Интересно, как это расточительное поведение приемлемо?
Неужели нет какой-то хитрости, чтобы иметь 8-битную псевдо-строку?Не приведет ли это к меньшему потреблению памяти?Или, может быть, есть способ сохранить> два <8-битных символа в одном 16-битном символе java, чтобы избежать этой потери памяти? </p>
спасибо за любые ответы, вызывающие неясность ...
РЕДАКТИРОВАТЬ: привет, спасибовсе за ответы.Я знал о свойстве переменной длины UTF-8.Однако, поскольку мой источник - 8-битный байт, я понял (по-видимому, неправильно), что ему нужны только 8-битные слова UTF-8.Сохраняет ли преобразование UTF-8 странные символы, которые вы видите, когда в CLI вы делаете "cat somebinary"?Я думал, что UTF-8 просто каким-то образом использовался для отображения каждого из возможных 8-битных слов байта в одно конкретное 8-битное слово UTF-8.Неправильно?Я думал об использовании Base64, но это плохо, потому что он использует только 7 бит ..
переформулированные вопросы: есть ли более умный способ преобразовать байт во что-то String?Возможно, любимым было просто преобразовать byte [] в char [], но тогда у меня все еще есть 16-битные слова.
дополнительная информация о случае использования:
Я адаптирую Jedis (Java-клиент для NoSQL Redis) в качестве «примитивного уровня хранения» для hypergraphDB.Итак, jedis - это база данных для другой «базы данных».Моя проблема в том, что мне приходится постоянно кормить джедаев данными byte [], но внутренне> Redis <(реальный сервер) имеет дело только с «бинарными безопасными» строками.Поскольку Redis написан на C, длина символа 8 бит, AFAIK не ASCIII, который 7 бит.В джедае, однако, в мире java каждый персонаж имеет внутреннюю длину 16 бит.Я не понимаю этот код (пока), но я предполагаю, что jedis затем преобразует эту 16-битную строку Java в 8-битную строку, соответствующую Redis (([здесь] [3]). Он говорит, что расширяет FilterOutputStream. Я надеюсь обойтивообще преобразование строки byte [] <-> и использование этого Filteroutputstream ...?)
Теперь мне интересно: если бы мне приходилось все время преобразовывать byte [] и String, с размерами данных от очень маленьких допотенциально очень большой, разве нет огромной траты памяти на то, чтобы каждый 8-битный символ передавался как 16-битный в Java?