Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Qt+ 1Cv7.7, проблема с кодировкой 
V
    Опции темы
sergey_85
Дата 5.10.2011, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 17.4.2007
Где: Россия, Челябинск

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



Привет!

Вот такая вот проблема с 1С в связке с Qt. Никак не хочет понимать русские названия справочников.

Код

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF8")); 
QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251")); 


Код

QAxObject *act = new QAxObject("V77.Application");

act->dynamicCall("Initialize(const QVariant&, const QVariant&, const QVariant&)", act->dynamicCall("RMTrade"), "/D C:\\1xcprices\\1SBBDB", "no_splash_show").toBool();

QAxObject *obj = act->querySubObject("CreateObject(const QString&)", "Справочник.Сотрудники"); 



Вот что вылазит пр ивызове этого метода
Код

QAxBase: Error calling IDispatch member CreateObject: Exception thrown by server
             Code       : 2
             Source     : 1?:???????????
             Description: ????????? ??????? ???????? ??????? (??????????.??????????): 0   
             Help       : 
         Connect to the exception(int,QString,QString,QString) signal to catch this exception



--------------------
A good design always pays off.
PM MAIL   Вверх
_GRIN_
Дата 6.10.2011, 10:49 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


одинокий падаван
**


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

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



sergey_85, я не до конца понял - в какой кодировке набран твой исходник.
Код

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF8")); 
QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251")); 

Если в кодировке cp1251 (Windows-1251) - то из "Справочник.Сотрудники" (как const char* - т.е. си-строки) ты получишь нечитаемый текст.
Тогда тебе надо поправить 
Код

QAxObject *obj = act->querySubObject("CreateObject(const QString&)", tr("Справочник.Сотрудники"));


Если в кодировке utf-8 - то вроде всё должно нормально работать.
В любом случае лучше попробуй следующий вариант:
Код

QAxObject *obj = act->querySubObject("CreateObject(const QString&)", QString::fromLocal8Bit("Справочник.Сотрудники"));


Пальцем небо конечно =).


--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
bsa
Дата 10.10.2011, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



еще можно попробовать так:
Код
QAxObject *obj = act->querySubObject(QString::fromUtf8("CreateObject(\"%1\")").arg(QString::fromUtf8("Справочник.Сотрудники")));
Если кодировка исходника не Utf8 (в Creator'е по умолчанию используется System, а она в винде cp1251), то необходимо заменить fromUtf8 на fromLocal8Bit.
PM   Вверх
sergey_85
Дата 10.10.2011, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 17.4.2007
Где: Россия, Челябинск

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



у меня 

Код

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF8")); 
QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251"));


Код

кодировка файлов исходников - ANSI


здесь не может преобразовать:
Код

QAxObject *obj = act->querySubObject(QString::fromLocal8Bit("CreateObject(\"Справочник.Контрагенты\")")); 


вот, что выдает:
Код

Error    1    error C2664: 'QAxObject *QAxBase::querySubObject(const char *,const QVariant &,const QVariant &,const QVariant &,const QVariant &,const QVariant &,const QVariant &,const QVariant &,const QVariant &)' : cannot convert parameter 1 from 'QString' to 'const char *'    c:\QtProjects\TDSMPrice\TDSMPrice\TDSM1CSync\tdsm1csync.cpp    23


*вызов методов .toAscii().data() выдает это:
Код

QAxBase: Error calling IDispatch member CreateObject: Exception thrown by server
             Code       : 2
             Source     : 1?:???????????
             Description: ????????? ??????? ???????? ??????? (????N??°????N???????.??????N?N??°???µ??N?N?): 0   
             Help       : 
         Connect to the exception(int,QString,QString,QString) signal to catch this exception



а вот это работает:
Код

QAxObject *obj = act->querySubObject("CreateObject(const QString&)", QObject::tr("Справочник.Сотрудники"));



Это сообщение отредактировал(а) sergey_85 - 10.10.2011, 19:15


--------------------
A good design always pays off.
PM MAIL   Вверх
math64
Дата 10.10.2011, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Почему разные кодеки для tr() и CStrings - по-моему, это бессьысленно. Твой исходик либо в 1251, либо в utf.
Определись, какая кодировка нужна 1С и конвертируй в неё - можешь для эксперимента, записать строку "Справочник.Контрагенты"
в текстовый файл в разных кодировках и загружать как массив байт, определи какая кодировка требуется, и потом можешь встроить эту строку в код, используя нужный кодек.
PM   Вверх
sergey_85
Дата 10.10.2011, 20:27 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 17.4.2007
Где: Россия, Челябинск

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



для 1С требуется кодировка win-1251


--------------------
A good design always pays off.
PM MAIL   Вверх
math64
Дата 10.10.2011, 20:44 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Тогда устанавливай оба кодека в 1251, все исходники в 1251, и можешь не пользоваться tr() - в тех случаях, когда строка не требует перевода. tr() используется, когда строка может или будет переводиться Лингвистом.
PM   Вверх
sergey_85
Дата 10.10.2011, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 17.4.2007
Где: Россия, Челябинск

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



победил, работает!!!

особое внимание на передачу параметров в CreateObject и вызов методов типа ВыбратьЭлементы()

Код

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF8")); 
QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251")); 


исходный код в win-1251

Код

    QAxObject *act = new QAxObject("V77.Application");
    if(act)
    {
        if(act->dynamicCall("Initialize(const QVariant&, const QVariant&, const QVariant&)", act->dynamicCall("RMTrade"), "/D C:\\1xcprices\\1SBBDB", "").toBool()) //no_splash_show
        {        
            //так и не работает...
            //QAxObject *obj = act->querySubObject(QObject::tr("CreateObject(Справочник.Контрагенты)").toLocal8Bit()); 
            
            QAxObject *obj = act->querySubObject("CreateObject(const QString&)", QObject::tr("Справочник.Контрагенты"));
            if(obj)
            {
                if(obj->dynamicCall("ВыбратьЭлементы()").toBool())
                {    
                    while(obj->dynamicCall("ПолучитьЭлемент()").toBool())
                    {
                        qDebug() << obj->dynamicCall("ПолнНаименование").toString();
                    }
                }
            }
        }
    }


Спс за помощь!

Это сообщение отредактировал(а) sergey_85 - 10.10.2011, 21:49


--------------------
A good design always pays off.
PM MAIL   Вверх
bsa
Дата 11.10.2011, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Вместо этого:
Цитата(sergey_85 @  10.10.2011,  22:43 Найти цитируемый пост)
QAxObject *obj = act->querySubObject("CreateObject(const QString&)", QObject::tr("Справочник.Контрагенты"));
Попробуй:
Код
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));
//...
QAxObject *obj = act->querySubObject("CreateObject(const QString&)", QString::fromAscii("Справочник.Контрагенты"));


