Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/55: Рейтинг темы: голосов - 55, средняя оценка - 4.55
5 / 5 / 2
Регистрация: 28.11.2012
Сообщений: 165
1

Русские символы при записи sqlite. Windows OS

14.11.2015, 23:10. Показов 11279. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброй ночи! Тема кодировок облизана от и до.... но всё это было бы смешно, когда бы не было так грустно.

При записи в БД использую русские смиволы:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Create database.
        QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "Connection");
        db.setDatabaseName("C:\\programs\\Qt\\Examples\\Qt-5.5\\sql\\cachedtable\\book.s3db");
        if (!db.open()) {
            qDebug("Error occurred opening the database.");
            qDebug("%s.", qPrintable(db.lastError().text()));
            return -1;
        }else{
            qDebug()<<"ok";
        }
 
    //
    QSqlQuery query(db);
 
    query.exec("create table person (id int primary key, "
               "firstname varchar(20), lastname varchar(20))");
    query.exec("insert into person values(10, 'Вася', 'Иванов')");
    query.exec("insert into person values(45, 'Roberto', 'Robitaille')");
 
db.record("person");
db.close();
Вот, что выдает sqliteadmin:

C++ (Qt)
1
2
3
4
id   firstname  lastname
______________________
10  Р’ася  Р?ванов
45  Roberto    Robitaille
Русский текст - уже не русский текст, когда как с англоязычным вариантом все ок.

