Я чула суперечливі думки людей - згідно зі сторінкою UTF-8 Вікіпедії .
Вони те саме, чи не так? Може хтось уточнить?
Я чула суперечливі думки людей - згідно зі сторінкою UTF-8 Вікіпедії .
Вони те саме, чи не так? Може хтось уточнить?
Відповіді:
Щоб розширити відповіді, які дали інші:
У нас багато мов з великою кількістю символів, які в ідеалі повинні відображати комп’ютери. 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.
Сподіваюсь, що заповнює деякі деталі.
0x04000000
до 0x7FFFFFFF
, або в двійковій системі це 1111110v 10vvvvvv 10vvvvvv 10vvvvvv 10vvvvvv 10vvvvvv
- і це на самому справі 6 байт. Однак 6 байт - це максимум , а не так, як стаття заплутано стверджує "шість байт або більше ".
Дозвольте використати приклад для ілюстрації цієї теми:
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, натисніть тут
0
то символ представлений 1 бітом (поточним), якщо байт починається з 110
того символу, представлений двома байтами (поточним та наступним ( залишилися біти після 10
)), якщо байт починається з 1110
цього символу, представлений 3 байтами, поточним та наступними 2 байтами (решта бітів після 10
).
"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:
Вони не те саме - UTF-8 - це особливий спосіб кодування Unicode.
Є багато різних кодувань, які ви можете вибрати, залежно від програми та даних, які ви збираєтесь використовувати. Найбільш поширені UTF-8, UTF-16 та UTF-32 s, наскільки мені відомо.
Unicode визначає лише кодові точки , тобто число, яке представляє символ. Те, як зберігати ці кодові точки в пам'яті, залежить від кодування, яке ви використовуєте. UTF-8 - це один із способів кодування символів Unicode, серед багатьох інших.
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 (бін)
http://www.wikiwand.com/en/UTF-8#/Description
Погляньте на перший ряд.
Unicode - це лише стандарт, який визначає набір символів ( UCS ) та кодування ( UTF ) для кодування цього набору символів. Але загалом Unicode відноситься до набору символів, а не до стандарту.
Прочитайте абсолютний мінімум кожен розробник програмного забезпечення абсолютно, позитивно повинен знати про набори Unicode та символів (без виправдань!) Та Unicode за 5 хвилин .
Існуючі відповіді вже пояснюють багато деталей, але ось дуже коротка відповідь з найбільш прямим поясненням та прикладом.
Unicode - це стандарт, який відображає символи до кодових точок.
Кожен символ має унікальну кодову точку (ідентифікаційний номер), яка є числом, як 9731.
UTF-8 являє собою кодування з кодових значень.
Для зберігання всіх символів на диску (у файлі) UTF-8 розбиває символи до 4 октетів (8-бітні послідовності) - байти. UTF-8 є одним з декількох кодувань (способів подання даних). Наприклад, в Unicode (десяткова) кодова точка 9731 являє собою сніговика ( ☃
), який складається з 3 байтів у UTF-8:E2 98 83
Ось відсортований список з кількома випадковими прикладами .
У всьому світі є безліч символів, наприклад "$, &, h, a, t,?, 张, 1, =, + ...".
Потім приходить організація, яка присвячена цим персонажам,
Вони зробили стандарт під назвою "Unicode".
Стандарт такий:
PS: Звичайно, є ще одна організація під назвою ISO, яка підтримує інший стандарт - "ISO 10646" , майже однаковий.
Як і вище, U + 0024 - це лише позиція, тому ми не можемо зберегти "U + 0024" в комп'ютері для символу "$".
Має бути метод кодування.
Потім з'являються методи кодування, такі як UTF-8, UTF-16, UTF-32, UCS-2 ....
Під UTF-8 кодова точка "U + 0024" кодується в 00100100.
00100100 - це значення, яке ми зберігаємо в комп'ютері за "$".
Я перевірив посилання у відповіді 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? ... "
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 можна визначити, чи байт у цій позиції є першим байтом символу чи ні, і знайти початок наступного чи поточного символу, не потребуючи сканування вперед або назад більше декількох байт або читати що-небудь на початку потоку.
Вони те саме, чи не так?
Ні, вони ні.
Я думаю, що перше речення сторінки, на яку ви посилаєтесь, дає хороший короткий підсумок:
UTF-8 - це кодування символів змінної ширини, здатне кодувати всі 1,112,064 дійсних кодових точок у Unicode, використовуючи один-чотири 8-бітні байти.
Розробити:
Unicode - це стандарт, який визначає карту від символів до чисел, так звані кодові точки (як у прикладі нижче). Для повного відображення можна ознайомитись тут .
! -> U+0021 (21),
" -> U+0022 (22),
\# -> U+0023 (23)
UTF-8 - це один із способів кодування цих точок коду у формі, яку комп'ютер може зрозуміти, він же біти . Іншими словами, це спосіб / алгоритм перетворення кожної з цих кодових точок у послідовність бітів або перетворення послідовності бітів в еквівалентні кодові точки. Зауважте, що існує багато альтернативних кодувань для Unicode.
Жоель дає дійсно приємне пояснення та огляд історії тут .
Якщо я можу підсумувати те, що я зібрав з цієї теми:
Unicode "переводить" символи до порядкових чисел (у десятковій формі) .
à = 224
UTF-8 - це кодування, яке 'переводить' ці числа у двійкові представлення .
224 = 11000011 10100000
Зауважимо, що ми говоримо про двійкове представлення 224, а не про його бінарну форму, яка становить 0b11100000.
У цій статті пояснюються всі подробиці 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.