2017-09-15 90 views
0

我有一个应用程序,我使用QSqlQueryModel和一个表视图来查看来自mysql数据库的一些数据。MySQL和阿拉伯语的编码问题 - Windows 7上的Qt 5.8

我使用phpMyadmin创建了数据库,并编写了一个Python脚本来从Excel工作表中读取阿拉伯数据并将其插入到数据库中。

在Linux上一切正常,但当我切换到Windows时,应用程序似乎无法正确编码阿拉伯文字。

这是怎么样子的即时拍摄数据:

ØμÙدÙ,بآعٓاجةآU ...تابع٠‡Ø¨Ù,سÙ...(آU ...果子冻ÙآاعØμاب)

...当我插入使用Qt的新数据,数据显示作为问题分数 (?)。

下面是MySQL的转储数据库:

-- MySQL dump 10.13 Distrib 5.6.21, for Win32 (x86) 
-- 
-- Host: localhost Database: tasdeek 
-- ------------------------------------------------------ 
-- Server version 5.6.21 

/*!40101 SET @[email protected]@CHARACTER_SET_CLIENT */; 
/*!40101 SET @[email protected]@CHARACTER_SET_RESULTS */; 
/*!40101 SET @[email protected]@COLLATION_CONNECTION */; 
/*!40101 SET NAMES utf8 */; 
/*!40103 SET @[email protected]@TIME_ZONE */; 
/*!40103 SET TIME_ZONE='+00:00' */; 
/*!40014 SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; 
/*!40014 SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; 
/*!40101 SET @[email protected]@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; 
/*!40111 SET @[email protected]@SQL_NOTES, SQL_NOTES=0 */; 

-- 
-- Table structure for table `tasdeek` 
-- 

DROP TABLE IF EXISTS `tasdeek`; 
/*!40101 SET @saved_cs_client  = @@character_set_client */; 
/*!40101 SET character_set_client = utf8 */; 
CREATE TABLE `tasdeek` (
    `ID` int(11) NOT NULL AUTO_INCREMENT, 
    `rank` varchar(15) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, 
    `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, 
    `working` varchar(15) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, 
    `notes` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, 
    `amount` varchar(25) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, 
    `relationship` varchar(15) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, 
    `startDate` date NOT NULL, 
    `endDate` date NOT NULL, 
    `agency` tinyint(4) NOT NULL, 
    `nationalId` varchar(14) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL, 
    PRIMARY KEY (`ID`) 
) ENGINE=InnoDB AUTO_INCREMENT=899 DEFAULT CHARSET=utf8; 
/*!40101 SET character_set_client = @saved_cs_client */; 

-- 
-- Dumping data for table `tasdeek` 
-- 

LOCK TABLES `tasdeek` WRITE; 
/*!40000 ALTER TABLE `tasdeek` DISABLE KEYS */; 
INSERT INTO `tasdeek` VALUES (2,'مساعد','زياد شسيشسي شيسي','شسيش ','شيشسيشيسشي ي شسيشس ي شسي د','5000','شخصه','2017-02-06','2018-02-06',1,NULL),(3,'اتتلاتل تلات لات لا','سيشس شيشسي شسي ','','شيسيشسي ششي شسف شسيشي شسيشي // تجديد','5000','الوالد','2017-05-11','2018-05-11',1,NULL) 
/*!40000 ALTER TABLE `tasdeek` ENABLE KEYS */; 
UNLOCK TABLES; 

-- 
-- Table structure for table `users` 
-- 

DROP TABLE IF EXISTS `users`; 
/*!40101 SET @saved_cs_client  = @@character_set_client */; 
/*!40101 SET character_set_client = utf8 */; 
CREATE TABLE `users` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `username` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, 
    `password` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, 
    `userGroup` int(2) NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `UNIQUE` (`username`) 
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; 
/*!40101 SET character_set_client = @saved_cs_client */; 

-- 
-- Dumping data for table `users` 
-- 

LOCK TABLES `users` WRITE; 
/*!40000 ALTER TABLE `users` DISABLE KEYS */; 
INSERT INTO `users` VALUES (1,'admin','5bdba65d1a953aa83ed8f35ef2877274b5d451d2',0); 
/*!40000 ALTER TABLE `users` ENABLE KEYS */; 
UNLOCK TABLES; 
/*!40103 SET [email protected]_TIME_ZONE */; 

/*!40101 SET [email protected]_SQL_MODE */; 
/*!40014 SET [email protected]_FOREIGN_KEY_CHECKS */; 
/*!40014 SET [email protected]_UNIQUE_CHECKS */; 
/*!40101 SET [email protected]_CHARACTER_SET_CLIENT */; 
/*!40101 SET [email protected]_CHARACTER_SET_RESULTS */; 
/*!40101 SET [email protected]_COLLATION_CONNECTION */; 
/*!40111 SET [email protected]_SQL_NOTES */; 

-- Dump completed on 2017-09-13 21:40:59 

注意,插入Linux上的旧数据正确显示在phpMyAdmin的。

+0

UPDATE: 当Qt中插入数据,我使用的QString :: toUtf8()以将数据到MySQL转换,现在,它正确地在phpMyAdmin显示出来..所以问题是与读取数据和观看它。 –

回答

0

请参阅从QTextCodec::codecForLocale文档此片段:

在Windows中,编解码器将根据系统语言环境。在Unix系统上,如果不能找到用于语言环境的内置编解码器,编解码器可能会回退到使用iconv库。

这可以解释为什么您在Linux上看到了正确的阿拉伯字符,但在Windows上看不到。

对于这种情况下的替代方法,可以“强制”的编解码器使用下面的指令在你main.cpp中

QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));

PS:不要忘了#include <QTextCodec>指令。