Unicode, Unicode Big Endian або UTF-8? Яка різниця? Який формат краще?


19

Коли я намагаюся зберегти текстовий файл із текстом, що не є англійською мовою, у Блокноті, я отримую можливість вибрати між Unicode , Unicode Big Endian та UTF-8 . Яка різниця між цими форматами?

Припустимо, що я не бажаю зворотної сумісності (зі старими версіями ОС або додатками) і мені не байдуже розмір файлу, який із цих форматів краще?

(Припустимо, що текст може бути такими мовами, як китайська або японська, крім інших мов.)

Примітка: З відповідей та коментарів нижче видно, що в мові Notepad Unicode є UTF-16 (Little Endian), Unicode Big Endian - UTF-16 (Big Endian), а UTF-8 - UTF-8.


Відповіді:


19

Данно. Що краще: пила чи молоток? :-)

Unicode не є UTF

У статті є трохи те, що трохи більше стосується даної теми, хоча:

  • UTF-8 зосереджується на мінімізації розміру байтів для представлення символів з набору ASCII (подання змінної довжини: кожен символ представлений на 1 - 4 байти, а символи ASCII - на 1 байт). Як каже Джоел:

"Подивіться на всі ці нулі!", - сказали вони, оскільки вони були американцями, і вони дивилися на англійський текст, який рідко використовував кодові точки вище U + 00FF. Також вони були ліберальними хіпі в Каліфорнії, які хотіли зберегти (насміхатися). Якби вони були техасцями, вони б не подумували, щоб двічі збільшити кількість байтів. Але ті каліфорнійські сутенери не могли витримати ідеї подвоїти кількість сховища, необхідного для струн

  • UTF-32 орієнтується на вичерпність та фіксовану довжину подання, використовуючи 4 байти для всіх символів. Це найпростіший переклад, зіставлення прямо кодової точки Unicode на 4 байти. Очевидно, це не дуже ефективно за розмірами.

  • UTF-16 - це компроміс, який використовує 2 байти більшу частину часу, але розширюється до 2 * 2 байти на символ, щоб представити певні символи, ті, що не входять до базової багатомовної площини (BMP).

Також дивіться Абсолютний мінімум кожен розробник програмного забезпечення абсолютно, позитивно повинен знати про набори Unicode та символів (немає виправдань!)


4
Проблема випливає з того, що Unicode - це «кодування», але не в розумінні цифр у байтах. UTF-8/16/32 - всі кодування Unicode, але сам Unicode - це відображення від символів до чисел. Вони могли використати більш унікальну термінологію, щоб уникнути цієї плутанини, я думаю.
jerryjvl

4
Незважаючи на те, що до ОП питання, немає шансів, що додаток означає "UTF-16", де написано "Unicode".
jerryjvl

3
Я не впевнений, що метою UTF-8 є "збереження" на відміну від зворотної сумісності з ASCII.
Містер Блискучі та Нові 安 宇

@Johannes: Консорціум Unicode вирішив ніколи не присвоювати кодові точки вище U + 10FFFF, оскільки вони не можуть бути представлені в UTF-16. Це призвело до обмеження UTF-8 на 4 байти.
user46971

1
"Unicode не UTF" - для багатьох це WTF;)
mlvljr

4

Для європейських мов UTF-8 менший. Для східних мов різниця не настільки чітка.

Обидва будуть обробляти всі можливі символи Unicode, тому сумісність не повинна змінювати.


3

Є більше кодувань символів Unicode, ніж ви можете подумати.

  • UTF 8

    Кодування UTF-8 має змінну ширину, що становить від 1-4 байт, верхні біти кожного байту зарезервовані як контрольні біти. Провідні біти першого байта вказують на загальну кількість байтів, використаних для цього символу. Скалярне значення кодової точки символу - це конкатенація неконтрольних бітів. У цій таблиці, що xпредставляє найнижчі 8 біт значення Unicode, yпредставляє наступні вищі 8 біт і zпредставляє біти вище, ніж це.

    Unicode              Byte1     Byte2     Byte3     Byte4
    U+0000-U+007F       0xxxxxxx            
    U+0080-U+07FF       110yyyxx  10xxxxxx          
    U+0800-U+FFFF       1110yyyy  10yyyyxx  10xxxxxx    
    U+10000-U+10FFFF    11110zzz  10zzyyyy  10yyyyxx  10xxxxxx
    
  • UCS-16
  • UCS-16BE
  • UCS-16LE

  • UTF-16
  • UTF-16BE
  • UTF-16LE

  • UTF-32
  • UTF-32-BE

1
Є більше кодувань символів Unicode, ніж ви перелічили. Наприклад, UTF-1 , UTF-7 , UTF-EBCDIC , GB-18030 , MIME , UTF-9 та UTF-18 ... Ви також можете використовувати будь-яку двійкову схему кодування для кодування даних Unicode. Детальніше Порівняйте кодування Unicode
phuclv

1

"Unicode" - це ще один термін для "UTF-16", який є кодуванням символу Unicode, встановленим на шістнадцять біт на символ. UTF-8 кодує його у вісім біт на символ.

В обох випадках будь-яке переповнення виділяється ще на 16 або вісім біт.


Який з них тоді кращий?
Р. Мартінхо Фернандес

"це залежить" від ситуації.
Джон Сондерс

Хоча в цьому конкретному питанні здається, що "Unicode" насправді зловживається як інший термін для "UTF-16", це не так взагалі - див. Відповідь Джейсона.
Ар'ян

1
Ви маєте на увазі "за одиницю коду", а не "за символ"; і UTF-8, і UTF-16 можуть використовувати кілька одиниць коду для представлення символу. А "Unicode" та "UTF-16" НЕ є тим самим, за винятком термінології Microsoft.
користувач46971

1

Єдиною реальною перевагою таких невеликих файлів, як текстові файли, є розмір отриманого файлу. UTF-8 зазвичай створює менші файли. Але ця різниця може бути менш вираженою в китайському / японському тексті.


Майте на увазі, що також є різниця у пропускній здатності мережі та використанні пам'яті.
Джейсон Бейкер

1
"UTF-8 загалом створює менші файли": Зазвичай. UTF-8 створює менші файли для файлів ASCII. Якщо файл складається лише з кодових точок Unicode вище U + 0800, він буде більшим у UTF-8, ніж у UTF-16.
sleske

0

Словом, Unicode - це набір символів , тоді як Unicode Big Endian і utf-8 - це два кодування , які використовуються для зберігання символів як 01 на комп'ютері.


І різниця ...?
Девід Річербі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.