शायद यूनिकोड का उपयोग करना सबसे अच्छा है।
यहाँ कैसे ...
पहले, मैन्युअल रूप से अपने कंसोल फ़ॉन्ट के लिए "Consolas" या "ल्युसिडा कंसोल" या जो भी सच है-प्रकार यूनिकोड फ़ॉन्ट आप चुन सकते हैं ("रेखापुंज फोंट" काम नहीं कर सकता, उन नहीं कर रहे सेट है यूनिकोड फ़ॉन्ट्स नहीं हैं, हालांकि उनमें रुचि रखने वाले पात्र शामिल हो सकते हैं)।
अगला, SetConsoleOutputCP(CP_UTF8)
के साथ कंसोल कोड पृष्ठ 65001 (यूटीएफ -8) पर सेट करें।
फिर WideCharToMultiByte(CP_UTF8, ...)
का उपयोग करके अपने टेक्स्ट को यूटीएफ -8 (यदि यह अभी तक यूटीएफ -8 में नहीं है) में कनवर्ट करें।
अंत में, यूटीएफ -8 पाठ को आउटपुट करने के लिए WriteConsoleA()
पर कॉल करें।
int _wprintf(const wchar_t* format, ...)
{
int r;
static int utf8ModeSet = 0;
static wchar_t* bufWchar = NULL;
static size_t bufWcharCount = 256;
static char* bufMchar = NULL;
static size_t bufMcharCount = 256;
va_list vl;
int mcharCount = 0;
if (utf8ModeSet == 0)
{
if (!SetConsoleOutputCP(CP_UTF8))
{
DWORD err = GetLastError();
fprintf(stderr, "SetConsoleOutputCP(CP_UTF8) failed with error 0x%X\n", err);
utf8ModeSet = -1;
}
else
{
utf8ModeSet = 1;
}
}
if (utf8ModeSet != 1)
{
va_start(vl, format);
r = vwprintf(format, vl);
va_end(vl);
return r;
}
if (bufWchar == NULL)
{
if ((bufWchar = malloc(bufWcharCount * sizeof(wchar_t))) == NULL)
{
return -1;
}
}
for (;;)
{
va_start(vl, format);
r = vswprintf(bufWchar, bufWcharCount, format, vl);
va_end(vl);
if (r < 0)
{
break;
}
if (r + 2 <= bufWcharCount)
{
break;
}
free(bufWchar);
if ((bufWchar = malloc(bufWcharCount * sizeof(wchar_t) * 2)) == NULL)
{
return -1;
}
bufWcharCount *= 2;
}
if (r > 0)
{
if (bufMchar == NULL)
{
if ((bufMchar = malloc(bufMcharCount)) == NULL)
{
return -1;
}
}
for (;;)
{
mcharCount = WideCharToMultiByte(CP_UTF8,
0,
bufWchar,
-1,
bufMchar,
bufMcharCount,
NULL,
NULL);
if (mcharCount > 0)
{
break;
}
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
{
return -1;
}
free(bufMchar);
if ((bufMchar = malloc(bufMcharCount * 2)) == NULL)
{
return -1;
}
bufMcharCount *= 2;
}
}
if (mcharCount > 1)
{
DWORD numberOfCharsWritten, consoleMode;
if (GetConsoleMode(GetStdHandle(STD_OUTPUT_HANDLE), &consoleMode))
{
fflush(stdout);
if (!WriteConsoleA(GetStdHandle(STD_OUTPUT_HANDLE),
bufMchar,
mcharCount - 1,
&numberOfCharsWritten,
NULL))
{
return -1;
}
}
else
{
if (fputs(bufMchar, stdout) == EOF)
{
return -1;
}
}
}
return r;
}
परीक्षण इस समारोह के बाद:
_wprintf(L"\xA0\xA1\xA2\xA3\xA4\xA5\xA6\xA7"
L"\xA8\xA9\xAA\xAB\xAC\xAD\xAE\xAF"
L"\xB0\xB1\xB2\xB3\xB4\xB5\xB6\xB7"
L"\xB8\xB9\xBA\xBB\xBC\xBD\xBE\xBF"
L"\n"
L"\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7"
L"\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF"
L"\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD7"
L"\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF"
L"\n"
L"\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7"
L"\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF"
L"\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7"
L"\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xFF"
L"\n");
_wprintf(L"\x391\x392\x393\x394\x395\x396\x397"
L"\x398\x399\x39A\x39B\x39C\x39D\x39E\x39F"
L"\x3A0\x3A1\x3A2\x3A3\x3A4\x3A5\x3A6\x3A7"
L"\x3A8\x3A9\x3AA\x3AB\x3AC\x3AD\x3AE\x3AF\x3B0"
L"\n"
L"\x3B1\x3B2\x3B3\x3B4\x3B5\x3B6\x3B7"
L"\x3B8\x3B9\x3BA\x3BB\x3BC\x3BD\x3BE\x3BF"
L"\x3C0\x3C1\x3C2\x3C3\x3C4\x3C5\x3C6\x3C7"
L"\x3C8\x3C9\x3CA\x3CB\x3CC\x3CD\x3CE"
L"\n");
_wprintf(L"\x410\x411\x412\x413\x414\x415\x401\x416\x417"
L"\x418\x419\x41A\x41B\x41C\x41D\x41E\x41F"
L"\x420\x421\x422\x423\x424\x425\x426\x427"
L"\x428\x429\x42A\x42B\x42C\x42D\x42E\x42F"
L"\n"
L"\x430\x431\x432\x433\x434\x435\x451\x436\x437"
L"\x438\x439\x43A\x43B\x43C\x43D\x43E\x43F"
L"\x440\x441\x442\x443\x444\x445\x446\x447"
L"\x448\x449\x44A\x44B\x44C\x44D\x44E\x44F"
L"\n");
और निम्नलिखित में परिणाम चाहिए
यहाँ एक छोटे से समारोह है कि आप के लिए इन सब बातों करता है, यह एक "सुधार" wprintf()
का संस्करण है कंसोल में पाठ:
¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿
ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß
àáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ
ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩΪΫάέήίΰ
αβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ
АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ
абвгдеёжзийклмнопрстуфхцчшщъыьэюя
मुझे एन्कोडिंग नहीं पता जिसमें आपका आईडीई गैर-ASCII वर्णों को .c/में संग्रहीत करता है।सीपीपी फाइलें और मुझे नहीं पता कि आपका कंपाइलर गैर-ASCII वर्णों का सामना करते समय क्या करता है। इस भाग को आप स्वयं को समझना चाहिए।
जब तक आप _wprintf()
को यूटीएफ -16 टेक्स्ट को ठीक से एन्कोड किया गया है या WriteConsoleA()
पर उचित रूप से एन्कोड किए गए यूटीएफ -8 टेक्स्ट के साथ कॉल करते हैं, तो चीजें काम करनी चाहिए।
पीएस कंसोल फोंट के बारे में कुछ गोरो विवरण here पाया जा सकता है।
इस समाधान के साथ समस्या * "मैन्युअल रूप से अपना कंसोल फ़ॉन्ट सेट करें [...] जो भी ट्रू-टाइप यूनिकोड फ़ॉन्ट आप चुन सकते हैं" *। समझाते हुए कि एक अंतिम उपयोगकर्ता को इसे तैनात करने का एक कठिन समाधान बनाता है। – Clifford
@ क्लाइफोर्ड और मैंने सोचा कि यह एक विंडोज़ समस्या थी। –