Проблема с кодировкой в ​​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.


person Zeyad Obaia    schedule 15.09.2017    source источник
comment
ОБНОВЛЕНИЕ: при вставке данных в Qt я использовал QString::toUtf8() для преобразования данных в mysql, и теперь они правильно отображаются в PhpMyAdmin... поэтому проблема заключается в чтении данных и их просмотре.   -  person Zeyad Obaia    schedule 15.09.2017


Ответы (1)


См. этот фрагмент из QTextCodec::codecForLocale документации:

В Windows кодек будет основан на языковом стандарте системы. В системах Unix кодек может вернуться к использованию библиотеки iconv, если не удается найти встроенный кодек для локали.

Это может объяснить, почему вы видели правильные арабские символы в Linux, но не в Windows.

В качестве альтернативы в этом случае вы можете принудительно использовать кодек, используя следующую инструкцию в файле main.cpp:

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

PS: не забудьте директиву #include <QTextCodec>.

person cleybertandre    schedule 19.10.2017