मुझे लगता है कि आपके मामले में समस्या 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; }