Разница между UTF-8 и UTF-16? Зачем они нужны?
MessageDigest md = MessageDigest.getInstance("SHA-256");
String text = "This is some text";
md.update(text.getBytes("UTF-8")); // Change this to "UTF-16" if needed
byte[] digest = md.digest();
Разница между UTF-8 и UTF-16? Зачем они нужны?
MessageDigest md = MessageDigest.getInstance("SHA-256");
String text = "This is some text";
md.update(text.getBytes("UTF-8")); // Change this to "UTF-16" if needed
byte[] digest = md.digest();
Я считаю, что в Интернете есть много хороших статей об этом, но вот краткое резюме.
Оба UTF-8 и UTF-16 являются кодировками переменной длины. Однако в UTF-8 символ может занимать минимум 8 бит, тогда как в UTF-16 длина символа начинается с 16 бит.
Основные профили UTF-8:
Основные UTF-8 минусы:
Основные профили UTF-16:
char
в качестве примитивного компонента строка.Основные UTF-16 минусы:
В общем, UTF-16 обычно лучше подходит для представления в памяти, потому что BE/LE здесь не имеет значения (просто используйте собственный порядок), а индексация выполняется быстрее (просто не забудьте правильно обрабатывать суррогатные пары). UTF-8, с другой стороны, очень хорош для текстовых файлов и сетевых протоколов, потому что нет проблемы с BE/LE, и нулевое завершение часто пригодится, а также совместимость с ASCII.
Это просто разные схемы для представления символов Unicode.
Оба являются переменной длиной - UTF-16 использует 2 байта для всех символов базовой многоязычной плоскости (BMP), которая содержит большинство используемых символов.
UTF-8 использует от 1 до 3 байтов для символов в BMP, до 4 для символов в текущем Unicode диапазоне от U + 0000 до U + 1FFFFF, и расширяется до U + 7FFFFFFF, если это когда-либо понадобится... но особенно все символы ASCII представлены в каждом байте каждый.
Для целей дайджеста сообщения не имеет значения, какой из них вы выбираете, если все, кто пытается воссоздать дайджест, используют ту же опцию.
Подробнее о UTF-8 и Юникоде см. эту страницу.
(Обратите внимание, что все символы Java являются кодовыми точками UTF-16 в BMP; для представления символов выше U + FFFF вам нужно использовать суррогатные пары в Java.)
Это не связано с UTF-8/16 (в общем, хотя оно и конвертируется в UTF16, а часть BE/LE может быть установлена с одной строкой), но ниже это самый быстрый способ преобразования String в байт [ ]. Например: хорошо точно для предоставленного случая (хэш-код). String.getBytes(enc) относительно медленный.
static byte[] toBytes(String s){
byte[] b=new byte[s.length()*2];
ByteBuffer.wrap(b).asCharBuffer().put(s);
return b;
}
Простой способ дифференцировать UTF-8 и UTF-16 - идентифицировать общие черты между ними.
Помимо совместного использования одного и того же номера юникода для заданного символа, каждый из них является их собственным форматом.