2017-09-15 96 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>指令。