यहाँ एक उदाहरण है कि चार अलग अलग तरीकों, से पता चलता है, जिनमें से केवल तीसरी (सी conio
) और चौथे (देशी विंडोज एपीआई) काम (पर केवल यदि stdin/stdout रीडायरेक्ट नहीं किया जाता) । ध्यान दें कि आपको अभी भी उस फ़ॉन्ट की आवश्यकता है जिसमें वह वर्ण शामिल है जिसे आप दिखाना चाहते हैं (लुसीडा कंसोल कम से कम ग्रीक और सिरिलिक का समर्थन करता है)। ध्यान दें कि यहां सब कुछ पूरी तरह से गैर पोर्टेबल है, टर्मिनल पर यूनिकोड स्ट्रिंग इनपुट/आउटपुट करने के लिए कोई पोर्टेबल तरीका नहीं है।
#ifndef UNICODE
#define UNICODE
#endif
#ifndef _UNICODE
#define _UNICODE
#endif
#define STRICT
#define NOMINMAX
#define WIN32_LEAN_AND_MEAN
#include <iostream>
#include <string>
#include <cstdlib>
#include <cstdio>
#include <conio.h>
#include <windows.h>
void testIostream();
void testStdio();
void testConio();
void testWindows();
int wmain() {
testIostream();
testStdio();
testConio();
testWindows();
std::system("pause");
}
void testIostream() {
std::wstring first, second;
std::getline(std::wcin, first);
if (!std::wcin.good()) return;
std::getline(std::wcin, second);
if (!std::wcin.good()) return;
std::wcout << first << second << std::endl;
}
void testStdio() {
wchar_t buffer[0x1000];
if (!_getws_s(buffer)) return;
const std::wstring first = buffer;
if (!_getws_s(buffer)) return;
const std::wstring second = buffer;
const std::wstring result = first + second;
_putws(result.c_str());
}
void testConio() {
wchar_t buffer[0x1000];
std::size_t numRead = 0;
if (_cgetws_s(buffer, &numRead)) return;
const std::wstring first(buffer, numRead);
if (_cgetws_s(buffer, &numRead)) return;
const std::wstring second(buffer, numRead);
const std::wstring result = first + second + L'\n';
_cputws(result.c_str());
}
void testWindows() {
const HANDLE stdIn = GetStdHandle(STD_INPUT_HANDLE);
WCHAR buffer[0x1000];
DWORD numRead = 0;
if (!ReadConsoleW(stdIn, buffer, sizeof buffer, &numRead, NULL)) return;
const std::wstring first(buffer, numRead - 2);
if (!ReadConsoleW(stdIn, buffer, sizeof buffer, &numRead, NULL)) return;
const std::wstring second(buffer, numRead);
const std::wstring result = first + second;
const HANDLE stdOut = GetStdHandle(STD_OUTPUT_HANDLE);
DWORD numWritten = 0;
WriteConsoleW(stdOut, result.c_str(), result.size(), &numWritten, NULL);
}
- संपादित करें 1: मैं एक विधि
conio
के आधार पर जोड़ दिया है।
- संपादित 2: मैं चारों ओर
_O_U16TEXT
साथ एक सा माइकल कापलान के ब्लॉग में वर्णित के रूप गड़बड़ है, लेकिन है कि प्रतीत होता है केवल था wgets
(8 बिट) UTF-16 के रूप में ReadFile
से डेटा की व्याख्या। मैं सप्ताहांत के दौरान थोड़ा और जांच करूँगा।
यूनिकोड पर्याप्त सटीक नहीं है। क्या आप यूटीएफ- [8/16/32] का उपयोग कर रहे हैं? क्या आप आंतरिक रूप से समान प्रतिनिधित्व का उपयोग करना चाहते हैं और जब इसे फ़ाइल में क्रमबद्ध किया जाता है? यदि आप प्रतिनिधित्वों को रूपांतरित करना चाहते हैं तो क्या आप इसे codecvt facet का उपयोग कर मैन्युअल रूप से या लोकेल के माध्यम से करना चाहते हैं? –
जैसा आप चाहें !!! कोई फ़ाइल नहीं और कुछ और नहीं, और यह सब बताओ! – Narek
इस विषय पर विभिन्न धागे पढ़ने के बाद, मेरा निष्कर्ष यह है कि सी ++ में करना असंभव है। ड्रॉप 'cin', 'cout' और C++ और C मानकों से बाकी सब कुछ और सादे विंडोज फ़ंक्शन' ReadConsoleW' और 'WriteConsoleW' का उपयोग करें। इस संबंध में सी और सी ++ मानकों को तोड़ दिया गया है। – Philipp