Поиск:

Ответ в темуСоздание новой темы Создание опроса
> UNICODE текст в Edit-боксах 
:(
    Опции темы
alya
Дата 2.11.2007, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 19.9.2007

Репутация: нет
Всего: нет



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

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

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

Спасибо за внимание.
PM MAIL   Вверх
Andrey44
Дата 2.11.2007, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 12
Всего: 26



CString smile 


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
alya
Дата 2.11.2007, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 19.9.2007

Репутация: нет
Всего: нет



Andrey44, это вы ответили на вопрос, какого типа переменную привязывать к Edit-боксу?
Привязываю. Вычитываю текст из контрола. И выходит что я получила набор символов ASCII, а мне нужно получить набор символов по кодовой странице 1251.
Я поняла, что получила не то, что надо, таким образом: посмотрела код символа 'Я', он равен -33. Это неверно. В кодовой таблице CP1251 он равен 223, а по кодовой таблице Unicode ее номер 1073.
PM MAIL   Вверх
Andrey44
Дата 2.11.2007, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 12
Всего: 26



alya, покажите пожалуйста код , как вы считываете и как потом смотрите что у вас в переменной


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
alya
Дата 2.11.2007, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 19.9.2007

Репутация: нет
Всего: нет



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

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

в отладчике вижу, что с = -33 для буквы Я, c = 70 для буквы F
PM MAIL   Вверх
Andrey44
Дата 2.11.2007, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 12
Всего: 26



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

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

Это сообщение отредактировал(а) Andrey44 - 2.11.2007, 18:39


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
alya
Дата 2.11.2007, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 19.9.2007

Репутация: нет
Всего: нет



Цитата

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

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

Цитата

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

спасибо, узнала
PM MAIL   Вверх
zkv
Дата 2.11.2007, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 16
Всего: 92



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

Это сообщение отредактировал(а) zkv - 3.11.2007, 13:24
PM MAIL   Вверх
Andrey44
Дата 2.11.2007, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 12
Всего: 26



Ну так в m_str у вас и есть все данные


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
alya
Дата 2.11.2007, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 19.9.2007

Репутация: нет
Всего: нет



zkv, спасибо...



Andrey44, да, есть, но они же в АСКИ...
PM MAIL   Вверх
zkv
Дата 2.11.2007, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 16
Всего: 92



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

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

подробнее тут

Это сообщение отредактировал(а) zkv - 2.11.2007, 19:00
PM MAIL   Вверх
Rapalex
Дата 3.11.2007, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 732
Регистрация: 20.1.2006
Где: Украина -> Ник олаев

Репутация: 6
Всего: 8



Цитата(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.
Так что если надо то можно.


Это сообщение отредактировал(а) Rapalex - 3.11.2007, 11:54


--------------------
In vitium ducit culpae fuga.
Желание избежать ошибки вовлекает в другую.
(Horatius)
PM ICQ   Вверх
zkv
Дата 3.11.2007, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 16
Всего: 92



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

alya, извини за дезинформацию smile
PM MAIL   Вверх
alya
Дата 5.11.2007, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 19.9.2007

Репутация: нет
Всего: нет



Rapalex, спасибо! я единственное только заменила 
Код

    int iLength = m_edit.GetWindowTextLength();

на 
Код

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

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


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


Ребята! Большое спасибо за помощь!!!
PM MAIL   Вверх
Rapalex
Дата 5.11.2007, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 732
Регистрация: 20.1.2006
Где: Украина -> Ник олаев

Репутация: 6
Всего: 8



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

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

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




--------------------
In vitium ducit culpae fuga.
Желание избежать ошибки вовлекает в другую.
(Horatius)
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.1036 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.