Різниця між 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 в байт []. Наприклад: добре точно для наданого випадку (хеш-код). 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 - це визначити спільність між ними.
Крім спільного використання одного і того ж номера унікоду для заданого символу, кожен має свій власний формат.