2012-09-29 9 views
7

मैं ऐसे á é í ó ú के रूप में कुछ उच्चारण वर्ण के साथ printf करने की कोशिश की:एएनएसआई सी (जैसे एक é í ó यू) में पात्रों उच्चारण printf कैसे

printf("my name is Seán\n");

DEVC में पाठ संपादक ++ आईडीई उन्हें ठीक प्रदर्शित करता है - यानी स्रोत कोड ठीक दिखता है। मुझे लगता है कि मुझे stdio.h के अलावा कुछ लाइब्रेरी चाहिए और शायद सामान्य printf का कुछ संस्करण हो सकता है।

मैं विंडोज एक्सपी पर चल रहे आईडीई ब्लडशेड डीवीसी का उपयोग कर रहा हूं।

उत्तर

3

विंडोज कंसोल को आम तौर पर चरित्र एन्कोडिंग के संबंध में बुरी तरह टूटा माना जाता है। उदाहरण के लिए, आप here इस समस्या के बारे में पढ़ सकते हैं।

समस्या यह है कि विंडोज आम तौर पर एएनएसआई कोडपेज (जो मानते हैं कि आप पश्चिमी यूरोप या अमेरिका विंडोज -1252 में हैं) का उपयोग करते हैं, लेकिन कंसोल OEM कोडपेज (उसी धारणा के तहत CP850) का उपयोग करता है।

  • यह लिखने से पहले CP850 के लिए पाठ में कनवर्ट (CharToOem() देखें):

    आप कई विकल्प हैं। दोष यह है कि यदि उपयोगकर्ता आउटपुट को फ़ाइल (> file.txt) पर रीडायरेक्ट करता है और फ़ाइल को उदा। नोटपैड, वह इसे गलत देखेगा।

  • कंसोल के कोडपृष्ठ को बदलें: आपको एक टीटीएफ कंसोल फ़ॉन्ट (उदाहरण के लिए लुसीडा कंसोल) चुनने की आवश्यकता है और chcp 1252 कमांड का उपयोग करें।
  • यूनिकोड टेक्स्ट और wprintf() का उपयोग करें: आपको किसी भी तरह से टीटीएफ कंसोल फ़ॉन्ट की आवश्यकता है।
3

शायद यूनिकोड का उपयोग करना सबसे अच्छा है।

यहाँ कैसे ...

पहले, मैन्युअल रूप से अपने कंसोल फ़ॉन्ट के लिए "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 पाया जा सकता है।

+0

इस समाधान के साथ समस्या * "मैन्युअल रूप से अपना कंसोल फ़ॉन्ट सेट करें [...] जो भी ट्रू-टाइप यूनिकोड फ़ॉन्ट आप चुन सकते हैं" *। समझाते हुए कि एक अंतिम उपयोगकर्ता को इसे तैनात करने का एक कठिन समाधान बनाता है। – Clifford

+0

@ क्लाइफोर्ड और मैंने सोचा कि यह एक विंडोज़ समस्या थी। –

0

Windows-1252 (जिसे "एएनएसआई" भी कहा जाता है) विंडोज कंसोल मोड द्वारा उपयोग किए जाने वाले चरित्र सेट जीयूआई अनुप्रयोगों द्वारा उपयोग किए जाने वाले समान नहीं हैं। इसलिए आईडीई प्रतिनिधित्व रनटाइम प्रतिनिधित्व से अलग है।

अपने उदाहरण के लिए एक त्वरित और गंदे समाधान है:

printf("my name is Se\xe9n\n"); 

इस समस्या का सबसे समाधान त्रुटिपूर्ण हैं एक ही रास्ता या अन्य और Windows अनुप्रयोग की जरूरत है कि व्यापक बहु भाषा स्थानीयकरण करने के लिए है के लिए आसान समाधान यूनिकोड का उपयोग करके उन्हें जीयूआई ऐप्स के रूप में लिखें।

+0

उन सभी के लिए धन्यवाद जिन्होंने मुझे जवाब दिया --- रॉड्रेगो, एलेक्सी और क्लिफोर्ड। मैं वास्तव में सलाह की सराहना करता हूं। सुझावों को आजमाने के लिए मुझे थोड़ी देर लग जाएगी, और विषय के चारों ओर सिर प्राप्त होगा। फिर मैं मंच पर इस सवाल पर वापस आऊंगा कि मैं कहूं कि मैं उपयोग करता हूं - या यदि आवश्यक हो तो अधिक सहायता मांगें। शॉन – sean

संबंधित मुद्दे