ЛПЦСТР, ЧАР, Струнный - PullRequest
       8

ЛПЦСТР, ЧАР, Струнный

0 голосов
/ 16 марта 2010

Я использую следующие типы строк: LPCSTR, TCHAR, String Я хочу конвертировать:

  1. от TCHAR до LPCSTR
  2. из строки в символ

Я конвертирую из TCHAR в LPCSTR по этому коду:

RunPath = TEXT("C:\\1");
LPCSTR Path = (LPCSTR)RunPath;

Из строки в символ я конвертирую по этому коду:

SaveFileDialog^ saveFileDialog1 = gcnew SaveFileDialog;
saveFileDialog1->Title = "Сохранение файла-настроек";
saveFileDialog1->Filter = "bck files (*.bck)|*.bck";
saveFileDialog1->RestoreDirectory = true;
pin_ptr<const wchar_t> wch = TEXT("");
if ( saveFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK ) {  
    wch = PtrToStringChars(saveFileDialog1->FileName);
} else return;
ofstream os(wch, ios::binary);

Моя проблема в том, что когда я устанавливаю "Свойства конфигурации -> Общие Набор символов в «Использовать многобайтовый набор символов» первой части кода работает правильно. Но вторая часть кода возвращает ошибку C2440. Когда я устанавливаю «Свойства конфигурации -> Общие» Набор символов в «Use Unicode» второй части кода работает корректно. Но первая часть кода возвращает единственный первый символ из TCHAR в LPCSTR.

1 Ответ

1 голос
/ 16 марта 2010

Я бы посоветовал вам использовать Unicode на протяжении всего пути.

LPCSTR - это "Длинный указатель на строку типа C" . Обычно это не то, что вы хотите, когда имеете дело с методами .Net. Тип char в .Net имеет ширину 16 бит.

Вам также не следует использовать макрос TEXT ("") , если вы не планируете несколько сборок с использованием различных кодировок символов. Попробуйте вместо этого обернуть все свои строковые литералы макросом _W ("") и создать чистую юникодовую сборку.

Посмотрите, поможет ли это.

PS. std :: wstring очень удобен в вашем сценарии.

EDIT

Вы видите только один символ, потому что строка теперь является Unicode, но вы приводите ее как обычную строку. Многие или большинство символов Unicode в диапазоне ASCII имеют те же номера, что и в ASCII, но вторые из их 2 байтов установлены в ноль. Поэтому, когда строка Юникода читается как C-строка, вы видите только первый символ, потому что C-строки заканчиваются нулем (нулем). легкий (и неправильный) способ справиться с этим - использовать std: wstring для приведения в качестве std: string, а затем извлечь C-String из этого. Это небезопасный подход, потому что Unicode имеет гораздо большее пространство символов, чем ваша стандартная кодировка.

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