Ладно, в sqliteadmin`е вручную заполним таблицу "person" русскими персонажами (скриншот).
После чего запускаем данный код:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Create database.
        QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "Connection");
        db.setDatabaseName("C:\\programs\\Qt\\Examples\\Qt-5.5\\sql\\cachedtable\\book.s3db");
        if (!db.open()) {
            qDebug("Error occurred opening the database.");
            qDebug("%s.", qPrintable(db.lastError().text()));
            return -1;
        }else{
            qDebug()<<"ok";
        }
 
    //
    QSqlQuery query(db);
 
QString str;
    query.exec("select * FROM person");
    while(query.next()){
 
       str = query.value(1).toString();
       qDebug()<<str;
    }
qDebug показывает следующее:
C++ (Qt)
1
2
3
4
"\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"
"\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD"
"\uFFFD\uFFFD\uFFFD\uFFFD"
"Roberto"
В настройках проекта стоит UTF-8.
Пробовал в метод совать вот это:
C++ (Qt)
1
2
QTextCodec* codec = QTextCodec::codecForName("UTF-8");
codec->setCodecForLocale(codec);
Миниатюры
Русские символы при записи sqlite. Windows OS  
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.11.2015, 23:10
Ответы с готовыми решениями:

Русские символы в Windows Vista (Кодировка)
Здарова народ! Суть проблемы в том, что при руссифицировании программ, везде часто всё выдаёт...

Русские символы в GTK приложениях под Windows
Работаю в CodeBlocks, пишу на C++ под Windows gtk приложение. Не получается добиться того, чтобы в...

Не воспринимает русские символы при комментировании
Hello World!! Не воспринимает русские символы при комментировании Мб с вин10 не подружился,...

Не показывает русские символы при GET запросе
try { IdHTTP-&gt;Post(&quot;http://www.lcgame.ru/auth/login/&quot;, s); //Процесс логина }...

16
435 / 246 / 43
Регистрация: 05.08.2013
Сообщений: 1,670
14.11.2015, 23:46 2
да все потому, что это сраная винда. В линупсе все замечательно. я проблему русских букв так и не решил. Да и после пары неудачных ссылок в гугле забил на эту идею. PS: проблема с кодировками не только в sqlite
0
5 / 5 / 2
Регистрация: 28.11.2012
Сообщений: 165
15.11.2015, 07:35  [ТС] 3
Мотороллер, я решил проблему в другом проекте на уровне интерфейса. Жестко прописал в main кодировку 1251. Русские пути работают, русский текст при записи работает. Но на чтение вылазит Хрень. Беда в том что мне нужно будет потом собирать проект под osx. Поэтому я не могу использовать 1251.
0
435 / 246 / 43
Регистрация: 05.08.2013
Сообщений: 1,670
15.11.2015, 09:18 4
[Maxfashko[/nick], могу посоветовать разрабатывать под линупсом или OS X, а потом под виндой придумать какой-нибудь костыль.
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
15.11.2015, 10:58 5
Цитата Сообщение от Мотороллер Посмотреть сообщение
да все потому, что это сраная винда.
Угу, угу, и Билл Гейтс лично.
Используй Unicode (UTF-8/UTF-16) и будет счастье с SQLite.

Цитата Сообщение от Мотороллер Посмотреть сообщение
PS: проблема с кодировками не только в sqlite
Проблема не в кодировках, а в том, что несмотря на 21-ый век на дворе, программисты
упорно тащат CP1251, ISO-8859, OEM-866 и прочий архаизм в современные программы,
когда давно пора забыть про них и использовать только Unicode.
И естественно, оно потом "не работает".

P.S.
У меня SQLite работает с кириллицей на любых Windows, включая нелокализованные и
всякое старье типа Win98/Win2K.
0
435 / 246 / 43
Регистрация: 05.08.2013
Сообщений: 1,670
15.11.2015, 11:30 6
Убежденный, ну вот смотри, вроде пишешь в utf-8, все вроде хорошо, а вот с контрола читаешь инфу (из текстового поля) - и там уже херня.
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
15.11.2015, 11:39 7
А ты уверен, что это проблема SQLite, а не контрола
(или кодировки, на которую настроен вывод в этом контроле) ?

Если в базе SQLite лежит UTF-8, а приложение использует дефолтную
кодовую страницу типа CP-1251, то понятно, что там будут кракозябры.
0
5 / 5 / 2
Регистрация: 28.11.2012
Сообщений: 165
15.11.2015, 12:15  [ТС] 8
Убежденный,
Цитата Сообщение от Убежденный Посмотреть сообщение
Угу, угу, и Билл Гейтс лично.
Используй Unicode (UTF-8/UTF-16) и будет счастье с SQLite.
Я ведь в свойствах проекта поставил utf-8. Что еще необходимо сделать?
0
435 / 246 / 43
Регистрация: 05.08.2013
Сообщений: 1,670
15.11.2015, 13:03 9
Убежденный, я и говорю - это все винда. тут не в базе проблемы.
0
5 / 5 / 2
Регистрация: 28.11.2012
Сообщений: 165
15.11.2015, 13:05  [ТС] 10
Мотороллер, Ладно бы utf-8 только. cp1251 тоже не помогает. Русский текст при этой кодировке тоже не отображается не пишется адекватно.
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
15.11.2015, 18:01 11
Цитата Сообщение от Maxfashko Посмотреть сообщение
Я ведь в свойствах проекта поставил utf-8. Что еще необходимо сделать?
Прежде всего, нужно разобраться с тем, на каком этапе появляются кракозябры.
Например, пусть у тебя исходная строка в UTF-8, и в базу она пишется в UTF-8, и
читается она тоже в UTF-8, но вот приложение, которое ее читает, не умеет
работать с Unicode и использует дефолтную кодовую страницу системы или консоли.
Русские шрифты в консоли - это вообще отдельная большая и больная тема, которая
не имеет универсального решения. Конечно же, здесь будут кракозябры.
А может быть, вообще все работает как надо, а панику развели почем зря.
Вот эта строка, кстати - "Вася Р˜РІР°РЅРѕРІ" - очень смахивает на UTF-8, когда
его пытаются читать "не через нужное место".

Короче, первым делом сделать двоичный дамп SQLite и проверить, что текст в
кириллице там лежит действительно в UTF-8.
Например, "Привет!" в байтовом представлении будет таким:
0xEF 0xBB 0xBF 0xD0 0x9F 0xD1 0x80 0xD0 0xB8 0xD0 0xB2 0xD0 0xB5 0xD1 0x82 0x21

Но есть и другой путь - обвинить во всем Windows и забить.
1
Поклонник Qt
314 / 210 / 41
Регистрация: 09.11.2013
Сообщений: 336
Записей в блоге: 1
16.11.2015, 03:35 12
В крайних случаях, значения можно забирать/писать используя функцию hex() из sqlite.
Я так из БД с кодировкой ‎Windows-1251 забирал в hex'е и конвертировал средствами Qt в UTF-8.
1
5 / 5 / 2
Регистрация: 28.11.2012
Сообщений: 165
16.11.2015, 20:13  [ТС] 13
Убежденный, Делаю так:

Заполняю таблицу русскими символами
C++ (Qt)
1
2
3
4
query.exec("create table person (id int primary key, "
               "firstname varchar(20), lastname varchar(20))");
 
query.exec("insert into person values(10, 'Привет!', 'мама')");
Если начать читать, нижеприведенным кодом, то ничего не покажется ( пустая строка) :

C++ (Qt)
1
2
3
4
5
6
7
QString str;
query.exec("select * FROM person");
    while(query.next()){
       str = query.value(1).toString();
       qDebug()<<str;
 
//вывод ""
Идем в редактор и смотрим, что есть наша база:

C++ (Qt)
1
2
3
//Вот наши байты, которые и повествуют о "Привет! мама"
27 1d 0a d0 9f d1 80 d0 b8 d0 b2 d0 b5 d1 82 21
d0 bc d0 b0 d0 bc d0 b0
Значит с первым понятно - пишет qt в базу правильно в utf-8.

Попробуем по-другому:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
    QTextCodec *codec = QTextCodec::codecForName("Windows-1251");
    QString str;
    QByteArray arr;
 
query.exec("select * FROM person");
    while(query.next()){
        arr =  arr.append( query.value(1).toString());
        str = codec->toUnicode(arr);
       qDebug()<<str;
    }
//"\u0420\u045F\u0421\u0402\u0420\u0451\u0420\u0406\u0420\u00B5\u0421\u201A!"
Тоже фигня.
И как теперь прочитать записанное?
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
16.11.2015, 22:31 14
Что там в документации по методу
C++ (Qt)
1
QVariant QSqlQuery::value(int index) const
сказано
Using SELECT * is not recommended because the order of the fields in the query is undefined.
0
5 / 5 / 2
Регистрация: 28.11.2012
Сообщений: 165
17.11.2015, 06:24  [ТС] 15
Dmitriy_M, может я чего не понимаю? Зачем мне порядок, если мне пока просто необходимо вывести содержимое таблицы?
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
17.11.2015, 08:48 16
Лучший ответ Сообщение было отмечено Maxfashko как решение

Решение

Цитата Сообщение от Maxfashko Посмотреть сообщение
Значит с первым понятно - пишет qt в базу правильно в utf-8.
Ок.

Цитата Сообщение от Maxfashko Посмотреть сообщение
Если начать читать, нижеприведенным кодом, то ничего не покажется ( пустая строка) :
C++
1
2
3
4
5
QString str;
query.exec("select * FROM person");
    while(query.next()){
        str = query.value(1).toString();
        qDebug()<<str;
Уверен, что проблема именно здесь, т.е. в выводе текста.
Я бы гуглил по ключевым словам "qDebug + UTF-8".
Да и для вывода UTF-8 в консоль в любом случае нужны особые "приседания".

Опять же, можно вместо qDebug записать прочитанные данные в файл и
снова проверить, что там UTF-8, а не что-то другое. И снова идти по
цепочке дальше, выясняя, на каком шаге все ломается.
1
5 / 5 / 2
Регистрация: 28.11.2012
Сообщений: 165
17.11.2015, 18:59  [ТС] 17
Убежденный,
Цитата Сообщение от Убежденный Посмотреть сообщение
Опять же, можно вместо qDebug записать прочитанные данные в файл и
снова проверить, что там UTF-8, а не что-то другое. И снова идти по
цепочке дальше, выясняя, на каком шаге все ломается.
Это действительно нужно попробовать.

Добавлено через 30 минут
Самое веселое, что вчера сел за mac и билдил проект под clang. Все прекрасно показыват и отображает

Добавлено через 8 часов 15 минут
Убежденный, Спасибо. Все работает. Действительно была виновата консоль
0
17.11.2015, 18:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.11.2015, 18:59
Помогаю со студенческими работами здесь

Русские символы при импорте из файла.
Господа, здравствуйте !!! Меня интересует такой вопрос. При попытке импортирования строки из...

Как на любой версии ОС Windows 10 (ENG / RUS) получить русские символы в консоли ?
Как на любой версии ОС Windows 10 (ENG / RUS) получить русские символы в консоли ? Сижу на ENG...

Русские символы при выводе массива структуры
Добрый вечер. Проблема такая: есть структура, в которой присутствует поле lastname типа char, при...

Ноутбук зависает при включении и не видит русские символы
Ребята, подскажите, пожалуйста. Я в с компьютерами общаюсь абсолютно на глубоко уважаемое «ВЫ» и...

Некорректно отображаются русские символы при вводе в консоль
#include &quot;stdafx.h&quot; #include &lt;conio.h&gt; #include &lt;iostream&gt; using namespace std; int...

CakePHP 2.6.2: при вызове debug русские символы меняются на крякозябры
Добрый день. CakePHP 2.6.2: при вызове debug русские символы меняются на крякозябры. Где...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru