Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Получение из бд русских символов и их пересылка в php
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Ввод/Вывод, Сеть. Межпроцессное взаимодействие
Zizilk
Двигаюсь по своим задачам и столкнулся с проблемой.

Появилась необходимость получить из бд русские символы и отослать их в php по сокету.
Казалось бы всё хорошо и отлично получает, НО вместо вожделенного "Прайм" в php доходит "??N??°????".
Я слышал что бывают запары с кодировкой, но надеялся что инфу не будет перекодировать QT полученную из бд.
Как с этим бороться?
Litkevich Yuriy
Цитата(Zizilk @ 21.8.2010, 6:23) *
Как с этим бороться?
для начала выясни, где проблема. Выведи в QLabel то что получил из БД. Если вывод корректный, значит проблема дальше.
Zizilk
У меня консольное приложение. Вывод в консоль такой-же некорректный, только вместо вопросиков -квадратики
DIMEDROLL
Цитата(Zizilk @ 21.8.2010, 10:32) *
У меня консольное приложение. Вывод в консоль такой-же некорректный, только вместо вопросиков -квадратики

для начала определи в какой кодировке у тебя база, в какой кодировке ты из нее получаешь данные и в какой кодировке нужно передать данные в пхп!
Zizilk
баз в UTF8 а как определить в какой её получаю?
DIMEDROLL
для этого нужно знать КАК ты ее получаешь
Litkevich Yuriy
Цитата(Zizilk @ 21.8.2010, 14:32) *
Вывод в консоль такой-же некорректный, только вместо вопросиков -квадратики
в консоли своя собственная кодировка. поэтому выводить нужно так:
QTextCodec *outCodec = QTextCodec::CodecForName("кодировка консоли");
QTextStream out(stdout);
out.setCodec(outCodec);
out << myvar << endl;
Zizilk
Цитата(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
для начала проверь тип 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
Цитата(Zizilk @ 21.8.2010, 14:55) *
Ну мне гораздо важнее чтобы всё нормально выглядело в php
Цитата(Litkevich Yuriy @ 21.8.2010, 12:19) *
для начала выясни, где проблема.
Zizilk
Цитата(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
значит QVariant хранит QByteArray, там где // тут будем раскодировать напиши:

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

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

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

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

Супер) помогло)
DIMEDROLL
а как ты в пхп передаешь? он ведь тоже принимает какую то свою кодировку, которая где то в конфиге прописывается...
Zizilk
Через сокеты, передаю) Но факт в том, что сейчас у меня заработало)
$out = socket_read($socket, 2048);

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

В php единственный раз когда пришлось лезть в конфиг когда разблочивал сокеты. До этого на php работал с базами данных mysql(в том числе и с той в которой сижу конкретно сейчас) и проблем никогда не было
Но факт в том, что сейчас у меня заработало)
DIMEDROLL
сейчас все работает потому что кодировка ОСи и ПХП совпадают, на убунте могут быть баги, так же как и на какой то Французкой винде... но ладно, не буду больше тебя доставать вопросами)
вот только посоветую почитать хорошую статью про все эти кодировки и юникод
статью, кстати, было бы неплохо перевести на русский(если еще не перевели)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.