Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > UNICODE текст в Edit-боксах


Автор: alya 2.11.2007, 17:41
Люди, не ругайте меня пожалуйста! Разбиралась с вопросом, долго разбиралась, пришла к точной постоновке задачи и больше нет сил искать в нете... надо срочно. Ответьте, если знаете.

MFC-приложение, студия 2005. Character set проекта - Use Multi-Byte Character Set и должен быть такой.

Вопрос: возможно ли в таком проекте работать с Edit-боксом и вводить/выводить из него UNICODE текст? Какого типа переменную к нему привязать? (дальше я этот текст буду конвертить в UTF-8).

Спасибо за внимание.

Автор: Andrey44 2.11.2007, 18:01
CString smile 

Автор: alya 2.11.2007, 18:19
Andrey44, это вы ответили на вопрос, какого типа переменную привязывать к Edit-боксу?
Привязываю. Вычитываю текст из контрола. И выходит что я получила набор символов ASCII, а мне нужно получить набор символов по кодовой странице 1251.
Я поняла, что получила не то, что надо, таким образом: посмотрела код символа 'Я', он равен -33. Это неверно. В кодовой таблице CP1251 он равен 223, а по кодовой таблице Unicode ее номер 1073.

Автор: Andrey44 2.11.2007, 18:24
alya, покажите пожалуйста код , как вы считываете и как потом смотрите что у вас в переменной

Автор: alya 2.11.2007, 18:30
вот код, как я смотрела что значение в CString в кодовой странице АСКИ:
Код

CString m_str;                        // привязана к Edit-боксу
UpdateData(true);
char c = m_str.GetAt(0);

в отладчике вижу, что с = -33 для буквы Я, c = 70 для буквы F

Автор: Andrey44 2.11.2007, 18:37
Сделайте SetWindowText(m_str); smile 

Да кстати в юникоде надо использовать TCHAR вместо char

Автор: alya 2.11.2007, 18:42
Цитата

Сделайте SetWindowText(m_str);  

Мне надо вычитывать оттуда данные - это на первом месте.
А потом работать как с wchar.

Цитата

Да кстати в юникоде надо использовать TCHAR вместо char

спасибо, узнала

Автор: zkv 2.11.2007, 18:43
alya, боюсь нерешаема ваша проблема. Все упирается в подгружаемые библиотеки, можно подгрузить либо ту, либо иную версию (юникод/аски), работать одновременно не получится думаю. 
Но 100% не уверен, подождите, может кто-нибудь другое мнение имеет на этот счет.

Автор: Andrey44 2.11.2007, 18:44
Ну так в m_str у вас и есть все данные

Автор: alya 2.11.2007, 18:47
zkv, спасибо...



Andrey44, да, есть, но они же в АСКИ...

Автор: zkv 2.11.2007, 18:50
Цитата(Andrey44 @  2.11.2007,  18:37 Найти цитируемый пост)
Да кстати в юникоде надо использовать TCHAR вместо char

не совсем верно, правильно юзать WCHAR (так как проект MultiByte, то TCHAR будет транслироваться как char)

подробнее http://forum.vingrad.ru/faq/topic-173734.html

Автор: Rapalex 3.11.2007, 11:54
Цитата(zkv @  2.11.2007,  18:43 Найти цитируемый пост)
alya, боюсь нерешаема ваша проблема. Все упирается в подгружаемые библиотеки, можно подгрузить либо ту, либо иную версию (юникод/аски), работат одновременно не получится думаю. Но 100% не уверен, подождите, может кто-нибудь другое мнение имеет на этот счет.


Конечно имеет. Говориш "работат одновременно не получится", а я скажу если очень хочется то можно.

alya,  вот код собраный "без уникода" в мульти байте.
Код

    int iLength = m_edit.GetWindowTextLength();
    iLength++;

    CStringW str;
    int iResult = GetWindowTextW(m_edit.m_hWnd, str.GetBuffer(iLength), iLength);
    str.ReleaseBuffer();

    LPCWSTR sz = str.GetBuffer();
    WCHAR c = sz[0];

m_edit - переменная диалога асоцированая с эдитом.
Запускаю прогу в эдит ввожу одну букву "Я", и в дебагере вижу что "c" == 1071.
Так что если надо то можно.

Автор: zkv 3.11.2007, 13:40
Rapalex, я посмотрел насчет возможности привязки через DDX - не получилось, а GetWindowText и попробовать не догадался. 
Посмотрел, оба варианта (Unicode и MultiByte) в User32.Lib имеются, будем знать. 

alya, извини за дезинформацию smile

Автор: alya 5.11.2007, 11:21
Rapalex, спасибо! я единственное только заменила 
Код

    int iLength = m_edit.GetWindowTextLength();

на 
Код

int iLength = ::GetWindowTextLength(GetDlgItem(IDC_UNICODETEXT_EDIT)->m_hWnd);

и так же во втором случае и всё отлично работает!


zkv, я тоже пробовала связать с помощью механизма DDX, но вот странно... в прототипе функции DDX_Text есть тип для привязываемой переменной LPTSTR. Если им воспользоваться, то компилятор говорит ошибка.


Ребята! Большое спасибо за помощь!!!

Автор: Rapalex 5.11.2007, 11:37
Цитата(alya @  5.11.2007,  11:21 Найти цитируемый пост)
компилятор говорит ошибка.

Ну да просто ты собираеш не уникодовское приложение следовательно 
Цитата(alya @  5.11.2007,  11:21 Найти цитируемый пост)
 DDX_Text есть тип для привязываемой переменной LPTSTR

LPTSTR у тебя это массив CHAR а не WCHAR как тебе надо. Просто каркас написан так чтобы было удобно работать либо в уникоде либо без него.
А тебе понадобилось нестандартная работа, это можно просто не стандартными средствами.
Цитата(Rapalex @  3.11.2007,  11:54 Найти цитируемый пост)
Так что если надо то можно.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)