Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
_KUL
3 / 3 / 0
Регистрация: 14.05.2013
Сообщений: 28
1

Qt определение вывода ошибок в определенной кодировке (для русского текста)

24.07.2013, 04:02. Просмотров 2720. Ответов 5
Метки нет (Все метки)

Здравствуйте.
Имеются исходники в формате utf-8

C++
1
2
3
QAxObject * ax = new QAxObject("V82.COMConnector");
QAxObject * ac = ax->querySubObject("Connect(\"Srvr=\"172.0.0.100\";Ref=\"base1\";Usr=\"1C-Bot\";Pwd=\"56q\";\")");
QAxObject * ab = ac->querySubObject("NewObject",QObject::tr("Справочники.Контрагенты"));
При выполнении имеется сообщение об ошибке
C++
1
2
3
4
5
6
7
QAxBase: Error calling IDispatch member NewObject: Exception thrown by server
             Code       : 1001
             Source     : 1C:Enterprise 8.2.15.319
             Description: ??? ?? ????????? '???????????.???????????'
             Help       :
         Connect to the exception(int,QString,QString,QString) signal to catch t
his exception
Т.е. 1С сервер сообщает какую-то ошибку на русском языке.
Вопрос - как сделать вывод ошибок, чтобы отображались русские буквы? Я предполагаю что нужно с кодировкой "по играться", но как переопределить глобальный вывод ошибок? Может есть какой-то глобальный флаг?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.07.2013, 04:02
Ответы с готовыми решениями:

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

Запись в MySQL русского текста происходит в неверной кодировке
Добрый вечер. При добавление в MySQL базу Русского текста, текст становится вопросами...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Maxim Prishchepa
Эксперт С++
1929 / 1041 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
24.07.2013, 11:58 2
Вопрос - Ответ для новичков по Qt
0
_KUL
3 / 3 / 0
Регистрация: 14.05.2013
Сообщений: 28
24.07.2013, 13:53  [ТС] 3
В данном классе, в кьюте 5 уже нет этих функция (первым делом их пытался по мучить)

1 Эксперимент

Кодировка main.cpp ANSI (cp1251)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <QApplication>
#include <QWidget>
#include <oleidl.h>
#include <ActiveQt/QAxObject>
#include <QAxBase>
#include <iostream>
#include <QDebug>
#include <QTextCodec>
#include <QString>
 
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    ::OleInitialize(0);
    setlocale(LC_ALL, "Russian");
    std::cout << QTextCodec::codecForName("CP1251") << " если значение есть, значит кодировка есть\n";
    QTextCodec* codec = QTextCodec::codecForName("CP1251");
    QTextCodec::setCodecForLocale(codec);
    std::cout << "текст\n";
    qDebug() << "текст2";
    QAxObject * ax = new QAxObject("V82.COMConnector");
    QAxObject * ac = ax->querySubObject("Connect(\"Srvr=\"172.0.0.100\";Ref=\"base1\";Usr=\"1C-Bot\";Pwd=\"56q\";\")");
    QAxObject * ab = ac->querySubObject("NewObject",QObject::tr("Справочники"));
    std::cout << "text";
    return a.exec();
}
Результат
C++
1
2
3
4
5
6
7
8
9
10
11
0x1240e390 если значение есть, значит кодировка есть
текст
?????2
QAxBase: Error calling IDispatch member NewObject: Exception thrown by server
             Code       : 1001
             Source     : 1C:Enterprise 8.2.15.319
             Description: ??? ?? ????????? '???????????'
             Help       :
         Connect to the exception(int,QString,QString,QString) signal to catch t
his exception
text
2 Эксперимент
Кодировка main.cpp utf-8

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <QApplication>
#include <QWidget>
#include <oleidl.h>
#include <ActiveQt/QAxObject>
#include <QAxBase>
#include <iostream>
#include <QDebug>
#include <QTextCodec>
#include <QString>
 
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    ::OleInitialize(0);
    setlocale(LC_ALL, "Russian");
    //std::cout << QTextCodec::codecForName("UTF-8") << " если значение есть, значит кодировка есть\n";
    //QTextCodec* codec = QTextCodec::codecForName("UTF-8");
    //QTextCodec::setCodecForLocale(codec);
    std::cout << "текст\n";
    qDebug() << "текст2";
    QAxObject * ax = new QAxObject("V82.COMConnector");
    QAxObject * ac = ax->querySubObject("Connect(\"Srvr=\"172.0.0.100\";Ref=\"base1\";Usr=\"1C-Bot\";Pwd=\"56q\";\")");
    QAxObject * ab = ac->querySubObject("NewObject",QObject::tr("Справочники"));
    std::cout << "text";
    return a.exec();
