#unicode #locale
#юникод #языковой стандарт
Вопрос:
Я сталкиваюсь с причудливыми проблемами, связанными с юникодом, которые я не могу понять.
В принципе, у меня есть приложение командной строки, которое при ручном запуске из командной строки успешно вызывает mbtowcs() для различных входных данных (http://www.cplusplus.com/reference/clibrary/cstdlib/mbstowcs /) манипулирует строками и возвращает правильный вывод.
Всякий раз, когда приложение запускается автоматически через monit, эта функция больше не преобразует правильное количество байтов, и выходные данные в основном искажаются и перемежаются с ромбами ошибок unicode. Я тестировал это для тех же входных данных.
Я подозреваю, что это связано с языковым стандартом или некоторыми настройками на компьютере (Ubuntu server 11.04). Я вызываю setlocale(LC_CTYPE, «»); успешно в моей функции запуска.
Может кто-нибудь посоветовать мне, какие системные настройки я должен изменить, чтобы мой код работал правильно?
Обновление: похоже на изменение
setlocale(LC_CTYPE, "");
Для
setlocale(LC_CTYPE, "en_US.UTF-8");
Возможно, проблема решена. Может ли кто-нибудь предоставить какую-либо информацию о том, зачем это нужно, или как я могу изменить системные настройки, чтобы избежать этого?
Комментарии:
1. Почему вы вызываете setlocale() в первую очередь? UTF-8 широко используется в качестве кодировки по умолчанию для всех строк в Linux.
Ответ №1:
Дело в том, что преобразование из байтовых строк в wchar_t
строки должно зависеть от языкового стандарта. Это связано mbstowcs
с тем, что функция должна знать кодировку символов ввода строки байтов и обычно использует языковой стандарт, чтобы помочь ей угадать.
например, если ваши входные байты:
C3 B6
Затем, если интерпретируется как UTF-8, это строка ö
, которая является wchar_t
последовательностью
00F6
Но если интерпретируется как iso-8859-1, это строка ö
, которая является wchar_t
последовательностью
00C3 00B6
Теперь некоторые последовательности байтов недопустимы для определенных кодировок, что, вероятно, объясняет ваши бриллианты с ошибками в юникоде. Если вы не хотите возиться с языковым стандартом, вы могли бы iconv
вместо этого использовать библиотеку. wchar_t
Тип обычно соответствует одной из кодировок UTF-32 (LE или BE), но я не уверен, насколько переносимым это будет.
Комментарии:
1. Полезно, если вы выполняете анализ текста / символов. например, обнаружение пробелов, букв, цифр и т. Д.