Чим відрізняється UTF-8 від Unicode?


503

Я чула суперечливі думки людей - згідно зі сторінкою UTF-8 Вікіпедії .

Вони те саме, чи не так? Може хтось уточнить?


1
Те, що цей WIKI пише про unicode та UTF, нормально, на мою думку. Деякі зауваження до нього є wierd: "У UTF-8 (або будь-якому іншому багатобайтовому кодуванні) можна розділити або обрізати рядок посередині символу, що може призвести до недійсного рядка." Отже, рядок, що кодується UTF-8, є не більше рядком, а байтовим масивом або потоком байтів. Символи, що складають рядок, кодуються. Звичайно, це також можна розшифрувати. Тепер, звичайно, ви можете вирізати послідовність utf-8 після запуску байта або після наступного байту, але чому хтось повинен це робити?
яскравий

Ця стаття про рядкові типи даних є навчальною: mortoray.com/2013/11/27/the-string-type-is-broken - іноді під час роботи з рядками та їх компонентами рівня байту ви можете ненавмисно порубати символ навпіл. .
Еверетт

Відповіді:


495

Щоб розширити відповіді, які дали інші:

У нас багато мов з великою кількістю символів, які в ідеалі повинні відображати комп’ютери. Unicode призначає кожному символу унікальне число або кодову точку.

Комп'ютери мають справу з такими числами, як байти ... пропускаючи сюди трохи історії та ігноруючи проблеми з пам'яттю, 8-бітні комп'ютери розглядають 8-бітний байт як найбільшу числову одиницю, легко представлену на апаратному забезпеченні, 16-бітні комп'ютери розширяться. що до двох байтів тощо.

Старі кодування символів, такі як ASCII, починаються з (до-) 8-бітової епохи, і намагаються втиснути домінуючу мову в обчислювальних системах, тобто англійську, на числа, що становлять від 0 до 127 (7 біт). З 26 букв в алфавіті, як з великої, так і з великої літери, цифр та знаків пунктуації, це спрацювало досить добре. ASCII було розширено на 8-й біт для інших, не англійських мов, але додаткові 128 номерів / кодових точок, доступні цим розширенням, будуть відображені в різні символи залежно від мови, що відображається. Стандарти ISO-8859 - найпоширеніші форми цього відображення; ISO-8859-1 та ISO-8859-15 (також відомий як ISO-Latin-1, latin1; так, є також дві різні версії стандарту ISO 8859).

Але цього недостатньо, коли ви хочете представляти символи з декількох мов, тому набивання всіх доступних символів в один байт просто не вийде.

По суті є два різних типи кодування: одне розширює діапазон значень, додаючи більше біт. Прикладами цих кодувань можуть бути UCS2 (2 байти = 16 біт) і UCS4 (4 байти = 32 біта). Вони страждають від тієї ж проблеми, що і стандарти ASCII та ISO-8859, оскільки їх діапазон значень все ще обмежений, навіть якщо межа значно перевищує.

Інший тип кодування використовує змінну кількість байтів на символ, і найбільш відомими для цього кодування є кодування UTF. Всі кодування UTF працюють приблизно однаково: ви вибираєте розмір одиниці, який для UTF-8 становить 8 біт, для UTF-16 - 16 біт, а для UTF-32 - 32 біт. Потім стандарт визначає кілька цих бітів як прапори: якщо вони встановлені, то наступний блок в послідовності одиниць слід вважати частиною того ж символу. Якщо вони не встановлені, цей пристрій представляє один символ повністю. Таким чином, найпоширеніші (англійські) символи займають лише один байт в UTF-8 (два в UTF-16, 4 в UTF-32), але інші символи мови можуть займати шість байт або більше.

Багатобайтові кодування (я мушу сказати, багатоодиничне після вищезазначеного пояснення) мають перевагу в тому, що вони є відносно ефективними для простору, але недоліком таких операцій, як пошук підрядків, порівнянь і т. Д., Всі повинні розшифровувати символи для коду unicode балів перед виконанням таких операцій (хоча є і деякі ярлики).

