Разница между 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 и Unicode.
(Обратите внимание, что все символы Java являются кодовыми точками UTF-16 в BMP; для представления символов выше U + FFFF необходимо использовать суррогатные пары в Java.)
Разница между UTF-8 и UTF-16? Зачем нам это нужно?
В реализациях UTF-16 было как минимум несколько уязвимостей безопасности . Смотрите Википедию для деталей .
WHATWG и W3C уже в настоящее время объявили , что только UTF-8 будет использоваться в Интернете.
Описанные здесь проблемы [безопасности] исчезают, когда используется исключительно UTF-8, что является одной из многих причин, по которым теперь применяется обязательное кодирование для всех вещей.
Другие группы говорят то же самое.
Таким образом, хотя UTF-16 может продолжать использоваться внутри некоторых систем, таких как Java и Windows, то малое использование UTF-16, которое вы, возможно, видели в прошлом для файлов данных, обмена данными и т. Д., Вероятно, полностью исчезнет.
Это не связано с UTF-8/16 (в общем, хотя оно и преобразуется в UTF16, а часть BE / LE может быть установлена с одной строкой), но ниже приведен самый быстрый способ преобразования строки в байт []. Например: хорошо подходит для указанного случая (хэш-код). 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 состоит в том, чтобы определить общие черты между ними.
За исключением совместного использования одного и того же номера Unicode для данного символа, каждый из них имеет свой собственный формат.