सारांश: क्या मैं सही ढंग से एक स्ट्रिंग शाब्दिक स्रोत कोड में परिभाषित किया गया है कि एक cmd
std::cout
धारा का उपयोग कर कंसोल के लिए UTF-8 एन्कोडिंग (विंडोज सी.पी. 65001) में जमा हो गया था मुद्रित करने के लिए क्या करना चाहिए?सी ++ 11 std :: cout << "विंडोज सीटीडी कंसोल में यूटीएफ -8 में स्ट्रिंग अक्षर"? (विजुअल स्टूडियो 2015)
प्रेरणा: मैं उच्चारण चिह्न पात्रों के साथ उत्कृष्ट Catch unit-testing framework (एक प्रयोग के रूप में) इतना है कि यह प्रदर्शित होता my texts संशोधित करना चाहते हैं। संशोधन सरल, भरोसेमंद होना चाहिए, और अन्य भाषाओं और कामकाजी वातावरण के लिए भी उपयोगी होना चाहिए ताकि लेखक द्वारा इसे एक वृद्धि के रूप में स्वीकार किया जा सके। या यदि आप पकड़ते हैं और यदि कोई वैकल्पिक समाधान है, तो क्या आप इसे पोस्ट कर सकते हैं?
विवरण: के चेक संस्करण साथ शुरू करते हैं "जल्दी भूरी लोमड़ी ..."
#include <iostream>
#include "windows.h"
using namespace std;
int main()
{
cout << "\n-------------------------- default cmd encoding = 852 -------------------\n";
cout << "Příšerně žluťoučký kůň úpěl ďábelské ódy!" << endl;
cout << "\n-------- Windows Central European (1250) set for the cmd console --------\n";
SetConsoleOutputCP(1250);
std::cout << "Příšerně žluťoučký kůň úpěl ďábelské ódy!" << std::endl;
cout << "\n------------- Windows UTF-8 (65001) set for the cmd console -------------\n";
SetConsoleOutputCP(CP_UTF8);
std::cout << "Příšerně žluťoučký kůň úpěl ďábelské ódy!" << std::endl;
}
यह निम्न (ल्युसिडा कंसोल के लिए सेट फ़ॉन्ट) प्रिंट:
cmd
डिफ़ॉल्ट एन्कोडिंग 852 है, डिफ़ॉल्ट विंडोज एन्कोडिंग 1250 है, और स्रोत कोड 65001 एन्कोडिंग (बीओएम के साथ यूटीएफ -8) का उपयोग करके सहेजा गया था। SetConsoleOutputCP(1250);
cmd
एन्कोडिंग (प्रोग्रामेटिक रूप से) को chcp 1250
करता है जैसा ही बदलता है।
निरीक्षण: 1250 एन्कोडिंग सेट करते समय, यूटीएफ -8 स्ट्रिंग शाब्दिक सही ढंग से मुद्रित किया जाता है। मेरा मानना है कि इसे समझाया जा सकता है, लेकिन यह वास्तव में अजीब है। क्या कोई सभ्य, मानव है, समस्या को हल करने का सामान्य तरीका है?
अद्यतन:"narrow string literal"
मेरे मामले में विंडोज -1250 एन्कोडिंग (मध्य यूरोपीय के लिए मूल विंडोज एन्कोडिंग) का उपयोग करके संग्रहीत किया जाता है। यह स्रोत कोड के एन्कोडिंग पर स्वतंत्र प्रतीत होता है। संकलक इसे विंडोज मूल एन्कोडिंग में सहेजता है। उस वजह से, उस एन्कोडिंग में cmd
स्विच करना वांछित आउटपुट देता है। यह बदसूरत है, लेकिन मैं देशी विंडोज एन्कोडिंग प्रोग्रामेटिक रूप से कैसे प्राप्त कर सकता हूं (इसे SetConsoleOutputCP(cpX)
पर पास करने के लिए)? मुझे जो चाहिए वह स्थिर है जो मशीन के लिए मान्य है जहां संकलन हुआ। यह मशीन के लिए मूल एन्कोडिंग नहीं होना चाहिए जहां निष्पादन योग्य चलता है।
सी ++ 11 भी पेश u8"the UTF-8 string literal"
, लेकिन यह SetConsoleOutputCP(CP_UTF8);
संभवतः संबंधित: http://stackoverflow.com/questions/18904081/printing-unicode-characters-c/18906295#18906295 – luk32
@ luk32: संदर्भ के लिए धन्यवाद। मुझे इसे देखना होगा। – pepr
एमएसवीसी में यूटीएफ -8 स्रोत को संकलित करते समय, यह स्ट्रिंग अक्षर का मूल एन्कोडिंग में अनुवाद करेगा यदि फ़ाइल _UTF-8 BOM_ के साथ शुरू होती है। जब आप इसे हटाते हैं, तो आपकी टेस्ट स्ट्रिंग को तीसरे मामले में सही ढंग से मुद्रित किया जाना चाहिए। – Melebius