І стандарти UCS, і стандарти UTF кодують кодові точки, як визначено в Unicode. Теоретично ці кодування можуть використовуватися для кодування будь-якого числа (в межах діапазону, який підтримує кодування) - але, звичайно, ці кодування були зроблені для кодування точок коду Unicode. І ось ваші стосунки між ними.

Windows обробляє так звані рядки "Unicode" як рядки UTF-16, в той час як більшість UNIX в ці дні є типовими для UTF-8. Протоколи зв'язку, такі як HTTP, як правило, найкраще працюють з UTF-8, оскільки розмір одиниці в UTF-8 такий же, як і в ASCII, і більшість таких протоколів були розроблені в епоху ASCII. З іншого боку, UTF-16 дає найкращі середні показники простору / продуктивності обробки при представленні всіх живих мов.

Стандарт Unicode визначає менше точок коду, ніж їх можна представити у 32 бітах. Таким чином, для всіх практичних цілей, UTF-32 і UCS4 стали однаковим кодуванням, тому що вам навряд чи доведеться мати справу з символами з декількома одиницями в UTF-32.

Сподіваюсь, що заповнює деякі деталі.


9
Концептуально UCS-2 та UCS-4 - це набори символів , а не кодування символів (звідси назва).
Механічний равлик

74
@Tuukka Помилки в цьому дописі - легіон. Існує більше ніж 2 версії ISO 8859. ASCII не працював для англійської мови, пропускаючи такі речі, як фігурні лапки, центові знаки, акценти та багато іншого - Unicode - це не лише не-англійська мова; Англійська теж потребує !! Жодна кодова точка не займає більше 4-х байт у будь-якому кодуванні; цей 6-байтовий бізнес є неправильним. Ви не можете кодувати UTF жодним скалярним значенням Unicode, оскільки це говорить: сурогати та 66 інших нехарактерних символів заборонені. UCS-4 і UTF-32 не однакові. Немає мультиблоку UTF-32. UTF-16 не настільки ефективний, як вони роблять вигляд - & c & c & c!
tchrist

1
ASCII також не містить знака фунта £, і звичайно не містить знака євро € (що значно молодше, ніж ASCII).
TRiG

1
@tchrist Здається, що 6 байтів не є малоймовірними. Дивіться це: joelonsoftware.com/articles/Unicode.html , який означає , що є персонаж простір від 0x04000000до 0x7FFFFFFF, або в двійковій системі це 1111110v 10vvvvvv 10vvvvvv 10vvvvvv 10vvvvvv 10vvvvvv - і це на самому справі 6 байт. Однак 6 байт - це максимум , а не так, як стаття заплутано стверджує "шість байт або більше ".
синтаксис-помилка

12
@syntaxerror: "Лише кодові точки 128 і вище зберігаються, використовуючи 2, 3, фактично, до 6 байт." був точним при написанні, але пізніше того ж року (дванадцять років тому) він був визнаний недійсним. en.wikipedia.org/wiki/UTF-8 говорить: "Оригінальна специфікація охоплювала числа до 31 біт (початковий ліміт Універсального набору символів). У листопаді 2003 року UTF-8 було обмежено RFC 3629 і закінчувалося на U + 10FFFF, щоб відповідати обмеженням кодування символів UTF-16. Це видалило всі 5- і 6-байтові послідовності та приблизно половину 4-байтових послідовностей. "
Mooing Duck

237

Дозвольте використати приклад для ілюстрації цієї теми:

A chinese character:      汉
it's unicode value:       U+6C49
convert 6C49 to binary:   01101100 01001001

Поки що нічого магічного, це дуже просто. Скажімо, ми вирішили зберігати цього персонажа на нашому жорсткому диску. Для цього нам потрібно зберігати символ у двійковому форматі. Ми можемо просто зберігати його як "01101100 01001001". Готово!

Але зачекайте хвилинку, це '01101100 01001001' один символ чи два символи? Ви знали, що це один персонаж, тому що я вам казав, але коли комп'ютер читає його, то поняття не має. Тому нам потрібна якась «кодування», щоб сказати комп’ютеру ставитися до цього як до одного.

Тут розміщені правила "UTF-8": http://www.fileformat.info/info/unicode/utf8.htm

Binary format of bytes in sequence

