2011-09-21 13 views
7

मैं wchar_t * स्ट्रिंग को मुद्रित करने का प्रयास कर रहा हूं। कोड नीचे चला जाता है:चार बनाम wchar_t

#include <stdio.h> 
#include <string.h> 
#include <wchar.h> 

char *ascii_ = "中日友好"; //line-1 
wchar_t *wchar_ = L"中日友好"; //line-2 

int main() 
{ 
    printf("ascii_: %s\n", ascii_); //line-3 
    wprintf(L"wchar_: %s\n", wchar_); //line-4 
    return 0; 
} 

//Output 
ascii_: 中日友好 

प्रश्न:

  1. जाहिर है मैं लाइन -1 में चार को * सूचक CJK पात्रों आवंटित करने चाहिए नहीं है, लेकिन मैं सिर्फ यह किया, और रेखा के उत्पादन -3 सही है, तो क्यों? लाइन -3 में printf() कैसे मुझे गैर-असीसी वर्ण दे सकता है? क्या यह एन्कोडिंग किसी भी तरह से जानता है?

  2. मुझे लगता है कि लाइन -2 में कोड और लाइन -4 सही हैं, लेकिन मुझे लाइन -4 का कोई आउटपुट क्यों नहीं मिला?

+0

आप किस कंपाइलर का उपयोग कर रहे हैं? जीएफसी यूटीएफ -8 ओ अधिकांश प्लेटफ़ॉर्म पर डिफ़ॉल्ट है। मुझे एन्कोडिंग समस्या की तरह लगता है। – cyco130

+0

@ cyco130, yes, gcc – Alcott

उत्तर

8

सबसे पहले, स्रोत कोड में गैर-असीसी वर्णों का उपयोग करना आमतौर पर एक अच्छा विचार नहीं है। शायद यह हो रहा है कि चीनी पात्रों को यूटीएफ -8 के रूप में एन्कोड किया जा रहा है जो एएससीआई के साथ काम करता है।

अब, wprintf() क्यों काम नहीं कर रहा है। इसे स्ट्रीम अभिविन्यास के साथ करना है। प्रत्येक धारा केवल सामान्य या चौड़ी पर सेट की जा सकती है। एक बार सेट हो जाने पर, इसे बदला नहीं जा सकता है। यह पहली बार इस्तेमाल किया जाता है। (printf के कारण एएससीआई है)। इसके बाद wprintf गलत अभिविन्यास के कारण काम नहीं करेगा।

दूसरे शब्दों में, एक बार जब आप printf() का उपयोग करते हैं तो आपको printf() का उपयोग करना जारी रखना होगा। इसी तरह, यदि आप wprintf() से शुरू करते हैं, तो आपको wprintf() का उपयोग करना जारी रखना होगा।

आप printf() और wprintf() पर इंटरमीक्स नहीं कर सकते हैं। (विंडोज को छोड़कर)

संपादित करें:

के बारे में क्यों wprintf लाइन अपने आप में भी काम नहीं करता है इस सवाल का जवाब करने के लिए। ऐसा शायद इसलिए है क्योंकि कोड संकलित किया जा रहा है ताकि 中日友好 का यूटीएफ -8 प्रारूप wchar_ में संग्रहीत किया जा सके। हालांकि, wchar_t को 4-बाइट यूनिकोड एन्कोडिंग की आवश्यकता है।

  1. wchar_t साथ परेशान न हों, और सिर्फ मल्टी-बाइट char के साथ चिपके रहते हैं: (Windows में 2-बाइट)

    तो दो विकल्प है कि मैं के बारे में सोच सकते हैं नहीं है। यह आसान तरीका है, लेकिन यदि उपयोगकर्ता की प्रणाली चीनी लोकेल पर सेट नहीं है तो टूट सकती है।

  2. wchar_t का उपयोग करें, लेकिन आपको यूनिकोड एस्केप दृश्यों का उपयोग करके चीनी वर्णों को एन्कोड करने की आवश्यकता होगी। यह स्पष्ट रूप से स्रोत कोड में इसे अपठनीय बना देगा, लेकिन यह किसी भी मशीन पर काम करेगा जो लोकेल के बावजूद चीनी चरित्र फोंट प्रिंट कर सकता है।