tr() используй ТОЛЬКО ДЛЯ ТЕКСТА, КОТОРЫЙ СЛЕДУЕТ ПЕРЕВОДИТЬ ПРИ ЛОКАЛИЗАЦИИ ПРИЛОЖЕНИЯ.
PM   Вверх
sergey_85
Дата 11.10.2011, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 17.4.2007
Где: Россия, Челябинск

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



а если мне нужно, чтобы было так
Код

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF8"));


чем заменить вызов?
Код

QAxObject *obj = act->querySubObject("CreateObject(const QString&)", QString::fromAscii("Справочник.Контрагенты"));



конструкции типа этой не работают =(
Код

QAxObject *obj = act->querySubObject("CreateObject(const QString&)", QString(QTextCodec::codecForName("Windows-1251")->fromUnicode("Справочник.Контрагенты").data()));



Это сообщение отредактировал(а) sergey_85 - 11.10.2011, 22:02


--------------------
A good design always pays off.
PM MAIL   Вверх
math64
Дата 12.10.2011, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(sergey_85 @  11.10.2011,  21:48 Найти цитируемый пост)
а если мне нужно, чтобы было так
Код

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF8"));

Поясни зачем - у тебя, что исходники то в UTF8, то в 1251? Лучше привести к одной кодировке, в данном случае - 1251.
Если нужно один раз перекодировать из UTF8,
Код

QTextCodec utf8= QTextCodec::codecForName("UTF8");
const char* utf8string;
QString unicode = utf8->toUnicode(ut8string);


Добавлено через 7 минут и 51 секунду
Цитата(sergey_85 @  11.10.2011,  21:48 Найти цитируемый пост)
конструкции типа этой не работают =(
Код

QAxObject *obj = act->querySubObject("CreateObject(const QString&)", QString(QTextCodec::codecForName("Windows-1251")->fromUnicode("Справочник.Контрагенты").data()));

Потому что ты неправильно используешь codec->fromUnicode()
Аргументом для неё должна быть QString (у неё всегда кодировка Unicode), а у тебя char*.
Неявно вызывается конструктор QString. А у тебя для такого конструктора указана кодировка UTF8 - непонятно зачем, если исходники в 1251 ?

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




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


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

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