ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
13 июля
455234 Топик полностью
fk0, легенда (18.10.2013 14:45 - 14:48, просмотров: 111) ответил VVB на Поддержка русских символов в приложении.
Этот ваш линукс ваще жалкая паделка, красноглазие, красноглазие!!!11 Профессионалы используют CP1251 в программе. Эти ваши консоли -- технологии 70-х годов для дедов не осиливших GUI! И вообще текстовые протоколы -- для новичков и ламиров. Бинарные протоколы лучше, быстрей и надёжнее. У меня такой подход. В libc поддержки ничего обычно нет или не используется. Почему. libc в комплекте компилятора либо просто может не поддерживает, либо может и поддерживает, но потянет за собой столько... для нормальной поддержки локалей, например, ей потребуется файловая система и куча специальных файлов в ней. Есть свои файлы wchar.h и wctype.h с нужными определениями. Тип wchar_t определён как char. В качестве представления кода символа в wchar_t используется ISO8859-5. Этого достаточно для русского, украинского и беларусского языка. Большинство wstrxxx функций через define заменяются на соответствующие strxxx функции, с wsprint и printf, и другими wxxx функциями, с функциями с wctype.h -- аналогично. Написаны собственные следующие функции: wcstok, mbtowc, mbslen, wctomb, mbstowcs, wcstombs. Возможно, здесь чего-то присутствующего в библиотеке нет, т.к. я не всё использую. Но это легко дописать. Корень всего в функциях декодирования utf8->iso8859-5 и функции обратного кодирования (wctomb), собственных. Кодирование и декодирование сложностью не отличается. Нужно лишь получить unicode код и отнять 0x360, если код больше чем 0x80. Для кодирования наоборот. Декодирующая функция, естесственно, может обрабатывать по символу (char) за раз, для чего хранит состояние, ссылка на которое ей передаётся каждый раз. И возвращает либо код символа в iso8859-5, либо признак ошибки или недостаточных данных. Что в итоге имеем. Программы использующие wide characters для русского языка могут компилироваться и работать, почти. Почти, потому, что: не поддерживается %ls и %lc в printf, не поддерживается L"текст". И из мелочей: не совсем правильная сортировка для русской локали и всякие там ньюаансы с десятичными точками. На мелочи проще и часто лучше плюнуть. А что касается %ls и L"текст" -- первое так или иначе придётся исключить из программы, везде свести к %s и ручному wcstombs там, где необходимо. Либо оставить %ls в случае, если известно, что выводимый текст -- точно ASCII. А L"текст" заменяется на специальный макрос типа WSTR("текст"). В макросе подстановка вызова функции, которая выделяет память и перекодирует строку из utf8 в iso8859-5 в рантайме. Не честный метод конечно, а что поделать. Единственное что: нельзя использовать более одного WSTR("текст") в аргументах функции (в частности, printf). Потому, что хитрый макрос перед перекодированием высвобождает память из предыдущей строки. Впрочем, если нужно, можно "кэш" сделать на десяток строк -- этого хватит почти всегда. Вот и всё. Имеем программу (текст на C) в utf8, ввод-вывод в utf8 (здесь тоже кроется маленький обман: ввод некоторых цифр, закодированных с кодами >= 0x80, работать не будет, но это ж такая экзотика), во внутреннем представлении можно использовать iso8859-5 -- это нужно, в основном, когда нужна именно посимвольная обработка данных (а не побайтовая в utf-8), т.е. когда строку нужно разорвать, например (в utf8 так просто нельзя), когда распечатать строго заданной ширины по формату (для utf8 printf распечатает заданное число байт, а не символов и это по стандарту так). И основные все wxxxx функции работают. Эту же программу можно без изменений (с доопределением #define WSTR(x) L##x) можно компилировать на PC и она будет корректно работать. PS: да, ещё на PC могут быть трюки с переключениями локалей на лету и разным вводом-выводом из-за чего. Здесь это не возможно, локаль всегда одна -- en_US.UTF-8 фактически.
[ZX]