1st Byte    2nd Byte    3rd Byte    4th Byte    Number of Free Bits   Maximum Expressible Unicode Value
0xxxxxxx                                                7             007F hex (127)
110xxxxx    10xxxxxx                                (5+6)=11          07FF hex (2047)
1110xxxx    10xxxxxx    10xxxxxx                  (4+6+6)=16          FFFF hex (65535)
11110xxx    10xxxxxx    10xxxxxx    10xxxxxx    (3+6+6+6)=21          10FFFF hex (1,114,111)

Згідно з наведеною вище таблицею, якщо ми хочемо зберегти цього символу у форматі 'UTF-8', нам потрібно приєднати наш символ до деяких «заголовків». Наш китайський символ має 16 біт (порахуйте двійкове значення самостійно), тому ми будемо використовувати формат у рядку 3, оскільки він забезпечує достатньо місця:

Header  Place holder    Fill in our Binary   Result         
1110    xxxx            0110                 11100110
10      xxxxxx          110001               10110001
10      xxxxxx          001001               10001001

Запис результату в один рядок:

11100110 10110001 10001001

Це значення UTF-8 (бінарне) китайського символу! (підтвердьте це самостійно: http://www.fileformat.info/info/unicode/char/6c49/index.htm )

Підсумок

A chinese character:      汉
it's unicode value:       U+6C49
convert 6C49 to binary:   01101100 01001001
embed 6C49 as UTF-8:      11100110 10110001 10001001

PS Якщо ви хочете вивчити цю тему в python, натисніть тут


6
"Але зачекайте хвилинку, це" 01101100 01001001 "один символ чи два символи? скажіть комп’ютеру, щоб він ставився до нього як до одного ». Ну добре, але комп'ютер все ще не знає, він повинен кодувати його utf-8?
Корай Тугай

15
@KorayTugay Комп'ютер не знає, яким кодуванням він повинен користуватися. Ви повинні сказати це, коли ви зберігаєте персонаж у файл, а також, коли ви читаєте персонаж із файлу.
Ченг

3
@Connor Комп'ютер не знає, який формат використовувати. Під час збереження документа текстовий редактор повинен чітко встановити його кодування як utf-8 або будь-який формат, який користувач хоче використовувати. Крім того, коли програма редактора тексту читає файл, йому потрібно вибрати схему кодування тексту, щоб правильно його розшифрувати. Те саме стосується введення та введення листа, текстовому редактору необхідно знати, яку схему ви використовуєте, щоб правильно зберегти його.
Чен

2
То як інтерпретуються ці заголовки? якщо я дивлюсь на першу таблицю, то я думаю: якщо байт починається з біта, 0то символ представлений 1 бітом (поточним), якщо байт починається з 110того символу, представлений двома байтами (поточним та наступним ( залишилися біти після 10)), якщо байт починається з 1110цього символу, представлений 3 байтами, поточним та наступними 2 байтами (решта бітів після 10).
JBoy

2
Прочитайте 10 статей про UTF-8; прочитавши це, я зрозумів протягом 10 секунд :)
jrhee17

201

"Unicode", на жаль, використовується різними способами, залежно від контексту. Найбільш правильне його використання (IMO) - це кодований набір символів, тобто набір символів та відображення між символами та цілими кодовими точками, що їх представляють.

UTF-8 - це кодування символів - спосіб перетворення з послідовностей байтів у послідовності символів і навпаки. Він охоплює весь набір символів Unicode. ASCII кодується як один байт на символ, а інші символи беруть більше байтів залежно від їх точної кодової точки (до 4 байтів для всіх визначених в даний час кодів, тобто до U-0010FFFF, і дійсно 4 байти можуть справлятися з до U-001FFFFF).

Коли "Unicode" використовується як ім'я кодування символів (наприклад, властивість .NET Encoding.Unicode ), це зазвичай означає UTF-16 , який кодує найбільш поширені символи у вигляді двох байтів. Деякі платформи (зокрема .NET та Java) використовують UTF-16 як кодування "рідних" символів. Це призводить до проблем з волоссям, якщо вам потрібно потурбуватися про символи, які не можуть бути закодовані в одне значення UTF-16 (вони закодовані як "сурогатні пари") - але більшість розробників ніколи не хвилюються з цього приводу, IME.

Деякі посилання на Unicode:


