2015-03-01 4 views
-2

Я обычно нужно преобразовать CHAR или CHAR * к TCHAR или TCHAR *быстрый и элегантный способ для преобразования CHAR в TCHAR

CHAR chDecimal = 'A'; 
TCHAR Decimal = '\0'; 
int written = MultiByteToWideChar(CP_ACP, 0, &chDecimal, 1, &Decimal, 1); 
std::wcout << Decimal << endl; 
getchar(); 

Есть ли лучший и быстрый способ сделать это без использования ATL или других библиотек Microsoft? Спасибо.

+0

Вы пытались написать что-то быстрее? Вы его измеряли? –

+1

Для ЭТОГО ОЧЕНЬ СЛУЧАЙ, 'Decimal = chDecimal;' будет делать то, что вы хотите. Конечно, проблема возникает, если 'char chDecimal [] =" \ xc2 \ xb0 ";' - но тогда ваш код тоже не будет работать. –

+0

Почему, по-вашему, вам нужно преобразовать, потоки 'wchar_t' могут обрабатывать' char', тоже? Это также причина, по которой приведенный выше код верен, поскольку он пишет строку на основе 'TCHAR' в' std :: wcout', но мне интересно, не следует ли это вместо строки 'wchar_t'? Еще один совет: Избегайте 'TCHAR', если это возможно. Кроме того, избегайте простого 'CHAR', если это текст, который использует больше, чем просто базовый ASCII, вместо этого используйте' wchar_t' или 'WCHAR'. –

ответ

3

Код, представленный в этом вопросе,

CHAR chDecimal = 'A'; 
TCHAR Decimal = '\0'; 
int written = MultiByteToWideChar(CP_ACP, 0, &chDecimal, 1, &Decimal, 1); 

не преобразуется в TCHAR (которое зависит от того, определена UNICODE), как заявлено. Вместо этого он безоговорочно преобразуется в wchar_t. Кроме того, использование материала Microsoft T, поддерживающего Windows 9x и устаревшего уже в 2000 году с введением Layer для Unicode, является чрезвычайно сомнительной практикой для кода, не относящегося к устаревшему.

Преобразование одиночных точек кодирования в любом случае является очень сомнительной практикой. Он не подходит для любой схемы кодирования с более чем одним байтом на символ, например, японскими кодовыми страницами или UTF-8.

Если целью является преобразование только символов ASCII, то только скопируйте его, используя либо оператор присваивания копии C++ =, либо инициализацию. Не может быть проще.

Смежные вопросы