У меня есть что-то вроде утомительного от 6 месяцев до года впереди меня. Я работаю над программой с более чем миллионом строк кода (большая часть написана в начале/середине 90-х), и было решено, что теперь она должна поддерживать сборку UNICODE. Я исследовал и нашел много лучших практик:
- используя версию _t многих методов Microsoft и C++, таких как _stprintf_s() вместо sprintf_s() или _tcsstr() вместо strstr(),
- обертывание всех закодированных строк, которые должны быть TCHAR*, например, _T("string") или _T('c'),
- замена большинства char* на LPTSTR и большинства const char* на LPCTSTR и char на TCHAR с использованием CA2T() и CT2A() для преобразования между char* и LPTSTR, если это необходимо,
Мне было интересно, написал ли кто-нибудь сценарий, способный автоматически вносить многие из этих изменений, поскольку они могут сэкономить мне МЕСЯЦЫ работы.
_t
и сразу перейти кwchar_t
._t
и_T
были разработаны как (временная) помощь около 15 лет назад. - person Bo Persson   schedule 14.06.2012wchar_t
строках используютсяL"..."
литералы. - person dan04   schedule 15.06.2012_T("")
сопоставляется сL""
, когда определено_UNICODE
. Единственная причина для использованияTCHAR
и связанных с ними функций вместоwchar_t
и связанных с ними функций заключается в том, что вам нужно создавать сборки ANSI и UNICODE из одного и того же исходного кода. Если вам нужно сохранить поддержку ANSI, используйтеTCHAR
и связанные с ним. Если вы собираетесь использовать только полный UNICODE, используйтеwchar_t
и связанные с ним. Вместо этого лучше использовать фреймворк Unicode, такой как ICONV или ICU, поскольку Unicode трудно понять правильно. Недостаточно просто изменить типы данных, иногда вам нужно изменить логику программы, чтобы учесть логические различия в том, как работают ANSI и UNICODE. - person Remy Lebeau   schedule 15.06.2012wchar_t*
имен файлов, пока пользователь StackOverflow не запросил это 3 месяца назад. - person dan04   schedule 15.06.2012char*
. Но в Windows библиотеке Indy с открытым исходным кодом (над которой я работаю) пришлось писать собственный набор функций, которые в основном являются копиями кода OpenSSL, но адаптированы для использования имен файлов на основеwchar_t*
для поддержки UTF-16. - person Remy Lebeau   schedule 16.06.2012char*
может работать с кодировками ISO/ANSI, поэтому OpenSSL с радостью поддерживает эти кодировки, поскольку он просто передает значенияchar*
как есть API-интерфейсам платформы, которые также принимают значенияchar*
. В Windows это исключает любую возможность поддержки UTF-16. Это то, что я пытался сделать. - person Remy Lebeau   schedule 17.06.2012