16
Я думаю, що UTF-16 дорівнює "Unicode" на платформах Windows. Люди схильні використовувати UTF-8 за замовчуванням на * nix. +1, хоча, хороша відповідь
джефф

10
@Chris: Ні, ISO-8859-1 не є UTF-8. UTF-8 кодує U + 0080 до U + 00FF як два байти, а не один. Windows 1252 та ISO-8859-1 здебільшого однакові, але вони різняться між значеннями 0x80 та 0x99, якщо я правильно пам'ятаю, де ISO 8859-1 має "дірку", але CP1252 визначає символи.
Джон Скіт

13
Ідея називати UTF-16 "Unicode" сидить неприємно зі мною через його потенціал плутати - хоча це було чітко зазначено лише як .NET-конвенція. UTF-16 - це спосіб представлення Unicode, але це не "кодування Unicode".
thomasrutter

6
@unwesen: UTF-8 не потребує сурогатних пар. Він просто представляє символи, що не належать до BMP, використовуючи прогресивно більш тривалі байтові послідовності.
Джон Скіт

5
@RoyiNamir: Так, "Unicode", на жаль, часто використовується для позначення "UTF-16", особливо в Windows.
Джон Скіт

108

Вони не те саме - UTF-8 - це особливий спосіб кодування Unicode.

Є багато різних кодувань, які ви можете вибрати, залежно від програми та даних, які ви збираєтесь використовувати. Найбільш поширені UTF-8, UTF-16 та UTF-32 s, наскільки мені відомо.


10
однак справа в тому, що деякі редактори пропонують зберегти файл як "Unicode" АБО "UTF-8". Тож згадка про те, що "Unicode" в цьому випадку є UTF-16, я вважаю необхідним.
серхіо

71

Unicode визначає лише кодові точки , тобто число, яке представляє символ. Те, як зберігати ці кодові точки в пам'яті, залежить від кодування, яке ви використовуєте. UTF-8 - це один із способів кодування символів Unicode, серед багатьох інших.


2
однак справа в тому, що деякі редактори пропонують зберегти файл як "Unicode" АБО "UTF-8". Тож згадка про те, що "Unicode" в цьому випадку є UTF-16, я вважаю необхідним.
серхіо

Число, яке представляє символ, робить також ASCII.
яскравий

6
прочитайте це до і після того, як
подивіться

33

Unicode - це стандарт, який визначає поряд з ISO / IEC 10646 Універсальний набір символів (UCS), який є набором всіх існуючих символів, необхідних для представлення практично всіх відомих мов.

Unicode присвоює ім’я та номер ( код символу чи код-точку ) кожному символу у своєму репертуарі.

Кодування UTF-8 - це спосіб представити ці символи в цифровій формі в пам'яті комп'ютера. UTF-8 відображає кожну кодову точку в послідовність октетів (8-бітових байт)

Наприклад,

Характер UCS = Характер Unicode Han

Кодова точка UCS = U + 24B62

Кодування UTF-8 = F0 A4 AD A2 (hex) = 11110000 10100100 10101101 10100010 (бін)


Ні, UTF-8 відображає лише кодові точки в послідовність, що перевищує 127. Все від 0 до 127 - це не послідовність, а один байт. Btw, ASCII також присвоює ім'я символу номеру, так що це те саме, що робить Unicode. Але Unicode не зупиняється на кодовій точці 127, а йде до 0x10ffff.
яскравий

2
@ явно відрізняюся. Символи Ascii дійсно відображені в одній послідовності байтів. Перший біт, який дорівнює 0 у випадку коду для символів ascii, вказує, скільки байтів слідує - нуль. http://www.wikiwand.com/en/UTF-8#/DescriptionПогляньте на перший ряд.
нічні маршрути

Ну для мене послідовність складається з декількох байт. Символ ASCII в UTF-8 є одним байтом, як самий, найбільш значущий біт встановлений 0. Кодовим точкам вище 127, тоді потрібні послідовності, які завжди мають стартовий і один, два або три наступні байти. То чому б ви назвали один байт "послідовністю"?
яскравий

