Українська

Розробники · Base64 енкодер & decoder

Декодування бази64 до UTF-8 без mojibake: atob плюс TextDecoder

· Як працює

Опубліковано ToolAcre · Редакція журналу

бази64 коди Унікод

Трубопровід від Base64 до UTF-8 показувати збоїв
Головна ToolAcre векторна ілюстрація

atob() повертає байти, які розшифровані як символи, тому акцентований текст виглядає розбито після декодування. Цей пост показує правильний трубопровод від Base64 до байтів UTF-8 текст і як розпізнати шаблон збою.

Про нас API відповідь, що декодує 'Кап функція' — бетон моджибека symptom і два байти за двома невірними героями

A Base64 string Q2Fmw6k= decodes до байтів67, 97, 102, 195, 169), які UTF-8 текст Кафе. Вставте в оййв-декодер (право наоб і перетворення рядків) і виводу часто клаптява, кожен акцент заміняв два невірних персонажів. Цей mojibake відбувається тому, що atob повертає рядок байтів (кодові одиниці 0–255), не UTF-8 текст. байти 195 і 169 кодування акцентованих е в UTF-8.

Порада їх як при окремій латино-1 Символи додають змія. Правильний трубопровод - atob (байтів як рядок), потім TextDecoder (інтерретні байти як UTF-8), і оригінальний текст повертається назад. Функція atob не порушується; він призначений для бінарних даних. Його назва походить від ASCII-до-бінарний, і бінарний рядок він виробляє послідовність одиниць коду 0–255, кожен, хто представляє один байт.

Що таке atob() насправді повертає — рядок одиниць коду 0–255 що стоять для байтів, не декодовано тексту

Якщо ви годуєте це Q2Fmw6k= (стандарт Base64), він виводить рядок, де кожен символ є одним байтом: блок коду 67, потім 97, потім 102, потім 195, потім 169. Якщо показати, що рядок безпосередньо або інтерпретувати як латино-1 Текст, який ви бачите вихідного коду. Крок відсутній конвертує блоки коду, щоб прикрасити масив, а потім декодування масиву, як UTF-8.

charCodeAt петля відновлює значеннябайтів: для кожного персонажа на виході, виклик charCodeAt, щоб отримати блок коду (номер 0–255), магазин в Uint8Array. Після того, як масив байтів існує, переходьте до TextDecoder з charset utf-8. TextDecoder читає послідовність та інтерпретація як UTF-8 текст, поєднуючи послідовності байтів, такі як (195, 169) в одиничні символи, такі як é. Потес67, 97, 102, 195, 169) стати чотирикутним рядком Café. петля навмисно нудна: читати кожен повернутий блок з charCodeAt і призначити його до відповідного положення Uint8Array. Відсутнє рішення про зміну характеру. Єдина інтерпретація прибуває, коли TextDecoder отримує цей масив і діє UTF-8 з жирною похибкою.

Увімкніть цю нитку в Uint8Array — charCodeAt петлі і чому вона являє собою копію байтів, не перетворення

Цей двокроковий процес — відновлення, потім UTF-8 інтерпретація — це те, що Base64 енкодер і декодер внутрішньо. Шаблон mojibake - це знак цієї помилки. Якщо Café з'являється в якості Café, ви побачите латинську-1 тлумачення UTF-8 байти. UTF-8 байтів для é є 0xC3 0xA9 (декімовірно) 195, 169). Латина1, блок коду 195 Є і блок коду 169 й

Коли UTF-8 Послідовність байтів означають, якби кожен байт був окремий латинсько-1 характер, кожен мультибайт UTF-8 послідовність виробляє неправильні замінні символи. Якщо Café з'являється, як Café, слідуючи замінним характером, або як Caf? або Caf plus U+FFFD, ви бачите різну відмову: декодер не визнавав послідовність байтів як діє UTF-8. Приклад бетону: Base64 SGVsbG8sIOS4lueVjCEg8J-Zgg= decodes наступним чином.

ТекстДекодер і рішення charset — декодування як UTF-8, і чому charset є окремим фактом, ви повинні знати

atob виробляє бінарну нитку з байтами (72, 101, 108, 108, 111, 44, 32, 228, 184, 180, 149, 140, 33, 32, 240, 159, 152, 130). Перші шість байтів ASCII: стати Привіт,. Поти 228, 184, 180 трибайт UTF-8 послідовність CJK характер. Поти 149, 140 є частиною наступної послідовності. Повна послідовність включає чотирибайтну послідовність смайликів (240, 159, 152, 130) за кінцевий характер.

