Unicode у мові D

Unicode – це глобальний стандарт для кодування і представлення тексту у комп'ютерній системі. Мова D повністю підтримує Unicode як у самій мові, так і у стандартній бібліотеці.

Що і Чому

Комп'ютери, на найнижчому рівні, не мають жодного уявлення про те, що собою представляє текст, адже вони займаються виключно числами. Таким чином, комп'ютерний код потребує спосіб отримання і перетворення текстових даних з/на бінарне представлення. Метод трансформації називається encoding scheme (схемою кодування), а Unicode є саме однією з таких схем.

Щоб побачити числове представлення, що лежить в основі рядка, наведеного у прикладі, необхідно просто запустити код.

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

Для отримання більш детальної інформації щодо Unicode, перевірте посилання, присвячені Unicode у розділі "Поглиблення" у Wikipedia.

Як

Unicode впорався з більшістю цих проблем і тепер підтримується на кожній сучасній машині. Враховуючи помилки попередніх мов, усі рядки у мові D є рядками Unicode. У той же час рядки у таких мовах, як C і C++ є звичайним набором байтів.

У мові D, string, wstring, і dstring – це закодовані рядки UTF-8, UTF-16, та UTF-32 відповідно. Їх знакові типи – це char, wchar, і dchar.

Згідно зі специфікацією, помилковим є зберігання не-Unicode даних у типах рядків мови D, адже це може призвести до різного роду помилок.

Для того, щоб зберегти інші рядки кодування, або отримати функціональні можливості C/C++, можна використовувати ubyte[] або char*

Рядки в алгоритмах діапазону

Прочитати розділ [Перлини у алгоритмах діапазону](gems/range-algorithms) рекомендується перед цим розділом.

Є кілька важливих застережень щодо Unicode, які треба враховувати.

По-перше, як ознака зручності, виконуючи ітерацію по рядку за допомогою функцій діапазону, Phobos буде кодувати елементи string і wstrings у кодові символи UTF-32. Ця практика, відома як автоматичне декодування, означає наступне

static assert(is(typeof(utf8.front) == dchar));

Така поведінка має багато ускладнень, основне з яких полягає у тому, що більшість людей збиті з пантелику, адже std.traits.hasLength!(string) є тотожним до False. Чому? Тому що у межах діапазону API, довжина рядка скоріше поверне кількість елементів у рядку, а не надлишок кількості елементів функції діапазонів.

З прикладу можна зрозуміти, чому ці дві речі не завжди тотожні. Алгоритми діапазонів у Phobos діють так, ніби рядки не мають інформації стосовно довжини.

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

Поглиблення

rdmd playground.d