Ну ... Багато разів адвокати англійської мови можуть бути збиті з пантелику з приводу навмисних зловживань програмним забезпеченням. Це той самий випадок і тут. Ви можете сперечатися з цим. Але це не зробить це зрозумілішим.
нічні маршрути

1
@brighty Hmmm, У математиці послідовність із 0 елементів його добре. Послідовність 1 елемента також тут добре.
chux

24

Unicode - це лише стандарт, який визначає набір символів ( UCS ) та кодування ( UTF ) для кодування цього набору символів. Але загалом Unicode відноситься до набору символів, а не до стандарту.

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


1
@serhio: Я знаю. Хоча існують три різні кодування UTF-16: Два явні UTF-16LE та UTF-16BE та неявні UTF-16, де цілеспрямованість задається BOM.
Гумбо

@Gumbo: Відсутність BOM не означає, що це інше кодування. Є лише два кодування.
Mooing Duck

Блог вище написаний генеральним директором Stakcoverflow.
Шайлеш Пратапвар

23

Існуючі відповіді вже пояснюють багато деталей, але ось дуже коротка відповідь з найбільш прямим поясненням та прикладом.

Unicode - це стандарт, який відображає символи до кодових точок.
Кожен символ має унікальну кодову точку (ідентифікаційний номер), яка є числом, як 9731.

UTF-8 являє собою кодування з кодових значень.
Для зберігання всіх символів на диску (у файлі) UTF-8 розбиває символи до 4 октетів (8-бітні послідовності) - байти. UTF-8 є одним з декількох кодувань (способів подання даних). Наприклад, в Unicode (десяткова) кодова точка 9731 являє собою сніговика ( ), який складається з 3 байтів у UTF-8:E2 98 83

Ось відсортований список з кількома випадковими прикладами .


1
Ні! UTF-8 - це хороший спосіб кодування символів Unicode, але ми можемо також кодувати UTF-16 або UTF-32. З UTF-32 ми маємо відношення 1: 1 між DWORD та кодовою точкою, з UTF-16 ми маємо відношення 1: 1 між WORD та кодовою точкою лише для кодових точок BMP, виключаючи сурогати та BOM. У UTF-8 у нас є співвідношення 1: 1 між байтом та
кодовою точкою

5
@brighty: Так, але чому "Ні!"? Я написав "UTF-8 - це одне з декількох кодувань", тому що є також UTF-16 і UTF-32.
базовий6

16

1. Юнікод

У всьому світі є безліч символів, наприклад "$, &, h, a, t,?, 张, 1, =, + ...".

Потім приходить організація, яка присвячена цим персонажам,

Вони зробили стандарт під назвою "Unicode".

Стандарт такий:

  • створити форму, в якій кожну позицію називають "кодовою точкою" або "кодовою позицією".
  • Цілі позиції - від U + 0000 до U + 10FFFF;
  • До цих пір деякі позиції заповнені символами, а інші позиції збережені або порожні.
  • Наприклад, позиція "U + 0024" заповнена символом "$".

PS: Звичайно, є ще одна організація під назвою ISO, яка підтримує інший стандарт - "ISO 10646" , майже однаковий.

2. UTF-8

Як і вище, U + 0024 - це лише позиція, тому ми не можемо зберегти "U + 0024" в комп'ютері для символу "$".

Має бути метод кодування.

Потім з'являються методи кодування, такі як UTF-8, UTF-16, UTF-32, UCS-2 ....

Під UTF-8 кодова точка "U + 0024" кодується в 00100100.

00100100 - це значення, яке ми зберігаємо в комп'ютері за "$".


1
Загалом, UTF-8 - єдиний варіант, яким сьогодні користуються.
Рік Джеймс

2
ISO 10646 - ідентичний стандарт набору символів Unicode. Unicode визначає багато речей, крім набору символів, таких як правила сортування, регістри тощо. ISO 10646 - це лише набір символів (яких наразі понад 130 000). Консорціум Unicode та ISO розробляють Unicode спільно, причому ISO стосується лише набору символів та його кодувань, а Unicode також визначає властивості символів та правила обробки тексту.
thomasrutter

12

Я перевірив посилання у відповіді Gumbo, і я хотів вставити частину цих речей, щоб вони існували і на Stack Overflow.