При обробці правильно через TextDecoder всі байти об'єднуються для отримання оригінального змішаного тексту. UTF-8 номінальнийte ends мати передбачувані довжини: byte від 0xxxxxxxxxx є одноbyte ASCII; byte від 110xxxxx expects next byte від 10xxx. (двобайтів загальний); tote від 1110xxxx очікує два наступні байти (три байти загальний); tote починаючи з 11110xxx очікує три наступні байти (чотири байтів загальний). Для змішаного CJK-і-масивний зразок, вид байтів особливо діагностичний, оскільки ASCII не допомагає. Кілька байтів відносяться до кожного видимого символу, і однобайтне видалення зміщує решту послідовності в недійсний UTF-8. Стрижка декодування перетворюється на названу відмову замість поломки.

Створений приклад: декодування базового рядка Base64 CJK і смайлики — байти, пункти коду і кінцевий рядок у порівнянні з оригінальним

З 1111110x недійсний UTF-8 (збережений для майбутнього, не використовується). Byte від 10xxx хххх не повинен з'являтися як провідний байт; це продовження. Якщо порушувати правила, то це не діє UTF-8. TextDecoder з charset utf-8 переклади масиву за цими правилами і досягається дійсних послідовностей. Для недійсних, це повідомлення про помилку.

Base64 encoder & decoder використовує TextDecoder з прямим прапором. Це означає недійсним UTF-8 Підняти помилку, а не мовчки вставляючи символи заміни (U+)FFFD). Якщо base64 string decodes до байтів, які не діють UTF-8, суворий режим буде кидати замість продовження з текстом згортання. Це вибір дизайну: бінарні навантаження (зображення, ключі, компресовані дані) не є текстом і не повинні бути декодовані як текст.

Визначте шаблон: ER, â € і — як розповісти про проблему Base64 від проблеми charset

При спробі декодувати JPEG як Base64, байт потік не буде представляти дійсність UTF-8, і сувора декодування відхиляти її. Інструмент пропонує шестигранний вигляд для таких перевантажень: ви можете бачити сирі байти без претендування вони є текстом. Визнання UTF-8 декодування помилок передбачає пошук байтів в контексті. Чи є вони непарні числа, де очікується багатостороння послідовність?

Чи є першим байтом недійсної послідовності ( починаючи з 10xxx)? Чи відсутні байти продовження? Кнопка байта забезпечує найчистіший виделку в розслідуванні. Якщо з'являється шістнадцятий, але текстовий декодування не виходить, базовий 64 парсинг досягається, і завантаження є двома бінарними, пошкодженими або зашифрованими з різним кольором. Зміна бази64 пунктуація не може ремонтувати неправильний блок після виправних байтів.

Що це не криється — UTF-16 payloads, бінарний вихід, такі як зображення та недійсне обслуговування

Візерунки послідовні. Один байт 0xFF ніколи не діє в UTF-8не може бути ASCII бетмен (тільки 0–127 Р ASCII) і не може бути провідним байтом (лідерні байти 0xC0–0xFD, 0xFF зарезервовані). Сурогати лонової кісткиUTF-16 не може з'явитися поняття UTF-8; якщо бачити послідовність байт 0xed 0xA0 0x80 (який кодує сурогат U+D800 в UTF-8 стиль, він не діє UTF-8.

Одна історична робота(вуаєрист(кодування(новини))). encodeURIComponent перетворює кафе на %C3%A9 (відсотків-пригоди UTF-8 байти), unscape repacks як блоки коду, btoa кодові одиниці. Це працює для більшості текстів, але є крихким навколо самотніх сурогатів і важко читати. Сучасний трубопровод—TextEncoder до байтів, потім base64—розчищувач і стандарт. TextEncoder вбудований у всі сучасні браузери та Node.js, зробивши правильний вибір. UTF-16, legacy однобайтних кодувань і довільних вмісту файлів вимагає видалення для цих байтів або двостороннього перегляду файлів. ToolAcre навмисно не вгадувати між ними. Поведінка може перетворити недійсну послідовність у введенні тексту, в той час як шестигранний відвал зберігає кожну байт пізніше, поінформований переклад.

Takeaway: Base64 дає вам байти, UTF-8 дає вам текст — як Base64 енкодер & decoder робить обидва кроки, тому декодований текст відповідає вводу точно

Коли у вас є рядок Base64 і хочете UTF-8 текст, повні кроки: decode Base64 to bytes (using atob або base64-decoding library), створення Uint8Array від байтів, перенести масив до TextDecoder з charset utf-8, читати результат як рядок.

Якщо вхід є бінарними даними, а не текстом, пропустіть TextDecoder і перевірте байти безпосередньо. Base64 encoder & decoder забезпечує шістнадцятковий вид, зберігаючи значення, які строгі UTF-8 декодування буде відхиляти. Цей форк є діагностичним: успішні байти плюс не вдалося текстове значення Base64, коли завантаження є бінарним, пошкодженим, або закодовано за допомогою charset цей інструмент не вгадується.