2015-12-02 2 views
0

Essayer d'insérer des données de CSV dans la table Firebird dans Qt. DB est en ASCII. Lors de l'insertion des chaînes avec des symboles non-ascii obtenir erreur:Comment supprimer les caractères Unicode dans QString ou convertir en latin1

Cannot transliterate character between character sets

Réglage QSqlDatabase::setConnectOptions("ISC_DPB_LC_CTYPE=UTF8;") et colonne de conversion en UTF8 (CHARACTER SET UTF8) ne contribue pas - même erreur. Essayer de supprimer les caractères unicode sans chance ainsi:

QTextCodec *codec = QTextCodec::codecForName("latin1"); 
    QByteArray encodedString = codec->fromUnicode(str); 
    str = QString(encodedString); 

QString::toLatin1() ne supprime pas les caractères aussi bien. Quelle solution pourrait être ici?

+0

Étrange, 'ALTER TABLE ALTER COLUMN TYPE VARCHAR (x) JEU DE CARACTÈRES UTF8' ne change pas le jeu de caractères de la colonne, reste ASCII. –

+0

'QString' est déjà dans utf-16, votre conversion supprimera tous les caractères ascii non 7 bits et il sera inutile. Quel est votre type de données de sortie de FireBird? Afficher le code, comment vous remplissez votre 'str' première fois. –

+0

Désolé, ce n'est pas clair pour moi, ce que vous voulez réaliser? Vous devez supprimer tous les caractères non-ascii? Cherchez-vous http://doc.qt.io/qt-5/qstring.html#toLatin1? –

Répondre

1

Ce morceau de code doit faire ce que vous avez besoin:

QString h("Honkäüö?ß#asdfe"); 

unsigned char * data = (unsigned char*)h.data(); 

QString result; 

for(int i = 0; h.size()*2; i+=2) { 
    if(data[i] > 127) { 
    result.append("?"); 
    } else { 
    result.append(QChar(data[i])); 
    } 
} 

Voici une autre, plus robuste, la version:

QString h("Honkäüö?ß#asdfe"); 
QString result; 

for(int i = 0; i < h.size(); ++i) { 
    QChar qc = h.at(i); 
    unsigned char c = *(unsigned char*)(&qc); 
    if(c >= 127) { 
    result.append("?"); 
    } else if (QChar(c).isPrint()) { 
    result.append(QChar(c)); 
    } 
} 

QString result est juste utilisé pour montrer ce qui est extrait. Vous pouvez copier le data[i] dans un tableau char ou un ajout à un QByteArray.

result est Honk?????????#asdfe

Cela fonctionne bien pour les personnages de 16bit. Les caractères 32 bits donnent des caractères '?' Ou d'autres caractères supplémentaires.

+0

bonne idée, va essayer sinon trouver une meilleure façon. Remplacera les caractères> 127 avec? ou smth comme ça. Bon pour remplacer les caractères avec le tréma allemand 'Ä' par exemple pour avoir un sens significatif comme 'A'. –

+0

Vous ne devez pas convertir les données utf-16 en données 8 bits, car les caractères utf-16 peuvent être de longueur variable. –

+0

Certes, j'ai expliqué ce fait dans ma dernière phrase. – Aaron