Ламерский вопрос - MBCS или UNICODE в VC++ 7.0

Все, что вы хотели знать о программизме, но боялись спросить.
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

А что там использовано?
Там ANSI. Складываем, копируем, перемещаем, сравниваем строки. Вообщем сплошной тетрис. Это в одих модулях.
В других модулях - объекты доступа к данным RDBMS с суррогатным COM-подобным интерфейсом.
Woozy
Завсегдатай
Сообщения: 278
Зарегистрирован: 03 мар 2003, 08:55
Откуда: RU->BC->ON->FI -> Chicago, IL -> Seattle, WA

Сообщение Woozy »

vg писал(а):
А что там использовано?
Там ANSI.
ANSI C? Для тех строк есть и мультибайтовые, и "широкие" аналоги. Контекстная замена. Ещё все строчные константы передекларировать прицепив L. Ещё все типы - в широкие - по контексту. char -> wchar_t и т.п. Ещё UNICODE. Ещё буферы под строки правильно выделять. Если такая проблема вообще стоит, кто знает может там sizeof от символа задействован.
Последний раз редактировалось Woozy 20 апр 2004, 18:15, всего редактировалось 1 раз.
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

ANSI C? Для тех строк есть и мультибайтовые, и "широкие" аналоги. Контекстная замена. Ещё все строчные константы передекларировать прицепив L. Ещё все типы - в широкие - по контексту. char -> wchar_t и т.п. Ещё UNICODE.
Ты думаешь, а чем я сразу занялся :?: :lol: Ручками, ручками ... Контекстная - замена? Смеёшься? Этож не МСВорд. :lol:
Короче, переделал всё в UNICODE:lol:Переделал, наверное, наспех. Не работает.
Конечно, в перспективе, если эти проекты понядобятся для реальной работы - надо быдет всё переписывать в UNICODE и не заморачиваться. Хотел, как быстрее. А вышло, как всегда :lol:
Woozy
Завсегдатай
Сообщения: 278
Зарегистрирован: 03 мар 2003, 08:55
Откуда: RU->BC->ON->FI -> Chicago, IL -> Seattle, WA

Сообщение Woozy »

vg писал(а):Контекстная - замена? Смеёшься?
А что?
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

Ну представь, как ты будешь менять по контекстной замене
char * s = "asd";
на
LPTSTR s = _TEXT("asd");

Этож не char на TCHAR заменить. А функции? Там же всё надо менять (хотя здесь можно и по контекстному поиску и замене, конечно). В общем гимору - будь здоров.
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

Ещё буферы под строки правильно выделять
А вот увидел, ты подредактировался.... Во - во. :lol:
Woozy
Завсегдатай
Сообщения: 278
Зарегистрирован: 03 мар 2003, 08:55
Откуда: RU->BC->ON->FI -> Chicago, IL -> Seattle, WA

Сообщение Woozy »

Одним словом - невиликая проблема. И декларации, и вызовы функций заменяются контекстной заменой. Потом запустил компиляцию и пошёл по оставшимся ошибкам добивать.

Многократно подобными и более гадкими преобразованиями занимался. Не вижу непреодолимых и даже существенных препятствий.
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

Одним словом - невиликая проблема. И декларации, и вызовы функций заменяются контекстной заменой. Потом запустил компиляцию и пошёл по оставшимся ошибкам добивать.

Многократно подобными и более гадкими преобразованиями занимался. Не вижу непреодолимых и даже существенных препятствий.
Дык это два дня работы в поту (с отладкой и мини тестированием в разных позах) :lol: Ни фига себе, ничего страшного. Если б ещё бабки б платили :lol:

Ладно, ОК! Переделаем, при случае. :lol:
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

Woozy, ты прям как Vovka. :lol: У него девиз - любишь кататься - люби и катайся. :lol:
Аватара пользователя
ajkj3em
Маньяк
Сообщения: 2063
Зарегистрирован: 12 ноя 2006, 06:53

Сообщение ajkj3em »

vg писал(а):W95/98/me имеют MSLU. :?:
98 и ME - имеют, в 95 надо доставлять
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

Platform SDK: Windows 9x Programming

