Проблемы с преобразованием в Юникод C

#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. Полезно, если вы выполняете анализ текста / символов. например, обнаружение пробелов, букв, цифр и т. Д.