Проблема с кодировкой MySQL и арабского языка - Qt 5.8 в Windows 7
У меня есть приложение, где я использую QSqlQueryModel
и табличное представление для просмотра некоторых данных из базы данных MySQL.
Я создал базу данных с помощью phpMyadmin и написал скрипт на Python для чтения арабских данных из листов Excel и вставки их в базу данных.
В Linux все работает хорошо, но когда я перешел на Windows, приложение не может правильно кодировать арабские слова.
Вот как это выглядит для доступных данных:
صود٠‚بال ع٠„اج Ø © ال Ù… تابع٠‡ بقسم (ا٠„Ù… Ø® وال Ø §Ø¹Øμاب)
... и когда я вставляю новые данные, используя Qt, данные отображаются в виде вопросительных знаков (?).
Вот дамп MySQL для базы данных:
-- MySQL dump 10.13 Distrib 5.6.21, for Win32 (x86)
--
-- Host: localhost Database: tasdeek
-- ------------------------------------------------------
-- Server version 5.6.21
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@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 TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2017-09-13 21:40:59
Обратите внимание, что старые данные, вставленные в Linux, правильно отображаются в phpMyAdmin.
1 ответ
Смотрите этот фрагмент из QTextCodec::codecForLocale
документация:
В Windows кодек будет основан на локали системы. В системах Unix кодек может вернуться к использованию библиотеки iconv, если не найден встроенный кодек для локали.
Это может объяснить, почему вы видели правильные арабские символы в Linux, но не в Windows.
В качестве альтернативы в этом случае вы можете "форсировать" кодек, используя следующую инструкцию в вашем main.cpp:
QTextCodec::setCodecForLocale( QTextCodec::codecForName("UTF-8") );
PS: не забывайте #include <QTextCodec>
директивы.