Что бы сломалось, если локаль C была UTF-8 вместо ASCII?

Локаль C определен для использования кодировки ASCII, и POSIX не предоставляет способ использования кодировки без изменения языка.

Что произойдет, если вместо кодировки C вместо UTF-8?

Положительная сторона заключалась бы в том, что UTF-8 станет кодировкой по умолчанию для любого процесса, даже системных демонов. Очевидно, что будут приложения, которые сломаются, потому что они предполагают, что C использует 7-битный ASCII. Но действительно ли эти приложения существуют? В настоящий момент много написанного кода в определенной степени зависит от языка и кодировки, я был бы удивлен, увидев код, который может обрабатывать только 7-битный чистый ввод и не может быть легко адаптирован для приема C-UTF-8 с поддержкой C ,

Языковой стандарт C не является языковым стандартом по умолчанию. Это язык, который гарантированно не вызывает какого-либо «удивительного» поведения. Ряд команд имеет вывод гарантированной формы (например, заголовки ps или df , формат date ) в локали C или POSIX . Для кодировок ( LC_CTYPE ) гарантируется, что [:alpha:] содержит только буквы ASCII и т. Д. Если языковой стандарт C был изменен, это вызовет множество приложений, которые будут неверно работать. Например, они могут отклонять ввод, который является недопустимым UTF-8, вместо того, чтобы рассматривать его как двоичные данные.

Если вы хотите, чтобы все программы в вашей системе использовали UTF-8, установите языковой стандарт по умолчанию в UTF-8. Все программы, которые управляют одной кодировкой, то есть. Некоторые программы только манипулируют байтом strems и не заботятся о кодировках. Некоторые программы управляют несколькими кодировками и не заботятся о локали (например, веб-сервер или веб-клиент устанавливает или читает кодировку для каждого соединения в заголовке).

Думаю, вы немного смущены. «C locale» – это язык, подобный любому другому, который, как вы отмечаете, обычно является синонимом 7-битного ASCII.

Он встроен в библиотеку C, я полагаю, что библиотека имеет какой-то резерв – не может быть никакого языка.

Однако это не имеет ничего общего с тем, как программы, созданные из кода C, обрабатывают входные данные. Локаль используется для перевода ввода, который передается исполняемому файлу, который, если локаль системы UTF-8, UTF-8 – это то, что программа получает независимо от того, был ли ее источник написан на C или что-то еще. Так:

Я был бы удивлен, увидев код, который может иметь дело только с 7-битным чистым входом и не может быть легко адаптирован для приема UTF-8 с поддержкой C

Не имеет смысла. Минимальная часть стандартного источника C, который считывает со стандартного ввода, получает поток байтов из системы. Если система использует UTF-8, и она создала поток из некоторого аппаратного обеспечения HID, тогда этот поток может содержать кодированные символы UTF-8. Если он пришел откуда-то еще (например, сеть, файл), он может содержать что угодно, что делает предположение о стандарте UTF-8 полезным.

Тот факт, что локаль C является гораздо более ограниченным набором символов, чем локаль UTF-8, не имеет отношения. Это просто называется «языковой стандарт C», но на самом деле он не имеет ничего общего с составлением кода C, чем любой другой.

Вы можете, по сути, указать символы UTF-8 с жестким кодом в c-строки в источнике. Предполагая, что система UTF-8, эти строки будут выглядеть корректно при использовании исполняемого файла.

Ссылка «Роджер Ли», опубликованная в комментарии, который, как я полагаю, относится к использованию расширенного набора (UTF-8) в качестве языка C в библиотеке C, предназначенной для встроенной среды, так что никакая другая локаль не должна загружаться для системы для работы с UTF-8.

Итак, ответ на вопрос: «Что бы сломалось, если бы язык C был UTF-8 вместо ASCII?» есть, я бы догадался , ничего, но вне встроенной среды и т. д. это не так уж и нужно. Но, скорее всего, в какой-то момент это станет нормой для библиотек, таких как GNU C (может быть, я думаю).