Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

DEFAULT c++ प्रोजेक्ट में UTF8 वर्णों का उपयोग कैसे करें या विजुअल स्टूडियो 2019 में c++ के लिए mysql कनेक्टर का उपयोग करते समय (Latin7_general_ci से UTF-8)?

मुझे लगता है कि आपके मामले में समस्या std::wstring . से संबंधित नहीं है :8-बिट std::string UTF-8 के लिए पर्याप्त होना चाहिए (एक साधारण std::string . बनाना विशेष वर्णों के साथ "āàčīēļš" बस ठीक काम करता है), जबकि ऑपरेटिंग सिस्टम पर निर्भर करता है std::wstring 2 बाइट (विंडोज़) या 4 बाइट (लिनक्स) है (अधिक जानकारी यहां और यहां ) आखिर अगर आप getString . पर एक नज़र डालें तो फ़ंक्शन आप देखेंगे कि यह एक sql::SQLString लेता और लौटाता है . sql::SQLString class std::string . के लिए एक साधारण आवरण है ।

मुझे लगता है कि आपको utf-8निर्दिष्ट करना होगा MySql के लिए डिफ़ॉल्ट वर्ण सेट के रूप में :इसके लिए आपको निम्नलिखित कनेक्शन विकल्प डेटा बेस से कनेक्ट करते समय:

std::unique_ptr<sql::Connection> connection {nullptr};
try {
  sql::Driver* driver = ::get_driver_instance();

  sql::ConnectOptionsMap connection_options {};
  connection_options["hostName"] = url;      // Replace with your log-in
  connection_options["userName"] = username; // ...
  connection_options["password"] = password; // ...
  connection_options["schema"] = schema;     // ...
  connection_options["characterSetResults"] = "utf8";
  connection_options["OPT_CHARSET_NAME"] = "utf8";
  connection_options["OPT_SET_CHARSET_NAME"] = "utf8";

  connection.reset(driver->connect(connection_options));
} catch (sql::SQLException& ex) {
  std::cerr << "Error occured when connecting to SQL data base: " << ex.what() << "(" << ex.getErrorCode() << ").";
}

तब आप अपने डेटा बेस को निम्नानुसार क्वेरी करना जारी रखने में सक्षम होना चाहिए

std::string const some_query = "SELECT * FROM some_table_name;";
std::unique_ptr<sql::Statement> statement {connection->createStatement()};
std::unique_ptr<sql::ResultSet> result {statement->executeQuery(some_query)};
while (result->next()) {
  std::string const some_field = result->getString("some_field_name");
  // Process: e.g. display with std::cout << some_field << std::endl;
}

समस्या जो अब सामने आती है जब आप इसके साथ फ़ाइल नाम बनाना चाहते हैं या इसे कंसोल पर आउटपुट करना चाहते हैं Windows है स्वयं (मैंने पहले केवल लिनक्स के साथ कोड का परीक्षण किया था और इसलिए पहले इस मुद्दे में नहीं चला था!):डिफ़ॉल्ट रूप से यह एएनएसआई का उपयोग करता है न कि यूटीएफ -8 का। भले ही आप āàčīēļš . जैसा कुछ आउटपुट करते हों यदि आप std::cout . का उपयोग कर रहे हैं तो यह इसे सही ढंग से आउटपुट नहीं करेगा या std::wcout std::wstring . के संयोजन में . इसके बजाय यह ─ü├á─ì─½─ô─╝┼í . आउटपुट करेगा ।

अगर आप बाइट निकालते हैं

void dump_bytes(std::string const& str) {
  std::cout << std::hex << std::uppercase << std::setfill('0');
  for (unsigned char c : str) {
    std::cout << std::setw(2) << static_cast<int>(c) << ' ';
  }
  std::cout << std::dec << std::endl;
  return;
}

यह आउटपुट होगा C4 81 C3 A0 C4 8D C4 AB C4 93 C4 BC C5 A1 जो इसे वापस बाइट-टू-यूटीएफ8-कन्वर्टर में प्लग करता है, जैसे कि यह एक वास्तव में आपको āàčīēļš देगा . तो स्ट्रिंग को सही ढंग से पढ़ा गया था लेकिन विंडोज़ इसे सही तरीके से प्रदर्शित नहीं कर रहा है। अंतिम खंड के साथ संयोजन में निम्नलिखित (utf-8 निर्दिष्ट करते हुए) MySql में डिफॉल्ट कैरेक्टर सेट के रूप में) को आपकी सभी समस्याओं को ठीक करना चाहिए:

  • SetConsoleOutputCP(CP_UTF8); . पर कॉल करें windows.h . से कार्यक्रम की शुरुआत में कंसोल आउटपुट को ठीक करेगा :

     #include <cstdlib>
     #include <iostream>
     #include <string>
     #include <windows.h>
    
     int main() {
       // Forces console output to UTF8
       SetConsoleOutputCP(CP_UTF8);
       std::string const name = u8"āàčīēļš";
       std::cout << name << std::endl; // Actually outputs āàčīēļš
       return EXIT_SUCCESS;
     }
    
  • इसी तरह आपको अपनी दिनचर्या को अनुकूलित करना होगा जो फ़ाइलें बनाता है डिफ़ॉल्ट रूप से यह UTF8 भी नहीं होगा (फ़ाइलों की सामग्री कोई समस्या नहीं होगी, लेकिन फ़ाइल नाम ही होगा!) std::ofstream का उपयोग करें fstream . से std::filesystem::u8path . के संयोजन में C++17 लाइब्रेरी से filesystem इसे हल करने के लिए:

     #include <cstdlib>
     #include <filesystem>
     #include <fstream>
     #include <string>
    
     int main() {
       std::string const name = u8"āàčīēļš";
       std::ofstream f(std::filesystem::u8path(name + ".txt")); // Creates a file āàčīēļš.txt
       f << name << std::endl;                                  // Writes āàčīēļš to it
       return EXIT_SUCCESS;
     }
    


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 1 पॉड में तत्काल अनबाउंड तत्काल PersistentVolume Minikube पर दावा है

  2. समय ओवरलैप के लिए एक टेबल की जाँच?

  3. सबक्वेरी mysql का उपयोग करके उसी तालिका में auto_increment बदलें

  4. JSON_REPLACE () - MySQL में JSON दस्तावेज़ में मान बदलें

  5. डॉक्ट्रिन कन्वर्ट-मैपिंग चलाते समय टेबल छोड़ें