В чем разница между локалью и кодировкой (терминал)

Я попробовал несколько способов установить терминальную "кодировку" из программы на C++. Все, что я мог сделать, это изменить язык. или переменная LANG.

Тем не менее я могу вводить символы, которые имеют другую кодировку, чем LANG (и вывод nl_langinfo(CODESET))

Но если я зайду в Терминал> Установить кодировку символов> ISO-8859-15 (или что-то еще), то это разрешит только ISO-8859-15 . Могу ли я добиться того же (настройка из GUI) из моей программы на C++?

Я использовал setlocale(LC_CTYPE,""), чтобы установить кодировку для кодировки терминала, но он просто использует переменную LANG. И позволяет также другие символы.

(После терминала> Установить кодировку символов> ISO-8859-1 ( Latin1))

>setenv LANG en_US.iso885915 --> latin9
>./a.out 
Current Locale : C
Lang info : ANSI_X3.4-1968
Trying to change locale from C to ""
Current Locale : en_US.iso885915 
Lang info : ISO-8859-15
Enter some string :¤¦¨´¸¼½¾ dfsafas  --> but these are Latin1 charaters !!
Entered string : ¤¦¨´¸¼½¾ dfsafas --> They are even printed back !!

Таким образом, это привело меня к вопросу, правильное ли мое понимание о локали и кодировке или нет.

Может кто-нибудь уточнить разницу?

1 ответ

Решение

Кодирование - это только часть языковых настроек, и для терминалов оно влияет на то, как терминал отображает и обрабатывает ввод.

Кодировка терминала и настройка локали для программы, работающей с терминалом, в значительной степени независимы и могут не совпадать или могут быть неправильно настроены.

setlocale () установит или запросит текущую локаль программы.

Терминалы обычно порождают новую оболочку, а установка переменных среды LANG или LC_* влияет только на программы, которые будут работать с этой оболочкой.

Кроме того, установка языкового стандарта или кодировки не препятствует вводу "других" символов.

Этот ответ должен помочь уточнить вещи.

Другие вопросы по тегам