2012-04-03 15 views
8

तो मुझे चरित्र एन्कोडिंग के साथ कुछ परेशानी हुई है।यूटीएफ 32 और सी # समस्या

और उसके बाद उन पर इस कोड को चलाने: जब मैं एक UTF32 इनकोडिंग पाठ फ़ाइल में निम्न दो अक्षर डाल

System.IO.StreamReader streamReader = 
    new System.IO.StreamReader("input", System.Text.Encoding.UTF32, false); 
System.IO.StreamWriter streamWriter = 
    new System.IO.StreamWriter("output", false, System.Text.Encoding.UTF32); 

streamWriter.Write(streamReader.ReadToEnd()); 

streamWriter.Close(); 
streamReader.Close(); 

मैं:

鸕 
鸕 

(एक ही चरित्र दो बार, यानी इनपुट फ़ाइल! = आउटपुट)

कुछ चीजें जो मदद कर सकती हैं: 01 पहले वर्ण के लिएहेक्स:

15 9E 02 00

और दूसरा के लिए:

15 9E 00 00

मैं पाठ फ़ाइल निर्माण के लिए एडिट उपयोग कर रहा हूँ, सी # के लिए मोनो और मैं उबंटू का उपयोग कर रहा हूं।

इससे कोई फर्क नहीं पड़ता कि मैं इनपुट या आउटपुट फ़ाइल के लिए एन्कोडिंग निर्दिष्ट करता हूं, अगर यह यूटीएफ 32 एन्कोडिंग में है तो इसे पसंद नहीं है। यह काम करता है अगर इनपुट फ़ाइल यूटीएफ -8 एन्कोडिंग में है।

एफएफ एफई 00 00 15 9E 02 00 0A 00 00 00 15 9E 00 00 0A 00 00 00

यह एक बग है या यह मुझे सिर्फ यह है:

इनपुट फ़ाइल प्रकार है?

धन्यवाद!

+0

एन्कोडिंग? –

+0

'streamReader.ReadToEnd()' के परिणाम प्रिंट करें। – leppie

+0

@ एलबी - इसे बदलने से – AStupidNoob

उत्तर

5

के, इसलिए मैंने इसे सोचा, मुझे लगता है, ऐसा लगता है कि अब यह काम करता है। बाहर निकलता है, क्योंकि पात्रों के लिए कोड 15 9ई 02 00 और 15 9ई 00 00 थे, फिर कोई भी तरीका नहीं है कि उन्हें एक, एकल यूटीएफ -16 char में रखा जा सके। इसलिए, इसके बजाय यूटीएफ 16 इन सरोगेट जोड़े चीजों का उपयोग करता है जहां दो अलग-अलग वर्ण होते हैं जो एक 'तत्व' के रूप में कार्य करते हैं। तत्व प्राप्त करने के लिए, हम इसका उपयोग कर सकते हैं:

StringInfo.GetTextElementEnumerator(string fred); 

और यह सरोगेट जोड़े के साथ एक स्ट्रिंग देता है। इसे एक चरित्र के रूप में मानें।

यहाँ देखें:

http://msdn.microsoft.com/en-us/library/system.globalization.stringinfo.aspx

http://msdn.microsoft.com/en-us/library/system.globalization.textelementenumerator.gettextelement.aspx

आशा है कि यह मदद करता है किसी को: डी आउटपुट फ़ाइल का

0

लिखते समय आप यूटीएफ -32 निर्दिष्ट नहीं कर रहे हैं, इसलिए यह एन्कोडिंग.यूटीएफ 8 पर डिफ़ॉल्ट है।

MSDN से

:

यह निर्माता के बिना एक बाइट आदेश मार्क (बीओएम) है, इसलिए इसके GetPreamble विधि देता है एक खाली बाइट सरणी UTF-8 एन्कोडिंग के साथ एक StreamWriter पैदा करता है। यूटीएफ -8 एन्कोडिंग और बीओएम का उपयोग करके स्ट्रीमवाइटर बनाने के लिए, एक कन्स्ट्रक्टर का उपयोग करने पर विचार करें जो स्ट्रीमवाइटर (स्ट्रिंग, बूलियन, एन्कोडिंग) जैसे एन्कोडिंग निर्दिष्ट करता है।

+0

यह समस्या प्रतीत नहीं होती है। मैंने किसी भी भ्रम को दूर करने में मदद के लिए प्रश्न अपडेट किया है। वैसे भी धन्यवाद! – AStupidNoob

0

मुझे लगता है कि आपको अपने StreamWriter के लिए एक ही एन्कोडिंग (Encoding.UTF32) निर्दिष्ट करने की आवश्यकता है।

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

सामान्य रूप से इसे UTF codepages के बीच की जरूरत नहीं है, लेकिन मैं भी इस की कोशिश करेंगे:

Encoding utf8 = Encoding.UTF8; 
Encoding utf32 = Enconding.UTF32; 
byte[] utf8Bytes = utf8.GetBytes(yourText); 
byte[] utf32Bytes = Encoding.Convert(utf8, utf32, utf8Bytes); 
string utf32Text = iso.GetString(utf32Text); 
+0