Windows 95/98/Me General Limitations
Certain functions and classes of functions, such as for security and event logging, are not supported by Windows 95/98/Me. Windows 95/98/Me provides stub routines for these unsupported functions so that applications designed for other operating systems can run on Windows 95/98/Me without errors.

The extended error codes returned by the GetLastError function are not guaranteed to be the same in Windows 95/98/Me and Windows NT/Windows 2000. This difference applies to extended error codes generated by calls to window management, GDI, and system services functions. For example, the ActivateKeyboardLayout, GetKeyboardLayoutName, and UnloadKeyboardLayout functions do not support extended error code values; that is, you cannot retrieve errors for these functions by using the GetLastError function.

By design, functions that take string parameters can handle either Unicode (wide character) or ANSI strings. However, Windows 95/98/Me does not implement the Unicode (or wide character) version of most functions. With few exceptions, these functions are implemented as stubs that simply return an error value. However, Windows 95/98/Me does provide Unicode implementations of the following functions.

EnumResourceLanguages
EnumResourceNames
EnumResourceTypes
ExtTextOut
FindResource
FindResourceEx
GetCharWidth
GetCommandLine
GetTextExtentPoint
GetTextExtentPoint32
lstrcat (Windows 98/Me)
lstrcpy(Windows 98/Me)
lstrlen
MessageBox
MessageBoxEx
TextOut

...
Хорошо, хоть это есть

In addition, Windows 95/98/Me implements the MultiByteToWideChar and WideCharToMultiByte functions for converting strings to and from Unicode.
Аватара пользователя
Lepsik
Житель
Сообщения: 522
Зарегистрирован: 17 фев 2003, 18:34
Откуда: Berlin
Контактная информация:

Сообщение Lepsik »

однозначно надо делать в юникоде. Вот у нас был мултибайт, а у японцев такой веселый язык , что в строке символ может выражаться переменным количеством байтов. Значит половина строковых функций работает самым неожиданным способом.

Так что юникод и std:string это то что доктор прописал
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

Ok. :wink: Thanks, men.

Рад вашим ответам. Тогда ворос по-существу флейма (keep down) - можно ли обеспечить, ну .... как бы "автоматическое" представление, при вводе строк UNICODE в строковые константы. :lol: :lol: :lol: Предполагается, что мы используем в IDE VS 7.0, или BCB++6.0 (как минимум). :wink:
Ну, типа печатаем себе и печатаем поэтический C-код. Печатаем, например, _TEXT(" а не пойти бы тебе, vg, ....");
Но. :!: Keep down. Строка-то будет "широкой" (и к стати, вы знаете, что при определённых условиях будет компилироваться, как UNICODE? Точно говорю... :lol: ).
Да вот будет ли это строка UNICODE в общем случае? Типа компильнули и потешили своё менталити (не все присутствующие, конечно) грязными словами, порочащими мою драгоценную особу :?: Как думаете, увидите вы ругательство мене, или нет :?: :lol:

Для того, чтобы не быть скучным :( , вот фрагмент кода. Что будет напечатано в окне?

Код: Выделить всё

//---------------------------------------------------------------------------
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
…
	switch (message) {
	case WM_CREATE:
		WndProc_OnCreateToolBar(hWnd);
		break;
	case WM_PAINT:
		GetClientRect(Tb.m_hWndToolBar, &Rect);
		hdc = BeginPaint(hWnd, &ps);
			GetClientRect(hWnd,&Rect);
			DrawText (hdc, _T(" а не пойти бы тебе, vg, ....") , -1, &Rect,
			DT_SINGLELINE | DT_CENTER | DT_VCENTER); 
		EndPaint(hWnd, &ps);
		break;
…
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

Да, забыл. Ну, разумеется мы шо-то впечатали в директивы компиллера - или #define UNICODE,
или установили соответствующие опции для проекта (комбобоксик использовали в визарде):lol:
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

Ну, кто-нибудь может толком объяснить , почему и когда это может корректно работать и отображать русские символы без использования MultiByteToWideChar:
DrawText (hdc, _T(" а не пойти бы тебе, vg, ....") , -1, &Rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
Ответить