IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bases de données Discussion :

Gestion des accents


Sujet :

Bases de données

  1. #1
    Membre du Club
    Homme Profil pro
    Programmeur
    Inscrit en
    Octobre 2015
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Programmeur
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2015
    Messages : 80
    Points : 46
    Points
    46
    Par défaut Gestion des accents
    Bonjour,

    je crois que j'ai eu une bien mauvaise idée. Enfin 2 : la première est d'utiliser SQLite, mais enfin trop tard, c'est fait ! En Windows et OS X, j'utilise Delphi pour travailler sur une base SQLite qui gère les accents (voire le test les Epées)... Ce qui est minimum pour un programmeur français. En Linux, je me suis dit que Qt/C++ était envisageable, en tout cas préférable pour moi à Lazarus. Et cela semble être la deuxième mauvaise idée !

    Pour l'instant je n'arrive à pas grand chose. Les lettres accentuées sont "repoussées" après les lettres "ASCII" si on peut dire puisque j'utilise soit un encodage UTF8 ou UTF16. Est-ce que cela veut dire qu'avec le driver natif QSQLITE, il est impossible de classer proprement c'est à dire usuellement les mots français ?

    Merci. Zac.

  2. #2
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 619
    Points : 188 601
    Points
    188 601
    Par défaut


    De mémoire, la gestion de la collation n'est pas parfaite dans SQLite (qui, déjà dans son nom, a lite). À quoi ressemblent tes création de base de données et requêtes ? Le mot clé COLLATE pourrait t'aider, comme dans la discussion en lien. Sinon, tente autre chose que SQLite (la transition ne devrait pas être trop lourde, mais tu devrais encore pouvoir l'alléger avec un outil comme QxOrm http://www.developpez.net/forums/f15...theques/qxorm/).
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  3. #3
    Membre du Club
    Homme Profil pro
    Programmeur
    Inscrit en
    Octobre 2015
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Programmeur
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2015
    Messages : 80
    Points : 46
    Points
    46
    Par défaut
    Bonjour,

    Finalement pour ce que j'ai à en faire, dans la mesure où le QTableWidget gère correctement les accents, cela fera affaire. Voila le résultat de mes errements:
    mainwindow.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    32
    33
    34
    35
    36
    37
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
     
    #include <QMainWindow>
    #include <QSqlDatabase>
    #include <QSqlQuery>
    #include <QSqlDriver>
    #include <QSqlError>
    #include <QDebug>
    #include <QDir>
    #include <QString>
     
    namespace Ui {
    class MainWindow;
    }
     
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
     
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
     
    private:
        Ui::MainWindow *ui;
        QSqlDatabase m_db;
        QString m_databaseName;
        QString AccentKill(QString m_string);
        void createDatabase();
     
    private slots:
        void cellSelected(int nRow, int nCol);
     
    };
     
    #endif // MAINWINDOW_H
    mainwindow.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
     
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        connect( ui->twEPEES, SIGNAL( cellDoubleClicked (int, int) ), this, SLOT( cellSelected( int, int ) ) );
        createDatabase();
    }
     
    QString MainWindow::AccentKill(QString m_string)
    {
        m_string.replace("Æ", "AE");
        m_string.replace("Œ", "OE");
        m_string.replace("æ", "ae");
        m_string.replace("œ", "oe");
        QString m_res(m_string.normalized(QString::NormalizationForm_D));
        m_res.replace(QRegExp("[^a-zA-Z\\s]"), "");
        return m_res.toLower();
    }
     
    MainWindow::~MainWindow()
    {
       m_db.close();
       delete ui;
    }
     
    void MainWindow::createDatabase() {
       m_databaseName = "tests.db";
       QFile::remove(m_databaseName);
       m_db = QSqlDatabase::addDatabase("QSQLITE");
       m_db.setDatabaseName( m_databaseName);
       if( !m_db.open() )
       { qDebug() << m_db.lastError(); return; }
     
       QSqlQuery query;
       if( !query.exec("PRAGMA encoding = \"UTF-8\"") )
       { qDebug() << query.lastError(); return; }
     
       QString m_req = "CREATE TABLE IF NOT EXISTS test ("
                       "id INTEGER NOT NULL,"
                       "nom NVARCHAR(20),"
                       "nomwoa NVARCHAR(20),"
                       "PRIMARY KEY (id));";
       if( !query.exec(m_req) )
       { qDebug() << query.lastError(); return; }
     
       m_req = "CREATE UNIQUE INDEX IF NOT EXISTS unom ON test (nomwoa);";
       if( !query.exec(m_req) )
       { qDebug() << query.lastError(); return; }
     
       m_req = "CREATE INDEX IF NOT EXISTS knom ON test (nom);";
       if( !query.exec(m_req) )
       { qDebug() << query.lastError(); return; }
     
       QString m_nom;
       int m_enr;
     
       m_enr = 0; m_nom = "effectif";
       query.prepare( "INSERT INTO test(id, nom, nomwoa) "
                      "VALUES (:id, :nom, :nomwoa)" );
       query.bindValue( ":id", QString::number(m_enr));
       query.bindValue( ":nom", m_nom);
       query.bindValue( ":nomwoa", AccentKill(m_nom));
       if( !query.exec())
       { qDebug() << QString::number(m_enr) << query.lastError(); return; }
     
       m_enr++;  m_nom = "Épées";
       query.prepare( "INSERT INTO test(id, nom, nomwoa) "
                      "VALUES (:id, :nom, :nomwoa)" );
       query.bindValue( ":id", QString::number(m_enr));
       query.bindValue( ":nom", m_nom);
       query.bindValue( ":nomwoa", AccentKill(m_nom));
       if( !query.exec())
       { qDebug() << QString::number(m_enr) << query.lastError(); return; }
     
       m_enr++;  m_nom = "Epée";
       query.prepare( "INSERT INTO test(id, nom, nomwoa) "
                      "VALUES (:id, :nom, :nomwoa)" );
       query.bindValue( ":id", QString::number(m_enr));
       query.bindValue( ":nom", m_nom);
       query.bindValue( ":nomwoa", AccentKill(m_nom));
       if( !query.exec())
       { qDebug() << QString::number(m_enr) << query.lastError(); return; }
     
       m_enr++;  m_nom = "Épatant";
       query.prepare( "INSERT INTO test(id, nom, nomwoa) "
                      "VALUES (:id, :nom, :nomwoa)" );
       query.bindValue( ":id", QString::number(m_enr));
       query.bindValue( ":nom", m_nom);
       query.bindValue( ":nomwoa", AccentKill(m_nom));
       if( !query.exec())
       { qDebug() << QString::number(m_enr) << query.lastError(); return; }
     
       m_enr++;  m_nom = "épautre";
       query.prepare( "INSERT INTO test(id, nom, nomwoa) "
                      "VALUES (:id, :nom, :nomwoa)" );
       query.bindValue( ":id", QString::number(m_enr));
       query.bindValue( ":nom", m_nom);
       query.bindValue( ":nomwoa", AccentKill(m_nom));
       if( !query.exec())
       { qDebug() << QString::number(m_enr) << query.lastError(); return; }
     
       m_enr++;  m_nom = "Final";
       query.prepare( "INSERT INTO test(id, nom, nomwoa) "
                      "VALUES (:id, :nom, :nomwoa)" );
       query.bindValue( ":id", QString::number(m_enr));
       query.bindValue( ":nom", m_nom);
       query.bindValue( ":nomwoa", AccentKill(m_nom));
       if( !query.exec())
       { qDebug() << QString::number(m_enr) << query.lastError(); return; }
     
     
       m_enr++;  m_nom = "Epais";
       query.prepare( "INSERT INTO test(id, nom, nomwoa) "
                      "VALUES (:id, :nom, :nomwoa)" );
       query.bindValue( ":id", QString::number(m_enr));
       query.bindValue( ":nom", m_nom);
       query.bindValue( ":nomwoa", AccentKill(m_nom));
       if( !query.exec())
       { qDebug() << QString::number(m_enr) << query.lastError(); return; }
     
       int m_rowCount = 0;
       query.prepare( "SELECT COUNT(*) FROM test");
       if( !query.exec())
       { qDebug() << "COUNT" << query.lastError(); return; }
       if( !query.first())
       { qDebug() << "COUNT" << query.lastError(); return; }
       m_rowCount = query.value(0).toInt();
     
       ui->twEPEES->setRowCount(m_rowCount);
       QStringList m_tableheader;
       m_tableheader<<"With Accent"<< "Without Accent";
       ui->twEPEES->setHorizontalHeaderLabels(m_tableheader);
       ui->twEPEES->setEditTriggers(QAbstractItemView::NoEditTriggers);
       ui->twEPEES->setSelectionBehavior(QAbstractItemView::SelectRows);
       ui->twEPEES->setSelectionMode(QAbstractItemView::SingleSelection);
     
       int i= -1;
       query.prepare( "SELECT nom FROM test");
       if( !query.exec())
       { qDebug() << QString::number(m_enr) << query.lastError(); return; }
       while (query.next())
       { i++;
         ui->twEPEES->setItem(i, 0, new QTableWidgetItem(query.value(0).toString()));
         ui->twEPEES->setItem(i, 1, new QTableWidgetItem(AccentKill(query.value(0).toString())));
       }
       ui->twEPEES->horizontalHeader()->setSortIndicatorShown(true);
       ui->twEPEES->setSortingEnabled(false);
       ui->twEPEES->horizontalHeader()->setSortIndicator(0, Qt::AscendingOrder);
       ui->twEPEES->setSortingEnabled(true);
       ui->twEPEES->selectRow(0);
    }
     
    void MainWindow::cellSelected(int nRow, int nCol)
    {
     qDebug() << "Row" << QString::number(nRow) << "Col" << QString::number(nCol) << "is clicked";
    }
    L'ensemble du code n'est pas optimisé mais ce n'est pas le but dans un démonstrateur. J'ai créé une petite méthode AccentKill, non pas pour régler le problème de tri (le QTableWidget s'en acquitte très bien même sur les caractères accentués), mais pour régler un problème de clé unique. En effet, SQLite laisse "passser" Epées et Epees en clé unique sur "nom". Donc, j'ai créé un champ nomwoa (nom without accent) pour détecter la saisie de doublons "plus ou moins" accentués. Il ne sert qu'à cela.

    Testé sous Windows 10 et Mint 17.2. Voilà. On dira résolu. Je joins le source du projet. A bientôt.
    Fichiers attachés Fichiers attachés

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 04/10/2010, 00h23
  2. [MySQL5] gestion des accents avec like
    Par mdr_cedrick dans le forum Requêtes
    Réponses: 1
    Dernier message: 24/06/2009, 16h17
  3. [EZPDF] gestion des accents
    Par cyreel dans le forum Bibliothèques et frameworks
    Réponses: 13
    Dernier message: 26/06/2007, 18h59
  4. [Regex] gestion des accents dans un mot
    Par joseph_p dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 10/05/2006, 09h04
  5. [Conception] Gestion des accents dans une base de données
    Par MiJack dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 07/07/2005, 11h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo