Visual C и Unicode

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Аватара пользователя
Gelert
Сообщения: 61
Зарегистрирован: 27 янв 2005, 00:02
Контактная информация:

у меня хранится строка типа wchar_t (или TCHAR, CSTRINGT).
Мне нужно выводить эту строку в EditBox и ListBox - КАК ЭТО СДЕЛАТЬ?
Все стандартные функции имеют в качестве параметра только LPCSTR, и хранят символы ANSI. Рыскал в MSDN'e но там по теме вывода Unicode в эллементы управления диалогового окна ничего не сказано.
помогите.
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

ОС какая? Если NT/200x/XP, то поддержка Unicode там имеется для всех стандартных контролов. Тип строковых параметров для них не LPCSTR, а LPCTSTR, читай внимательнее. Чтобы использовать Unicode, добавь в свойствах проекта Preprocessor definitions два макроса: UNICODE, _UNICODE.

Если все-таки нужно конвертировать, см. WideCharToMultiByte.
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Можно даже текст не конвертировать и не не предопределять UNICODE, а напрямую вызывать юникодные функции, типа SetWindowTextW() или SetDlgItemTextW() и передавать им текст в формате юникода. Но это лучше в том случае, когда вся программа работает с текстом в формате ANSI, а только отдельные фрагменты программы используют текст UNICODE. А если основная часть программы использует UNICODE, то лучше его предопределить в параметрах компилятора.
Аватара пользователя
Gelert
Сообщения: 61
Зарегистрирован: 27 янв 2005, 00:02
Контактная информация:

Спасибо что откликнулись,
WinMain это вариант не подходит, потомучто у меня вся работа должна осществляться в Unicode, данные я беру из файла, а у всех этих функции в качестве параметра указатель на строку ANSI.
Eugie
#define UNICODE
вызывает ошибку.
И надо сделать совместимость с 9х/МЕ виндой.
Есть еще какие-нить варианты?
Аватара пользователя
Gelert
Сообщения: 61
Зарегистрирован: 27 янв 2005, 00:02
Контактная информация:

Я тут прочитал сои сообщения и сам ниче не понял :) )
Мне ниче конвертировать не надо..
мне просто нужен пример вывода строки типа wchar_t или CStringW или CStringT в (к примеру) в EditBox.
Вариант Eugie еще не пробовал.
Мужчина должен уметь делать все, кроме как рожать детей и трахаться в задницу.
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Если используешь MFC, можно сделать совсем просто:

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

  wchar_t ws[] = L"Какая-то Юникод-строка";
  CString str(ws);
  m_MyEdit.SetWindowText(str);
Подразумевается, что само приложение - не-UNICODE, т.е. макросы UNICODE и _UNICODE не определены. Класс CString внутри хранит данные как TCHAR, т.е. если определен _UNICODE - как wchat_t, иначе как char; у CString есть конструктор CString(LPWSTR), он и будет использован в данном случае.
Аватара пользователя
Gelert
Сообщения: 61
Зарегистрирован: 27 янв 2005, 00:02
Контактная информация:

Это конечно все хорошо,
а что есть мне надо из Edita считать. Я когда печатаю в Edit юникодовски символы - сразу появляются вопросительные знаки - шо с этим делть?
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

а что есть мне надо из Edita считать

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

  CString str; 
  m_MyEdit.GetWindowText(str); 
когда печатаю в Edit юникодовски символы - сразу появляются вопросительные знаки
Что, прям так сразу при вводе вопросы появляются?
Аватара пользователя
Gelert
Сообщения: 61
Зарегистрирован: 27 янв 2005, 00:02
Контактная информация:

в том то все и дело, когда вводишь символы сразу и появляются вопросительные знаки (к примеру румынский, французкий символы не из стандартного аолфавита). Как считывать или выводить обычную строку в Edit, я знаю.
Честно говоря проблема это довольно серьозная, тут у двух программеров уже мозги закипают в течении месяца. Бьемся и безтолку.
При объяввлении #define UNICODE выскакивают ошибки.
Аватара пользователя
Gelert
Сообщения: 61
Зарегистрирован: 27 янв 2005, 00:02
Контактная информация:

в общем народ - я допер! если кому интересно можете почитать:
делается все просто: в фалй stdafx.h пишется строка #define _UNICODE (может и в других файлах тоже можно... не пробовал, но скорее всгео да).
Эт оеще не все. теперь открываем Project properties
закладка Linker->advanced.
и в поле Entry Point пишем следующую строку: wWinMainCRTStartup.
после этого все работает, правда с нормальными строками, однобайтовыми, теперь трудно работать.
Ответить