Должен ли мой исходный код быть в UTF-8?


10

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

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


6
Я пишу весь свой код на клингоне, вы бесчувственный ком!

5
@JackManey: Это не /. ты нечувствительный ком!
FrustratedWithFormsDesigner

А сценарий клингона отсутствует в Юникоде, поэтому вам нужно либо использовать символы «личного пользования», либо транслитерацию ASCII.
Dan04

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

Смотрите также аргументы здесь: utf8everywhere.org
Рори Хантер

Ответы:


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, но установить его внутреннюю многобайтовую кодировку, скажем, Latin-1; Поскольку синтаксический анализатор PHP вообще не занимается кодировками, а просто читает последовательности байтов, мои строковые литералы UTF-8 будут неверно истолкованы как Latin-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, мой бог, это было причиной многих головных болей при работе в группах, где присутствуют пользователи OS X, Windows и Linux. (Для справки это по умолчанию MacRoman на OS X, CP-1252 на Windows, и я забыл, какой на Linux, но вы
держите

@leflings - вероятно, кодировка среды по умолчанию, которая в настоящее время обычно UTF-8.
Мацей Печотка

1

Очень приятно иметь возможность вводить простой текст в строки или символы в кавычках в исходном коде и видеть реальный символ. Например, символ пи 'π' или иероглиф '𠀊' намного лучше, чем эквивалентный '\ u3c0' для пи и 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.