Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Ввод/Вывод, Сеть. Межпроцессное взаимодействие _ Получение из бд русских символов и их пересылка в php

Автор: Zizilk 21.8.2010, 2:23

Двигаюсь по своим задачам и столкнулся с проблемой.

Появилась необходимость получить из бд русские символы и отослать их в php по сокету.
Казалось бы всё хорошо и отлично получает, НО вместо вожделенного "Прайм" в php доходит "??N??°????".
Я слышал что бывают запары с кодировкой, но надеялся что инфу не будет перекодировать QT полученную из бд.
Как с этим бороться?

Автор: Litkevich Yuriy 21.8.2010, 8:19

Цитата(Zizilk @ 21.8.2010, 6:23) *
Как с этим бороться?
для начала выясни, где проблема. Выведи в QLabel то что получил из БД. Если вывод корректный, значит проблема дальше.

Автор: Zizilk 21.8.2010, 10:32

У меня консольное приложение. Вывод в консоль такой-же некорректный, только вместо вопросиков -квадратики

Автор: DIMEDROLL 21.8.2010, 10:38

Цитата(Zizilk @ 21.8.2010, 10:32) *
У меня консольное приложение. Вывод в консоль такой-же некорректный, только вместо вопросиков -квадратики

для начала определи в какой кодировке у тебя база, в какой кодировке ты из нее получаешь данные и в какой кодировке нужно передать данные в пхп!

Автор: Zizilk 21.8.2010, 10:43

баз в UTF8 а как определить в какой её получаю?

Автор: DIMEDROLL 21.8.2010, 10:48

для этого нужно знать КАК ты ее получаешь

Автор: Litkevich Yuriy 21.8.2010, 10:50

Цитата(Zizilk @ 21.8.2010, 14:32) *
Вывод в консоль такой-же некорректный, только вместо вопросиков -квадратики
в консоли своя собственная кодировка. поэтому выводить нужно так:
QTextCodec *outCodec = QTextCodec::CodecForName("кодировка консоли");
QTextStream out(stdout);
out.setCodec(outCodec);
out << myvar << endl;

Автор: Zizilk 21.8.2010, 10:55

Цитата(Litkevich Yuriy @ 21.8.2010, 11:50) *
Цитата(Zizilk @ 21.8.2010, 14:32) *
Вывод в консоль такой-же некорректный, только вместо вопросиков -квадратики
в консоли своя собственная кодировка. поэтому выводить нужно так:
QTextCodec *outCodec = QTextCodec::CodecForName("кодировка консоли");
QTextStream out(stdout);
out.setCodec(outCodec);
out << myvar << endl;


Ну мне гораздо важнее чтобы всё нормально выглядело в php на саму консоль мона сказать плевать(в неё выводил ток для дебага)



а получаю так
QString query="SELECT name FROM `Galaxy` where (`id`='"+QString::number(coord)+"');";
            qDebug()<<QTime::currentTime()<<"SL> querry "<<query;
            QSqlQuery squery;
            if (!squery.exec(query))
            {
                qDebug()<<QTime::currentTime()<<"SL> query wasn't execute !!! WTF you wrote in SQL sintax?? Oo";
                return QString::number(-2);
            }
            else
            {
                QSqlRecord rec = squery.record();
                if (squery.next())
                {
                    pname=squery.value(rec.indexOf("name")).toString();
                    qDebug()<<QTime::currentTime()<<"SL> pname "<<pname;
                }
                else
                    return QString::number(-1);
            }

Автор: DIMEDROLL 21.8.2010, 11:20

для начала проверь тип QVariant:

QVariant v = squery.value(rec.indexOf("name"));
if (v.type() == QVariant::ByteArray) {
  // print to console
  // тут будем раскодировать
} else if (v.type() == QVariant::String) {
  // print to console
  //
}


и ты не ответил, какую кодировку хочет пхп?

Автор: Litkevich Yuriy 21.8.2010, 11:21

Цитата(Zizilk @ 21.8.2010, 14:55) *
Ну мне гораздо важнее чтобы всё нормально выглядело в php
Цитата(Litkevich Yuriy @ 21.8.2010, 12:19) *
для начала выясни, где проблема.

Автор: Zizilk 21.8.2010, 11:42

Цитата(DIMEDROLL @ 21.8.2010, 12:20) *
для начала проверь тип QVariant:
QVariant v = squery.value(rec.indexOf("name"));
if (v.type() == QVariant::ByteArray) {
  // print to console
  // тут будем раскодировать
} else if (v.type() == QVariant::String) {
  // print to console
  //
}


и ты не ответил, какую кодировку хочет пхп?

PHP я пробовал разную кодировку, как менял в сорцах, так и в браузере, результат почти всегда один ток вместо нака градуса ромб с вопросом получается.


Тогда ща поколдую, вnx и с выводом в консоль

Значит попробовал сделать ту вилку которую ты сказал.
Пошёл по первой ветви, где у тя написанно "будем раскодировать."

Вывесит в консоль как говорил Litkevich Yuriy не получилось, тк я не нашёл какая кодировка в консоли

Автор: DIMEDROLL 21.8.2010, 11:54

значит QVariant хранит QByteArray, там где // тут будем раскодировать напиши:

QByteArray bytes = v.toByteArray();
QString result = QString::fromUtf8(bytes.constData(), bytes.size());

теперь в result у тебя валидная строка и ее можно вывести в консоль или куда тебе угодно

см.:
QString::toAscii ()
QString::toLocal8Bit ()

У тебя какая ОСь и язык ОСи(локаль)? Какая кодировка консоли?

Автор: Zizilk 21.8.2010, 12:03

Ось win 7 starter но прога планируется будет работать под убунтой.
Язык оси вроде русский, с кодировкой консоли разобраться не могу), только знаю, что её не трогал)

Супер) помогло)

Автор: DIMEDROLL 21.8.2010, 12:12

а как ты в пхп передаешь? он ведь тоже принимает какую то свою кодировку, которая где то в конфиге прописывается...

Автор: Zizilk 21.8.2010, 12:18

Через сокеты, передаю) Но факт в том, что сейчас у меня заработало)

$out = socket_read($socket, 2048);

На клиентской стороне стоит такой кусок кода, который принимает глыбу данных(в виде строки) от сервера, в которую входит и та самая злополучная строка. После чего она распиливается.

В php единственный раз когда пришлось лезть в конфиг когда разблочивал сокеты. До этого на php работал с базами данных mysql(в том числе и с той в которой сижу конкретно сейчас) и проблем никогда не было
Но факт в том, что сейчас у меня заработало)

Автор: DIMEDROLL 21.8.2010, 12:37

сейчас все работает потому что кодировка ОСи и ПХП совпадают, на убунте могут быть баги, так же как и на какой то Французкой винде... но ладно, не буду больше тебя доставать вопросами)
вот только посоветую почитать http://www.joelonsoftware.com/articles/Unicode.html про все эти кодировки и юникод
статью, кстати, было бы неплохо перевести на русский(если еще не перевели)

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)