Результат
C++
1
2
3
4
5
6
7
8
9
10
С'РчРєС?С'
текст2
QAxBase: Error calling IDispatch member NewObject: Exception thrown by server
             Code       : 1001
             Source     : 1C:Enterprise 8.2.15.319
             Description: ??? ?? ????????? '???????????'
             Help       :
         Connect to the exception(int,QString,QString,QString) signal to catch t
his exception
text
Вывод - то ли дебагу Qt 5 плевать на глабольные настройки кодировки, то ли QAxBase классу ... Пробежался по докам QAxBase, ничего про кодировку отладочных сообщений не увидел
0
_KUL
3 / 3 / 0
Регистрация: 14.05.2013
Сообщений: 28
31.07.2013, 08:11  [ТС] 4
Решил поставить qt 4.8 для старых функций класса QTextCodec, поставил, делаю

main.cpp в кодировке UTF-8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <QApplication>
#include <oleauto.h>
#include <ActiveQt/QAxObject>
#include <QAxBase>
#include <QDebug>
#include <QTextCodec>
#include <QString>
#include <QByteArray>
 
 
int main(int argc, char *argv[])
{
 
    QCoreApplication a(argc, argv);
    ::OleInitialize(0);
 
    setlocale(LC_ALL, "Russian");
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
 
    qDebug() << "текст2";
    QAxObject * ax = new QAxObject("V82.COMConnector");
    QAxObject * ac = ax->querySubObject("Connect(\"Srvr=\"172.0.0.100\";Ref=\"base1\";Usr=\"1C-Bot\";Pwd=\"56q\";\")");
 
    QAxObject * ab = ac->querySubObject("ПользователиИнформационнойБазы");
 
    delete ax;
 
    qDebug() << "end";
    return a.exec();
}
Реузьтат
текст2
QAxBase::dynamicCallHelper: ПользователиИнформационнойБазы: No such property in
[unknown]
Candidates are:
end

Вычитал, что 1С сервер через COM принимает кодировкой CP1251 а результат возвращает UTF-8.

Делаю
main.cpp в кодировке UTF-8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <QApplication>
#include <oleauto.h>
#include <ActiveQt/QAxObject>
#include <QAxBase>
#include <QDebug>
#include <QTextCodec>
#include <QString>
#include <QByteArray>
 
 
int main(int argc, char *argv[])
{
 
    QCoreApplication a(argc, argv);
    ::OleInitialize(0);
 
    setlocale(LC_ALL, "Russian");
    [B]QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251"));[/B]
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
 
    qDebug() << "текст2";
    QAxObject * ax = new QAxObject("V82.COMConnector");
    QAxObject * ac = ax->querySubObject("Connect(\"Srvr=\"172.0.0.100\";Ref=\"base1\";Usr=\"1C-Bot\";Pwd=\"56q\";\")");
 
    [B]QAxObject * ab = ac->querySubObject(QAxObject::tr("ПользователиИнформационнойБазы").toAscii());[/B]
 
    delete ax;
 
    qDebug() << "end";
    return a.exec();
}
Результат:
текст2
QAxBase::dynamicCallHelper: Р?Р?Р>С?Р·Р?Р?Р°С'РчР>РёР?Р?С"Р?С?Р?Р°С┼РёР?Р?Р?Р?Р№
Р'азС<: No such property in [unknown]
Candidates are:
end

Почему так происходит?

зы В 1С есть к русским именам аналоги на английском, т.е. вместо ПользователиИнформационнойБазы можно написать InfoBaseUsers и всё отлично получится даже в первом варианте. НО!!! Люди которые писали конфигуратор, использовали для обозначения объектов только русские имена ... Поэтому в дальнейшем я например не смогу взять и посмотреть права пользователя (специфичные для нашего конфигуратора).
0
_KUL
3 / 3 / 0
Регистрация: 14.05.2013
Сообщений: 28
13.08.2013, 05:47  [ТС] 5
На Visual Basic 2010 вообще всё чудесно работает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Module Module1
 
    Sub Main()
        Dim cntr As Object
        Dim trade As Object
        Dim allusers As Object
        Dim users As Object
 
        Dim line As String
 
        cntr = CreateObject("V82.COMConnector")
        trade = cntr.Connect("Srvr=""172.0.0.100"";Ref=""base1"";Usr=""1C-Bot"";Pwd=""56q"";")
        allusers = trade.ПользователиИнформационнойБазы
        users = allusers.НайтиПоИмени("admin")
        Console.WriteLine(users.Имя)
        Console.WriteLine(users.АутентификацияОС)
 
        Console.WriteLine("end")
 
        line = Console.ReadLine()
 
    End Sub
 
End Module
Прям вот хоть бери и учи этот закрытопроприетарнодотнетовский VisualBasic ;( ...
0
Maxim Prishchepa
13.08.2013, 09:53     Qt определение вывода ошибок в определенной кодировке (для русского текста)
  #6
 Комментарий модератора 
Сообщения сильно откланяются от темы
0
13.08.2013, 09:53
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.