C.UTF-8 — Недавний непереносимый дебианизм
Намерение C.UTF-8 хорошее, но реализация еще не совсем. На данный момент избегайте, пока он не стабилизируется.
Некоторое обсуждение контекста
Обсуждение redhat, посвященное включению этой функции. Это означает, что это не совсем так (по крайней мере, на момент написания статьи). В частности, обратите внимание, что Ник Коглан, основной разработчик python, предполагает, что python не правильно определяет локали в некоторых контекстах, подобных этому.
Обсуждение haskell, показывающее переносимый кроссплатформенный материал — в данном случае haskell-stack, но косвенно также докер — становится сложнее и менее надежным с использованием C.UTF-8.
Намерение
Debian (также) инициировал C. UTF-8 и намерение правильное.
Сегодняшние Linux-системы интенсивно локализованы — множество локалей, детальный выбор вариантов LC_* и т. д. и т. д. Но все это не включено по умолчанию: если система локалей нарушена, система сломана. Причина, по которой сломанная локальная система не так серьезна, как, скажем, сломанное ядро, fstab или grub и т. д., заключается в...
Локаль C
локаль C (синоним POSIX) всегда будет доступен в качестве запасного варианта, если другие вещи сломаются. Так, например, вы увидите не локализованные ошибки, а английский — не моджибаке, пустые прямоугольники или вопросительные знаки!
По большому счету вы получаете такого рода предупреждения а не ошибки, а в остальном все работает.
Но C = POSIX подразумевает устаревший ASCII, а не UTF-8 везде — нежелательный побочный эффект устаревшего.
Чтобы сделать это наследие все менее и менее необходимым, даже в качестве запасного варианта, Debian представил всегда доступную локаль C.UTF-8.
Улов? Он всегда доступен...
Только в Дебиан
Это означает, что последний Debian, производные, такие как Ubuntu, также недавние. Но не (пока) другие системы.
Короче говоря, C.UTF-8 не является универсальным, не переносимым, хрупким и, следовательно, его можно избежать ... по крайней мере, на данный момент, по крайней мере, в клиент-серверных, виртуализированных (контейнерных) и т. д. системах, таких как докер. ....
Практический результат
Вам необходимо явно установить устаревшие локали, такие как en_US.UTF-8. (Люди, которым нужна разумная международная английская локаль и не нужна en_US, могут захотеть проверить en_DK.UTF-8).
Да, это включает в себя некоторое количество
Пачкать руки
Вот коллекция ссылок по настройке локали, ориентированной на докер.
Я не одобряю один анти-шаблон, который повторяется в приведенном выше, но это слишком далеко (от этого вопроса), чтобы расширить это, так что вкратце:
Установка языкового стандарта обычно должна только включать настройку LANG
. Установка LC_ALL
, особенно вместе с LANG
, недопустима.
Из вики Debian
⚠️ ВНИМАНИЕ
Использование LC_ALL настоятельно не рекомендуется, так как оно переопределяет все. Пожалуйста, используйте его только при тестировании и никогда не устанавливайте его в файле запуска.
person
Rusi
schedule
10.01.2020