2017-01-16 5 views
1

Я просто возвращаюсь к программированию на C++, MFC, Unicode. За последние 20 лет менялось множество.Общие сведения о Multibyte/Unicode

Код на другом проекте составлен просто отлично, но были ошибки, когда я вставляю его в свой код. Он взял меня 1-1/2 дней потраченного времени, чтобы решить вызов функции ниже:

enter code here 
CString CFileOperation::ChangeFileName(CString sFileName) 
{ 
    char drive[MAX_PATH], dir[MAX_PATH], name[MAX_PATH], ext[MAX_PATH]; 
    _splitpath_s(sFileName, drive, dir, name, ext); //error 
    ------- other code 
} 

После прочтения справки, я изменил CString sFileName использовать бросок:

enter code here 
_splitpath_s((LPTCSTR)sFileName, drive, dir, name, ext); //error 

Это создало ошибка тоже. Итак, я использовал GetBuffer(), который действительно такой же, как и выше.

enter code here 
char* s = sFileName.GetBuffer(300); 
_splitpath_s(s, drive, dir, name, ext); //same error for the 3rd time 
sFileName.ReleaseBuffer(); 

В этот момент я был очень расстроен, но в конце концов понял, что мне нужно изменить CString к Ascii (я думаю, потому что я настроен как Unicode).

следовательно;

enter code here 
CT2A strAscii(sFileName); //convert CString to ascii, for splitpath() 

затем использовать strAscii.m_pz в функции _splitpath_s()

Это, наконец, работал. Итак, после всего этого, чтобы сделать историю короткой, мне нужна помощь сосредоточив внимание на: 1. Unicode против MULIT-Byte (вызовы библиотек) 2. Переменные для использования

Я готов купить еще одну книгу, пожалуйста, ВЫГОДНО , Кроме того, есть ли способ фильтровать мою помощь на VS2015, так что когда я нахожусь на переменной и нажимаю F1, она только дает мне помощь для Unicode и способы конвертировать старый код в Юникод или конвертировать Mylti-Byte в Unicode.

Надеюсь, это не смущает, но у меня есть кое-что догоняющее. Будьте терпеливы, если моя формулировка не идеальна.

Заранее спасибо.

+0

Пожалуйста, перечитайте http: //stackoverflow.com/tour ... Это для конкретных вопросов программирования, и любые рекомендации не соответствуют теме. В качестве побочного примечания: выбор другого языка (например, C#, поскольку вы используете VS уже) или, по крайней мере, более современная библиотека для C++ облегчит поиск помощи ... –

+0

_Lots изменились за последние 20 лет. _ .. yup, более эзотерические способы переполнения буфера :) – txtechhelp

+0

Начать здесь: http://www.unicode.org/standard/principles.html Обратите внимание на «кодовые точки» и способы кодирования UTF-X в многобайтовые. – Ripi2

ответ

3

documentation of _splitpath содержит список Unicode (wchar_t) версии _wsplitpath. Это тот, который вы должны использовать. Не конвертируйте в ASCII или Windows ANSI, которые, как правило, теряют информацию и не выдают допустимый путь, когда вы рекомбинируете фрагменты.

Современное программирование Windows основано на Unicode.

Проект Visual Studio C++ по умолчанию основан на Unicode, в частности он определяет макрокоманду UNICODE, которая влияет на объявления от <windows.h>.

+0

. Проект на основе Unicode также определяет символ препроцессора '_UNICODE', который управляет отображением общего текста в CRT. Ни символ UNICODE, ни символ '_UNICODE', однако, необходимы, если вы вызываете явные Unicode-версии вызовов функций (как вы рекомендуете в этом ответе). – IInspectable

+0

Ум, я не рекомендую в основном использовать '... W' формы функций API явно. Как я вижу, код становится намного читабельнее без них. Например. Я просто пишу 'MessageBox', а не' MessageBoxW'. Но я не знаком ни с какой префиксной формой '_wsplitpath'. Wrt. библиотека '_UNICODE' библиотеки времени выполнения, стоит отметить, что материал CRT отличается между [тремя кодировками] (https://msdn.microsoft.com/en-us/library/5z097dxa.aspx), а не только двумя как «» : для CRT есть также '_MBCS', если я правильно помню. Ошибка «_MBCS» и «_UNICODE» будет ошибкой. –

+0

Довольно непоследовательная рекомендация использовать '_wsplitpath' (по сравнению с' _tsplitpath'), но 'MessageBox' (по сравнению с' MessageBoxW'). Нет никакого разумного аргумента в пользу использования 'TCHAR' (это хорошо), но продолжайте использовать сопоставления общего текста для * только * вызовов Windows API. – IInspectable

0

Попробуйте использовать _tsplitpath_s и TCHAR.

Таким образом, окончательный код выглядит примерно так:

CString CFileOperation::ChangeFileName(CString sFileName) 
{ 
    TCHAR drive[MAX_PATH], dir[MAX_PATH], name[MAX_PATH], ext[MAX_PATH]; 
    _tsplitpath_s(sFileName, drive, dir, name, ext); //error 
    ------- other code 
} 

Это позволит C++ компилятор использовать правильную ширину символа во время сборки в зависимости от настроек проекта

+1

Макросов совместимости с Windows 9x прошло 20 лет после даты «использования до». По-моему, хуже, чем бессмысленно пытаться поддерживать версию Windows, которую не может выполнить ваш компилятор генерировать исполняемый файл для. –

1

Все поддерживаемые версии Windows, использующих Unicode внутренне повсюду, и ваша заявка тоже должна. Windows использует кодировку UTF-16.

Для того, чтобы ваше приложение поддерживает Юникод вам необходимо выполнить следующие шаги:

  • Выставьте вашего проекта Character Set к «Использование Unicode Character Set» (если он в настоящее время установлено в «Использование Multi- Байт-набор символов "). Это не является строго обязательным, но оно касается тех случаев, когда вы явно не используете версию Unicode.
  • Используйте wchar_t (вместо char или TCHAR) для ваших строк.
  • Использовать широкие символы символов (L"..." вместо "...").
  • Используйте CStringW (вместо CStringA или CString) в проекте MFC.
  • Явным образом вызывать Unicode версию CRT (например, wcslen вместо strlen или _tcslen).
  • Явно призываю версию Unicode любого вызова Windows API, где она существует (например, CreateWindowExW вместо CreateWindowExA или CreateWindowEx).
+0

Добавление этих суффиксов 'W' просто делает код менее читаемым. Это похоже на [венгерскую нотацию] Microsoft (https://en.wikipedia.org/wiki/Hungarian_notation#Disadvanta GES). Просто ненужная, негативная ценность. Так что это плохой совет. Остальное в основном хорошее. :) –

+0

@ Cheersandhth.-Alf: Те, кто слепо критикует венгерскую нотацию, обычно не поняли ее. Я предлагаю вам загрузить и посмотреть исходный код для [Microsoft Word 1.1a] (http://www.computerhistory.org/atchm/microsoft-word-for-windows-1-1-source-code/) , Кроме того, из вашей (уместной) ссылки: * «Большинство аргументов против венгерской нотации относятся к * Системным * Венгерским обозначениям, а не к * Приложениям * Венгерская нотация. * * – IInspectable

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