+0

यदि यूनिकोड से बचने के लिए उपयोग किया जाता है, तो मुझे प्रत्येक चीनी शब्द की सीईसी पता लगाना चाहिए, है ना? यह करने के लिए काफी काम होगा, पी – Alcott

+1

सही। हालांकि, मुझे यकीन है कि यह काफी आम है जहां आप ऑनलाइन एक टूल पा सकते हैं जिसे आप चीनी टेक्स्ट कॉपी और पेस्ट कर सकते हैं और यह आपको यूनिकोड एस्केप अनुक्रम देगा। और कोड को पठनीय रखने के लिए, आप वास्तविक चीनी पाठ को एक टिप्पणी के रूप में बचने के अनुक्रम के आगे रख सकते हैं। – Mysticial

+0

धन्यवाद रहस्यवादी – Alcott

6

रेखा 1 ascii नहीं है, यह संकलन-समय पर आपके कंपाइलर द्वारा जो भी मल्टीबाइट एन्कोडिंग का उपयोग किया जाता है। आधुनिक प्रणालियों पर शायद यूटीएफ -8 है। printf एन्कोडिंग को नहीं जानता है। यह सिर्फ बाइट्स को stdout भेज रहा है, और जब तक एन्कोडिंग मैच होता है, सब कुछ ठीक है।

एक समस्या आपको अवगत होना चाहिए कि लाइन 3 और 4 एक साथ अपरिभाषित व्यवहार का आह्वान करते हैं। आप उसी FILE (stdout) पर चरित्र-आधारित और विस्तृत-वर्ण io मिश्रण नहीं कर सकते हैं।पहले ऑपरेशन के बाद, FILE में "ओरिएंटेशन" (या तो बाइट या चौड़ा) है, और उसके बाद यूबी में विपरीत अभिविन्यास परिणामों के संचालन करने का कोई प्रयास है।

+0

मैं टिप्पणी करता हूं printf() लाइन, मुझे कुछ आउटपुट मिला लेकिन चीनी वर्ण नहीं। क्यूं कर? – Alcott

+0

शायद लोकेल का एन्कोडिंग गलत है। –

+0

लोकेल एन्कोडिंग? इसे कैसे जोड़ेंगे? – Alcott

1

आप एक कदम छोड़ रहे हैं और इसलिए गलत तरीका सोचते हैं।

आपके पास डिस्क पर एक सी फ़ाइल है, जिसमें बाइट्स हैं। आपके पास "ASCII" स्ट्रिंग और विस्तृत स्ट्रिंग है।

ASCII स्ट्रिंग बाइट्स को ठीक उसी तरह ले जाती है जैसे वे लाइन 1 में हैं और उन्हें आउटपुट करते हैं। यह तब तक काम करता है जब उपयोगकर्ता की तरफ एन्कोडिंग प्रोग्रामर की तरफ से एक जैसा ही होता है।

विस्तृत स्ट्रिंग पहले दिए गए बाइट्स को यूनिकोड कोडपॉइंट्स में डीकोड करता है और प्रोग्राम में संग्रहीत होता है- हो सकता है कि यह आपकी तरफ गलत हो। आउटपुट पर वे उपयोगकर्ता के पक्ष में एन्कोडिंग के अनुसार फिर से एन्कोड किए जाते हैं। यह सुनिश्चित करता है कि इन वर्णों को उत्सर्जित किया गया है, जैसा कि उनका इरादा है, जैसा कि वे दर्ज नहीं हैं।

या तो आपका कंपाइलर गलत एन्कोडिंग मानता है, या आपका आउटपुट टर्मिनल गलत तरीके से स्थापित किया गया है।

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