Чи повинен мій вихідний код бути в UTF-8?


10

Я відчуваю, що часто ви не дуже обираєте формат вашого коду. Я маю на увазі, що більшість моїх інструментів у минулому вирішили для мене. Або я навіть не думав про це. Днями я використовував TextPad у Windows, і коли я зберігав файл, це підказало мені про ASCII, UTF-8/16, Unicode тощо тощо ...

Я припускаю, що майже весь написаний код є ASCII, але чому він повинен бути ASCII? Чи реально ми зараз використовуємо файли UTF-8 для вихідного коду, і чому? Я думаю, що це може бути корисним для багатомовних команд. Чи існують стандарти, пов’язані з тим, як багатомовні команди називають змінні / функції / тощо?


6
Я пишу весь свій код у Клінгоні, ти нечутливий клопоче!

5
@JackManey: Це не /. ти нечутливий клоуд!
FrustratedWithFormsDesigner

І сценарій Klingon відсутній в Unicode, тому вам потрібно буде або використовувати символи "приватного використання", або транслітерацію ASCII.
dan04

@ dan04: Klingon використовує псевдостандартну частину приватного використання BMP (див . реєстр ConScript ) :-)
Росс Паттерсон

Дивіться також аргументи тут: utf8everywhere.org
Rory Hunter

Відповіді:


23

Вибір не між ASCII та UTF-8. ASCII - це 7-бітове кодування, і UTF-8 замінює його - будь-який дійсний текст ASCII також є дійсним UTF-8. Проблеми виникають при використанні символів, що не належать до ASCII; для цього вам потрібно вибрати між UTF-8, UTF-16, UTF-32 та різними 8-бітовими кодуваннями (ISO-xxxx тощо).

Найкраще рішення - дотримуватися суворої діаграми ASCII, тобто просто не використовуйте жодних символів, що не належать до ASCII, у вашому коді. Більшість мов програмування надають способи вираження символів, що не належать до ASCII, за допомогою символів ASCII, наприклад, "\u1234"для позначення точки коду Unicode у 1234. Особливо, уникайте використання символів, що не належать до ASCII, для ідентифікаторів. Навіть якщо вони працюють правильно, люди, які використовують іншу розкладку клавіатури, будуть проклинати вас за те, що вони змушують вводити цих символів.

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

І тоді у вас є кодування, яке обробляє ваш код; це не повинно бути таким же, як кодування вихідного файлу. Наприклад, я можу легко записати PHP в UTF-8, але встановити його внутрішнє багатобайтове кодування на, скажімо, латинську-1; оскільки аналізатор PHP взагалі не стосується кодування, а просто читає байтові послідовності, мої літеральні рядки UTF-8 будуть неправильно трактуватися як латинська-1. Якщо я вивести ці рядки на термінал UTF-8, ви не побачите жодних відмінностей, але довжина рядків та інші багатобайтові операції (наприклад substr) дадуть неправильні результати.

Моє правило - використовувати UTF-8 для всього; тільки якщо вам абсолютно доведеться мати справу з іншими кодуваннями, перетворіть на UTF-8 якомога раніше, а з UTF-8 якомога пізніше.


6

Більшість IDE за замовчуванням зберігають за допомогою кодування UTF-8, і вам майже напевно слід вибрати UTF-8 над ASCII, коли надається можливість. Це дозволить вам не стикатися з дивними проблемами з кодом інтернаціоналізації.


2
Здається, що ASCII проти UTF-8 - це вибір. Якщо у файлі є не ASCII символи, це не так. Якщо є лише символи ASCII, UTF-8 є ASCII.
Фред Фо

Я хотів би, щоб затемнення дотримувалося цього. Як студент першого курсу CS-ish, мій бог став причиною багатьох головних болів під час роботи в групах, де присутня користувачів ОС X, Windows та Linux. (Для довідки він за замовчуванням MacRoman на OS X, CP-1252 в Windows, і я забув, який з них на Linux, але ви
обміняєте, що

@leflings - можливо, кодування середовища за замовчуванням, яке в даний час зазвичай є UTF-8.
Мацей П'єхотка

1

Дуже приємно вміти вводити звичайний текст у рядки, що цитуються, або символи у вихідному коді та бачити фактичний символ. Наприклад, символ pi 'π' або ідеограф '𠀊' набагато приємніше, ніж еквівалент '\ u3c0' для pi і L '\ u2000A' для ідеографа.

Можна ввести та / або скопіювати та вставити ці символи безпосередньо у вихідний код, так само, як і ASCII символи, у гідному редакторі.

Я знаходжу конкретні приклади корисних для концептуалізації та розуміння речей, за якими описи слів іноді не здаються додому. Концептуалізуйте символьні константи Unicode, введені у вихідний код, такі як наступний короткий приклад фрагмента коду:

const unsigned char  ASCII_0X7E      = (unsigned char)  '~';
const unsigned short UNICODE_0X3C0   = (unsigned short) 'π';
const unsigned long  UNICODE_0X2000A = (unsigned long)  '𠀊';
const unsigned long  UNICODE_0X2893D = (unsigned long)  '𨤽';

Символ тильди ASCII '~' може бути збережений у вихідному файлі ASCII або UTF-8, але символи Unicode не можуть бути збережені у формі ASCII. Символ PI 'π' є кодовою точкою Unicode 0x3c0 і може зберігатися у формі UTF-8 як двобайтове значення 0xcf, 0x80. Ідеографи в кодових точках Unicode 0x2000a та 0x2893d потребують 4-байтних послідовностей UTF-8.

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

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

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