"... Деякі люди помилково вважають, що Unicode - це просто 16-бітний код, де кожен символ бере 16 біт, і тому є 65 536 можливих символів. Це, власне, не правильно. Це єдиний найпоширеніший міф про Unicode , тож якщо ви так подумали, не відчувайте себе погано.

Насправді, у Unicode є інший спосіб мислення персонажів, і ви повинні зрозуміти спосіб Unicode мислення речей, або нічого не матиме сенсу.

Досі ми вважали, що лист відображає деякі біти, які можна зберігати на диску чи в пам'яті:

А -> 0100 0001

У Unicode лист наводиться на те, що називається кодовою точкою, яка все ще є лише теоретичною концепцією. Як ця кодова точка представлена ​​в пам'яті чи на диску - це зовсім інша історія ... "

"... Кожній платонічній літері в кожному алфавіті присвоюється магічне число консорціумом Unicode, який пишеться так: U + 0639. Це магічне число називається кодовою точкою. U + означає" Unicode ", а цифри - шістнадцяткові. U + 0639 - це арабська літера Ain. Англійською літерою A буде U + 0041 .... "

"... Гаразд, тому скажімо, у нас є рядок:

Здравствуйте

що в Unicode відповідає цим п'яти кодовим пунктам:

U + 0048 U + 0065 U + 006C U + 006C U + 006F.

Просто купа кодових очок. Числа, справді. Ми ще не сказали нічого про те, як зберігати це в пам'яті або представляти його в електронному повідомленні ... "

"... Ось де входять кодування.

Найбільш рання ідея кодування Unicode, яка призвела до міфу про два байти, була, ей, давайте просто збережемо ці числа в два байти кожен. Так привіт стає

00 48 00 65 00 6C 00 6C 00 6F

Правильно? Не так швидко! Чи не може це бути також:

48 00 65 00 6C 00 6C 00 6F 00? ... "


В ASCII лист також позначається на кодову точку, а не тільки в unicode.
яскравий

8

UTF-8 - одна з можливих схем кодування тексту Unicode .

Unicode - стандарт широкого діапазону, який визначає понад 130 000 символів і виділяє кожному числовий код (кодова точка). Він також визначає правила того, як сортувати цей текст, нормалізувати його, змінити його регістр тощо. Символ у Unicode представлений кодовою точкою від нуля до 0x10FFFF включно, хоча деякі кодові точки зарезервовані і не можуть використовуватися для символів.

Існує більше ніж один спосіб, що рядок кодових точок Unicode можна кодувати у двійковий потік. Вони називаються "кодуваннями". Найпростішим кодуванням є UTF-32 , який просто зберігає кожну кодову точку як 32-бітове ціле число, причому кожна має 4 байти.

UTF-8 - це ще одне кодування і стає де-факто стандартом, завдяки ряду переваг перед UTF-32 та іншими. UTF-8 кодує як послідовність значень одного байту. Кожна точка коду може використовувати змінну кількість цих байтових значень. Кодові точки в діапазоні ASCII кодуються голими, щоб бути сумісними з ASCII. Кодові точки поза цим діапазоном використовують змінну кількість байтів, або 2, 3, або 4, залежно від того, в якому діапазоні вони знаходяться.

UTF-8 розроблений з урахуванням таких властивостей:

  • Символи ASCII кодуються точно так, як вони є в ASCII, таким чином, що рядок ASCII також є дійсним рядком UTF-8.

  • Бінарне сортування: Сортування рядків UTF-8 за допомогою наївного бінарного сортування все одно призведе до сортування всіх точок коду в цифровому порядку.

  • Символи, що потребують декількох байтів, не містять жодних значень байту в діапазоні ASCII, що забезпечує частину з них не можуть бути прийняті за символи ASCII. Це також функція безпеки.

  • UTF-8 можна легко перевірити і відрізнити від інших кодувань символів валідатором. Текст в інших 8-бітних або багатобайтових кодуваннях дуже рідко також буде підтвердженим як UTF-8.

  • Випадковий доступ: У будь-якій точці рядка UTF-8 можна визначити, чи байт у цій позиції є першим байтом символу чи ні, і знайти початок наступного чи поточного символу, не потребуючи сканування вперед або назад більше декількох байт або читати що-небудь на початку потоку.


