Каков самый простой способ преобразовать char [] в / из tchar [] в C / C ++ (ms)?

Это кажется довольно интересным вопросом для софтбола, но мне всегда трудно найти эту функцию, потому что, похоже, существует очень много вариантов относительно ссылок на char и tchar.


person CrashCodes    schedule 01.10.2008    source источник


Ответы (8)


MultiByteToWideChar, но также см. "Несколько ошибок MultiByteToWideChar".

person jeffm    schedule 01.10.2008
comment
Что произойдет, если TCHAR будет CHAR? - person Martin York; 02.10.2008
comment
Я прочитал вопрос как оговаривающий, что преобразование необходимо, но я принял это к сведению. - person jeffm; 02.10.2008

Самый простой способ - использовать макросы преобразования:

  • CW2A
  • CA2W
  • и т.д...

MSDN

person RichS    schedule 01.10.2008
comment
мы не должны использовать эти преобразования, потому что, если мы вызовем их в рекурсии, это не освободит память - person Vinay; 18.11.2008
comment
@Vinay Создайте вспомогательную функцию, которая вызывает одну из них, а затем копирует результат в кучу или в другой буфер. После возврата из вспомогательной функции память стека освобождается. - person bdonlan; 03.08.2009

TCHAR - это специфичный для Microsoft typedef для char или wchar_t (широкий символ).

Преобразование в char зависит от того, что это на самом деле. Если TCHAR на самом деле является char, вы можете выполнить простое приведение, но если это действительно wchar_t, вам понадобится процедура для преобразования между наборами символов. См. Функцию MultiByteToWideChar ()

person Chris Johnson    schedule 01.10.2008
comment
Вы подняли отличный вопрос. Хотя в этой конкретной ситуации я думаю, что TChar является широким символом, мне нужно будет выполнить преобразование, только если это не так. что я должен как-то проверить. - person CrashCodes; 02.10.2008

В этом посте также есть несколько ответов, особенно если вы ищете кроссплатформенное решение:

Преобразование UTF8 в / из широких символов в STL

person Mark Ransom    schedule 01.10.2008
comment
Как это может быть кросс-платформенный, нет другого программного обеспечения TCHAR. Его окна специфические. - person Martin York; 02.10.2008

Хотя в этой конкретной ситуации я думаю, что TChar является широким символом, мне нужно будет выполнить преобразование, только если это не так. что я должен как-то проверить.

if (sizeof(TCHAR) != sizeof(wchar_t))
{  .... }

Самое интересное в том, что оба размера равных являются константами, что означает, что компилятор будет обрабатывать (и удалять) if (), и, если они равны, удаляет все внутри фигурных скобок.

person James Curran    schedule 01.10.2008

Вот код CPP, который дублирует _TCHAR * argv [] в char * argn [].

http://www.wincli.com/?p=72

Если вы адаптируете старый код для Windows, простое использование, указанное в коде, является необязательным.

person Dmitry Obukhov    schedule 27.10.2010
comment
битая ссылка (поэтому лучше процитировать образец :) - person Fernando Gonzalez Sanchez; 03.11.2016

Вы можете поставить условие в свой код

ifdef _UNICODE

{// ДЕЛАТЬ, КАК TCHAR ЕСТЬ ШИРОКИЙ СИМВОЛ} ИНАЧЕ {// НРАВИТСЯ, ЧТО TCHAR ЕСТЬ СИМВОЛ}

person chandan    schedule 31.05.2016

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

Сейчас это делается с помощью макроса TEXT. Пример для FindFirstFile на msdn указывает на это. http://msdn.microsoft.com/en-us/library/windows/desktop/aa364418%28v=vs.85%29.aspx.

person John    schedule 26.01.2012