मेरे पास है: डी, ​​मैंने अभी सवाल संपादित किया है।इसके अलावा यह वास्तव में कोई फर्क नहीं पड़ता, क्योंकि किसी भी यूटीएफ -32 चरित्र को यूटीएफ -8 में व्यक्त किया जा सकता है या उस मामले के लिए यूनिकोड एन्कोडिंग। AFAIK, वैसे भी। – AStupidNoob

+0

@AStupidNoob मैंने अभी आपके अपडेट किए गए उत्तर और आपकी टिप्पणियां पढ़ी हैं। यदि आप जानते हैं कि एन्कोडिंग क्या पढ़ी गई फ़ाइल है और यह यूटीएफ 32 के अलावा है तो आपको इसे अपने मूल एन्कोडिंग में पढ़ना होगा और इसे लिखने से पहले इसे अपने आप में परिवर्तित करना होगा। – Dummy01

+0

आपकी मदद के लिए धन्यवाद। मैंने आपके सुझाव की कोशिश की, लेकिन मैं इसे काम नहीं कर सका डी:। साथ ही, मैंने सोचा कि स्ट्रिंग रीडर और स्ट्रिंग राइटर्स का पूरा उद्देश्य एन्कोडिंग के बीच कनवर्ट करना था। शायद तब नहीं। – AStupidNoob

1

मैं इस कोशिश की और यह मेरे पीसी पर अच्छी तरह से काम करता है।

System.IO.StreamReader streamReader = new System.IO.StreamReader("input", true); 
System.IO.StreamWriter streamWriter = new System.IO.StreamWriter("output", false); 

streamWriter.Write(streamReader.ReadToEnd()); 

streamWriter.Close(); 
streamReader.Close(); 

हो सकता है कि पाठ आपको लगता है में UTF32 नहीं है।

+0

क्या आप विजुअल स्टूडियो/विंडोज का उपयोग कर रहे हैं? यदि नहीं तो यह सिर्फ मोनो हो सकता है। मैं यह सुनिश्चित करने के लिए अन्य कार्यक्रमों का प्रयास करूंगा कि यह वास्तव में यूटीएफ 32 है, यह निश्चित रूप से हेक्स संपादक में दिखता है ... – AStupidNoob

+0

ठीक है, शुभकामनाएं। लेकिन आपके कोड ने मेरे पीसी पर भी गलत आउटपुट बनाया। –

+1

ओह, क्षमा करें, मैंने आपके कोड में बदलाव नहीं देखा है। अन्य समाचारों में, विजुअल स्टूडियो 2012 बीटा का उपयोग करके मेरे कोड के साथ सही आउटपुट हुआ ... – AStupidNoob

0
StreamReader's constructor के लिए

MSDN की टिप्पणियां अनुभाग से:

यह निर्माता एन्कोडिंग के रूप में एन्कोडिंग पैरामीटर द्वारा निर्दिष्ट, और 1024 बाइट्स आंतरिक बफर आकार initializes। StreamReader ऑब्जेक्ट स्ट्रीम के पहले तीन बाइट्स को देखकर एन्कोडिंग का पता लगाने का प्रयास करता है। यह यूटीएफ -8, छोटे-एंडियन यूनिकोड, और बड़े-एंडियन यूनिकोड टेक्स्ट को स्वचालित रूप से पहचानता है यदि फ़ाइल उचित बाइट ऑर्डर अंकों के साथ शुरू होती है। अन्यथा, उपयोगकर्ता द्वारा प्रदत्त एन्कोडिंग का उपयोग किया जाता है। अधिक जानकारी के लिए एन्कोडिंग। गेटप्र्रीमबल विधि देखें।

अपनी फ़ाइल की शुरुआत में बहुत संभावना है बाइट क्रम के निशान वास्तव में UTF 16 (या कुछ और) संकेत कर रहे हैं, और इसलिए यह अपने स्पष्ट रूप से कहा UTF 32 एन्कोडिंग का उपयोग नहीं कर रहा है।

+0

निश्चित रूप से क्यों नहीं, मैं यह सुनिश्चित करने के लिए कुछ अन्य प्रोग्रामों का उपयोग करने की कोशिश करूंगा कि मुझे सही बीओएम मिल रहा है। – AStupidNoob

+0

@AStupidNoob ऐसा लगता है कि एक कन्स्ट्रक्टर ओवरलोड है जो बूलियन पैरामीटर जोड़कर बीओएम को नहीं देखेगा, यह कोशिश कर सकता है कि अगर आपके पास जांच करने के लिए कोई अन्य प्रोग्राम नहीं है। – Tanzelax

+0

ठीक है, मैंने सोचा होगा कि एन्कोडिंग निर्दिष्ट करने से यह सुनिश्चित होगा कि इसका उपयोग किया गया था, जाहिर है तो नहीं। हालांकि, मैंने इसके लिए विंडोज़ का उपयोग करने की कोशिश की और यह काम किया। लेकिन, मैं अपने यूटीएफ 32 आउटपुट को सत्यापित करने में सक्षम नहीं था क्योंकि मेरे पास यूटीएफ 32 के साथ अच्छी तरह से खेलने वाले कोई भी विंडोज प्रोग्राम नहीं हैं, इसलिए मैंने इसे यूटीएफ 8 में आउटपुट में बदल दिया। – AStupidNoob