Ваш подход был бы разумно, если бы вы знали, что байты в кодировке по умолчанию платформы. В вашем примере это верно, потому что k.getBytes()
возвращает байты в кодировке по умолчанию платформы.
Чаще всего вам нужно указать кодировку. Однако есть более простой способ сделать это, чем связанный с вами вопрос. API String предоставляет методы, которые преобразуются между массивом String и byte [] в конкретную кодировку. Эти методы предполагают использование CharsetEncoder/CharsetDecoder «когда требуется больше контроля процесса декодирования [кодирования]».
import java.nio.charset.Charset;
Чтобы получить байты из строки в определенной кодировке, вы можете использовать одноуровневые GetBytes() метод:
byte[] bytes = k.getBytes(Charset.forName("UTF-8"));
Чтобы поместить байты с определенной кодировкой в строку, вы можете используйте другой конструктор Строки:
String v = new String(bytes, Charset.forName("UTF-8"));
Обратите внимание, что ByteBuffer.array()
является дополнительной операцией. Если вы построили ByteBuffer с массивом, вы можете использовать этот массив напрямую. В противном случае, если вы хотите быть в безопасности, используйте ByteBuffer.get(byte[] dst, int offset, int length)
, чтобы получить байты из буфера в массив байтов.
EDIT
В качестве побочного вопроса, в вышеприведенном примере кода вызова Charset.forName("UTF-8")
должен работать для всех версий Java начиная с 1.4.
Если вы используете Java 7 или более поздней версии, вы можете использовать java.nio.charset.StandardCharsets.UTF_8
. (Замечено по BenKirby в комментарии ниже.)
Если вы используете Guava, вы можете использовать вместо этого com.google.common.base.Charsets.UTF_8
. (Замечание от космической камеры в комментарии ниже.)
Ну, вы попробовали? – Doorknob
Да, я сделал, и он работает. Но я видел другие реализации, которые более сложны, например http://stackoverflow.com/questions/1252468/java-converting-string-to-and-from-bytebuffer-and-associated-problems –
@Doorknob et. и др. Он пропускает кодировку, и его пример (когда синтаксис исправлен) будет работать, но его метод все еще не прав. – Gus