В чем разница между локалью и кодировкой (терминал)
Я попробовал несколько способов установить терминальную "кодировку" из программы на 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_* влияет только на программы, которые будут работать с этой оболочкой.
Кроме того, установка языкового стандарта или кодировки не препятствует вводу "других" символов.
Этот ответ должен помочь уточнить вещи.