Рубіст; s Вступ до кодування символів, Unicode та UTF-8; Новини недбалості

Дуже ймовірно, що ви бачили виняток Ruby, такий як UndefinedConversionError або IncompatibleCharacterEncodings. Менше ймовірно, що ви зрозуміли, що означає виняток. Ця стаття допоможе. Ви дізнаєтесь, як працює кодування символів і як вони реалізовані в Ruby. Зрештою, ви зможете набагато легше зрозуміти та виправити ці помилки.

рубіст

Отже, що таке "кодування символів" у будь-якому випадку?

У кожній мові програмування ви працюєте зі рядками. Іноді ви обробляєте їх як вхідні дані, іноді відображаєте як вихідні. Але ваш комп’ютер не розуміє «рядків». Він розуміє лише біти: 1 і 0. Процес перетворення рядків у біти називається кодуванням символів.

Але кодування символів належить не лише епосі комп’ютерів. Ми можемо навчитися на більш простому процесі, перш ніж у нас з’явилися комп’ютери: азбука Морзе.

Азбука Морзе

Азбука Морзе дуже проста у своєму визначенні. У вас є два символи або способи отримання сигналу (короткий і довгий). За допомогою цих двох символів ви представляєте простий англійський алфавіт. Наприклад:

  • A є .- (одна коротка позначка та одна довга позначка)
  • Е є. (одна коротка позначка)
  • O є - (три довгі позначки)

Ця система була винайдена приблизно в 1837 році, і вона дозволяла кодувати весь алфавіт лише за допомогою двох символів або сигналів.

На зображенні ви можете побачити "кодера", особу, відповідальну за кодування та декодування повідомлень. Це незабаром зміниться з появою комп’ютерів.

Від ручного до автоматичного кодування

Для кодування повідомлення потрібно, щоб людина вручну переклала символи в символи, дотримуючись алгоритму азбуки Морзе.

Подібно до азбуки Морзе, комп’ютери використовують лише два «символи»: 1 і 0. Ви можете зберігати в комп’ютері лише їх послідовність, і коли вони читаються, їх потрібно інтерпретувати так, щоб це було зрозуміло для користувача.

Процес працює так в обох випадках:

SOS в азбуці Морзе це буде:

Великою зміною в роботі з комп’ютерами та іншими технологіями стало те, що процес кодування та декодування був автоматизований, тому ми більше не потребували людей для перекладу інформації.

Коли були винайдені комп’ютери, одним із ранніх стандартів, створених для автоматичного перетворення символів в 1 і 0 (хоча і не перший), був ASCII.

ASCII означає американський стандартний код для обміну інформацією. "Американська" частина відіграла важливу роль у тому, як комп'ютери деякий час працювали з інформацією; чому ми побачимо у наступному розділі.

ASCII (1963)

На основі знання телеграфних кодів, таких як азбука Морзе та дуже ранні комп'ютери, стандарт кодування та декодування символів у комп'ютері був створений приблизно в 1963 році. Ця система була відносно простою, оскільки спочатку охоплювала лише 127 символів, англійський алфавіт плюс додаткові символи.

ASCII працював, пов'язуючи кожен символ з десятковим числом, яке можна було перевести в двійковий код. Подивимось приклад:

"A" - це 65 в ASCII, тому нам потрібно перевести 65 у двійковий код.

Якщо ви не знаєте, як це працює, ось швидкий спосіб: ми починаємо ділити 65 на 2 і продовжуємо, поки не отримаємо 0. Якщо ділення не є точним, додаємо 1 як залишок:

Тепер беремо залишки і ставимо їх у зворотному порядку:

Отже, ми зберігали б "А" як "1000001" з оригінальним кодуванням ASCII, відомим тепер як US-ASCII. На сьогоднішній день, коли звичні 8-бітні комп’ютери, це буде 01000001 (8 біт = 1 байт).

Ми дотримуємося одного і того ж процесу для кожного символу, тому, маючи 7 біт, ми можемо зберігати до 2 ^ 7 символів = 127.

Ось повна таблиця:


(З http://www.plcdev.com/ascii_chart)

Проблема з ASCII

Що сталося б, якби ми хотіли додати ще один символ, наприклад французький ç або японський символ 大?

Так, у нас була б проблема.

Після ASCII люди намагалися вирішити цю проблему, створивши власні системи кодування. Вони використовували більше бітів, але це врешті-решт спричинило ще одну проблему.

Основна проблема полягала в тому, що під час читання файлу ви не знали, чи маєте ви певну систему кодування. Спроба інтерпретувати це з неправильним кодуванням призвела до дрібниць типу " " або "Ã, ÂÃ⠀ šÃ‚Â".

Еволюція цих систем кодування була великою і широкою. Залежно від мови, у вас були різні системи. Мови з більшою кількістю символів, такі як китайська, повинні були розробляти більш складні системи для кодування своїх алфавітів.

Після багатьох років боротьби з цим було створено новий стандарт: Unicode. Цей стандарт визначав спосіб, яким сучасні комп’ютери кодують та декодують інформацію.

Юнікод (1988)

Мета Unicode дуже проста. Відповідно до офіційного сайту:
"Надати унікальний номер для кожного персонажа, незалежно від платформи, програми чи мови."

Отже, кожному символу мови присвоєно унікальний код, також відомий як кодова точка. В даний час налічується понад 137 000 символів.

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

Ті ж люди, які створили мову програмування Go, Роб Пайк і Кен Томпсон, також створили UTF-8. Це вдалося, оскільки воно ефективно і розумно в тому, як кодує ці цифри. Подивимось чому саме.

UTF-8: Формат перетворення Unicode (1993)

Зараз UTF-8 є фактичним кодуванням веб-сайтів (понад 94% веб-сайтів використовують це кодування). Це також кодування за замовчуванням для багатьох мов програмування та файлів. То чому це було так успішно і як це працює?