Кілька другорядних моментів: [1] Чи не слід "символи ASCII закодовані точно так, як вони є в ASCII " на "ASCII символи закодовані так, як вони є в UTF-8 " ? [2] Фраза "Коди в Unicode ..." незрозуміла (для мене). Ви маєте на увазі "Кодові точки Unicode ..." ?
skomisa

@skomisa для точки 1, я мав на увазі, що кодування символів у діапазоні ASCII є ідентичним як для ASCII, так і для UTF-8.
thomasrutter

Для пункту 2 це справедливий момент, і я відредагую це, щоб зробити його зрозумілішим
thomasrutter

2

Вони те саме, чи не так?

Ні, вони ні.


Я думаю, що перше речення сторінки, на яку ви посилаєтесь, дає хороший короткий підсумок:

UTF-8 - це кодування символів змінної ширини, здатне кодувати всі 1,112,064 дійсних кодових точок у Unicode, використовуючи один-чотири 8-бітні байти.

Розробити:

  • Unicode - це стандарт, який визначає карту від символів до чисел, так звані кодові точки (як у прикладі нижче). Для повного відображення можна ознайомитись тут .

    ! -> U+0021 (21),  
    " -> U+0022 (22),  
    \# -> U+0023 (23)
    
  • UTF-8 - це один із способів кодування цих точок коду у формі, яку комп'ютер може зрозуміти, він же біти . Іншими словами, це спосіб / алгоритм перетворення кожної з цих кодових точок у послідовність бітів або перетворення послідовності бітів в еквівалентні кодові точки. Зауважте, що існує багато альтернативних кодувань для Unicode.


Жоель дає дійсно приємне пояснення та огляд історії тут .


2

Якщо я можу підсумувати те, що я зібрав з цієї теми:

Unicode "переводить" символи до порядкових чисел (у десятковій формі) .

à = 224

UTF-8 - це кодування, яке 'переводить' ці числа у двійкові представлення .

224 = 11000011 10100000

Зауважимо, що ми говоримо про двійкове представлення 224, а не про його бінарну форму, яка становить 0b11100000.


2

У цій статті пояснюються всі подробиці http://kunststube.net/encoding/

ПИСЬМО НА БУФЕР

якщо ви записуєте в 4-байтний буфер, символ із кодуванням UTF8, ваш двійковий файл буде виглядати приблизно так:

00000000 11100011 10000001 10000010

якщо ви записуєте в 4-байтний буфер, символ із кодуванням UTF16, ваш двійковий файл буде виглядати приблизно так:

00000000 00000000 00110000 01000010

Як бачите, залежно від того, якою мовою ви б користувалися у своєму вмісті, це відповідно вплине на вашу пам'ять.

Наприклад, для цього конкретного символу: кодування UTF16 є більш ефективною, оскільки для наступного символу у нас є 2 резервні байти. Але це не означає, що ви повинні використовувати UTF16 для японського алфавіту.

ЧИТАННЯ З БУФЕРА

Тепер, якщо ви хочете прочитати вищевказані байти, ви повинні знати, в яке кодування було написано, і правильно їх розшифрувати.

Наприклад, якщо ви розшифруєте це: 00000000 11100011 10000001 10000010 в кодування UTF16, ви отримаєте не

Примітка: Кодування та Unicode - це дві різні речі. Unicode - це велика (таблиця) з кожним символом, відображеним в унікальній кодовій точці. наприклад, символ (літера) має (кодова точка) : 30 42 (шістнадцятковий). З іншого боку, кодування - це алгоритм, який перетворює символи на більш підходящий спосіб при зберіганні до обладнання.

30 42 (hex) - > UTF8 encoding - > E3 81 82 (hex), which is above result in binary.

30 42 (hex) - > UTF16 encoding - > 30 42 (hex), which is above result in binary.

введіть тут опис зображення


дуже хороша пов’язана стаття, сподіваємось, вона продовжує залишатися активною
yolob 21

0

UTF-8 - це метод кодування символів Unicode з використанням 8-бітних послідовностей.

Unicode - це стандарт для представлення великої кількості символів з багатьох мов.


4
"8-бітні послідовності"…? Можливо, хочете уточнити, що точніше…
демалі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.