Заставить приложение Win32 работать на ANSI и UNICODE - PullRequest
6 голосов
/ 25 июня 2011

Я хочу, чтобы мое приложение Win32 C ++ могло воспроизводиться на любой версии кодирования (UNICODE & ANSI).Теперь я немного сбит с толку относительно того, в чем именно разница между двумя (или более?) Кодировками?

Чтобы совместимость моего приложения Win32 с перекрестной кодировкой означала ли это, что я должен пройти через мойзакодируйте и замените каждую std :: string на std :: wstring, затем замените каждый символ на wchar_t *, а затем замените каждую буквенную строку ("") на L ""?

Чтопроизойдет, если мое приложение будет запущено на компьютере с UNICODE, и в моем приложении будет одна строка std :: string?

Есть ли у вас какие-либо рекомендации относительно шагов, которые необходимо предпринять, чтобы сделать кросс-кодирование моего приложения?совместимы?Например: - Заменить все c_strings & strings на их UNICODE-эквивалент. - Заменить любые функции Win32 на uncide версию (например, изменить с getenv () на _wgetenv ())

Ответы [ 4 ]

6 голосов
/ 25 июня 2011

Что произойдет, если мое приложение будет запущено на компьютере с UNICODE и в моем приложении будет одна строка std :: string?

Компьютеры не ANSI или Unicode, а операционные системы, в которых работают компьютеры. Последней версией Windows, которая не поддерживала Unicode, была Windows 3.11 для рабочих групп. Если вы запускаете приложение, скомпилированное ASCII, на UniCode.

В чем разница между двумя (или более?) Кодировками?

Что такое ASCII?
ASCII - это семибитная методика кодирования, которая присваивает номер каждому из 128 символов, наиболее часто используемых в американском английском. Это позволяет большинству компьютеров записывать и отображать основной текст. ASCII не включает символы, часто используемые в других странах.

Что такое Unicode?
Одним из главных недостатков ASCII было то, что у вас могло быть только 256 разных символов. Однако такие языки, как японский и арабский, содержат тысячи символов. Таким образом, ASCII не будет работать в этих ситуациях. Результатом стал Unicode, который допускал до 65 536 различных символов.

Unicode - это попытка ISO и Консорциума Unicode разработать систему кодирования для электронного текста, которая включает каждый существующий письменный алфавит. Unicode использует 8-, 16- или 32-разрядные символы в зависимости от конкретного представления, поэтому для документов Unicode часто требуется вдвое больше дискового пространства, чем для документов ASCII или Latin-1. Первые 256 символов Unicode идентичны Latin-1.

В Win32 UNICODE поддерживается #, определяя макросы UNICODE и _UNICODE. Это, в свою очередь, заставляет вашу программу использовать Unicode-варианты функций Win32.

Есть ли у вас какие-либо рекомендации относительно шагов, которые необходимо предпринять, чтобы обеспечить совместимость кодировки моего приложения?

Каждая функция Win32 (которая принимает или возвращает строку) имеет два варианта: один для ASCII и один для Unicode. И вызов функции разрешается к одному из них в зависимости от того, определен макрос UNICODE или нет. Поэтому вы должны определить макрос и начать использовать Unicode-версии функций. например:

Замена каждого std::string на std::wstring,
Замена каждого char на wchar_t*
Замена каждого литерала string("") на L""
Использование поддержки TCHAR в Windows и т. Д.

как вы указали, это список вещей, о которых вам придется позаботиться, учтите, что это не полный список.

По сути, вам придется использовать все версии Unicode типов и вызовов функций в вашем коде.

3 голосов
/ 25 июня 2011

Когда вы компилируете программу для ANSI или Unicode, вы затрагиваете две вещи.

  1. Какой набор API вызывается. Предположим, ваш код звонит CreateFile(). Фактический вызываемый API - это либо CreateFileA(), либо CreateFileW() (ANSI или Wide (т.е. Unicode)), в зависимости от настроек компилятора. Внутренне NT Kernal использует Unicde для всех API. API-интерфейсы ANSI просто преобразуют свои строковые параметры в ANSI и вызывают API-интерфейсы Unicode. Многие API работают только с Unicode.
  2. Как раскрываются макросы T*. TCHAR в конечном итоге будет расширен до char в режиме ANSI, wchar_t в режиме Unicode.

Такие вещи, как std::string и std::wstring не будут затронуты, пока вам не нужно вызвать API и не передать им строку. Использование string против wstring должно определяться потребностями вашей программы, а не тем, является ли она скомпилированной ANSI или Unicode.

Вы можете использовать ATL для простого преобразования строк при необходимости.

// assume compiled for Unicode
#include <atlbase.h>

void myfunc() {
   USES_CONVERSION;

   std::string filename = "...";
   HANDLE hFile = CreateFile(A2W(filename.c_str()), ...

или, если хотите, вы можете использовать A2T(), и ваш код будет работать независимо от того, скомпилирован ли он для ANSI или Unicode.

3 голосов
/ 25 июня 2011

Последней версией Windows, которая не использовала Unicode для внутреннего пользования, была Windows ME. Рекомендация для нового кода - использовать исключительно Unicode. Некоторое преобразование может потребоваться, когда вам нужно читать и записывать файлы, закодированные с определенной кодовой страницей.

Вы на правильном пути со своими первоначальными мыслями. Если вы используете Microsoft CString, он поставляется в двух версиях CStringA и CStringW - вам нужно изменить одно определение компилятора, и он будет использовать CStringW в каждом месте, где вы указываете CString, и все будет работать. Вы должны использовать std :: wstring вместо std :: string. Добавьте к каждому строковому литералу префикс L"" или используйте макрос Microsoft _T(""), который преобразуется в одно и то же.

0 голосов
/ 25 июня 2011

Вы можете использовать TCHAR в вашем случае.

В UNICODE TCHAR - это WCHAR.В не UNICODE TCHAR - это CHAR.

Если вы хотите использовать std :: string, я рекомендую вам использовать следующее.

 #ifdef UNICODE
 #define std::tstring str::wstring
 #else
 #define std::tstring str::string
 #endif

и,

Use std:: tstring в вашей программе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...