| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Корректная обработка utf8 в *nix |
| Автор: leneCaress 9.3.2009, 03:22 |
| Добрый вечер. Только-только начала переползать на C++ в Linux. (Раньше писала на C++ много, но только под win). Не понятен один вопрос... Допустим локаль в системе может быть как UTF8, так а что-нибудь однобайтовое (например koi8r). Каким способом обрабатывать содержимое строк, получаемых из файлов, из stdin и пр. Под виндой было все просто. было либо массив char, либо wchar_t... Они были соответственно по 1 или 2 байта... А как быть под *nix?? Во первых хотелось бы не использовать какие-то библиотеки типа boost (хочу сначала научится без них). Во вторых - хотелось бы, чтобы программа работала кроме линукса, еще на bsd, а в идеале и в win. В третьих - хотелось бы хорошей производительности. В четвертых - удобства ТЕ вполне с удовольствием пользовалась бы чем-то вроде std::string, std::stringw. У меня закрадывается подозрение, что нужно просто считывать все данные в wchar_t[]... Но мыслей как это сделать по человечески - нету. Вообщем - "хочу пример" © P.S. гуглила. P.P.S. не уверена, что пишу в нужный раздел |
| Автор: SABROG 9.3.2009, 12:44 |
| Книга "Standard C++ Iostreams and Locales" |
| Автор: azesmcar 9.3.2009, 15:31 | ||||||
| Для начала почитайте тут, довольно много информации по этому поводу. http://forum.vingrad.ru/forum/topic-249965.html
если используете АПИ или что-то наподобие пишите макросы
в STL есть классы std::string для анси и std::wstring для юникода почитайте ссылку которую я прислал, если останутся вопросы - пишите здесь, обсудим |
| Автор: inside_pointer 10.3.2009, 01:31 | ||||
update: добавил пример |
| Автор: leneCaress 10.3.2009, 07:29 |
| о... интересно... значит я могу перевести любую строку в текущей локали в wchar_t с помощью mbsrtowcs, и обратно - в текущую локаль с помощью wcsrtombs.... здорово... но получается заморочка: pcre работает с utf8, но не wchar... ну вообщем если дойдет до регэкспов - придется наверное туда-сюда конвертить? спасибо за наводку |
| Автор: inside_pointer 10.3.2009, 09:44 | ||||
utf8 ? |
| Автор: azesmcar 10.3.2009, 11:33 | ||||||||||
не надо думать
обычно текстовые файлы в начале хранят BOM (Byte-order mark), в присланной мной теме есть ссылки на эту тему. Проверьте ваши файлы - чтобы не читать Byte-order mark как часть текста.
сковертируйте в std::wstring а там уже посмотрите функции стандартной библиотеки для работы с std::wstring.
Добавлено через 1 минуту и 49 секунд http://unicode.org/faq/utf_bom.html тут тоже много полезного |
| Автор: leneCaress 10.3.2009, 12:02 | ||
а по производительности оно как? если нужно много строк форматировать? (или сильно зависит от реализации?) знаю такого зверя =) кстати, с BOM сталкивалась только на файлах пришедших с win. Огромное спасибо!!! Осилила задачу =) |
| Автор: azesmcar 10.3.2009, 12:15 | ||
думаю если вас заботит разница в производительности между printf и std::cout то вы не тот язык программирования выбрали http://forum.vingrad.ru/forum/ASM-forum.html |