vCards

2010-12-04 14 views
6

मैं सी # में एक प्रोग्राम है जो एक vCard (वीसीएफ) प्रत्येक संपर्क के लिए अलग-अलग फ़ाइलों में एकाधिक संपर्कों के साथ फ़ाइल विभाजित कर देगा लिखने के लिए कोशिश कर रहा हूँ के लिए विंडोज़ -1252 को यूनिकोड में कनवर्ट। मैं समझता हूं कि अधिकांश मोबाइल फोनों को पढ़ने के लिए vCard को एएनएसआई (1252) के रूप में सहेजने की आवश्यकता है।vCards

हालांकि, अगर मैं StreamReader का उपयोग कर एक वीसीएफ फ़ाइल को खोलने और फिर इसे वापस लिखने StreamWriter (एन्कोडिंग प्रारूप के रूप में 1252 की स्थापना) के साथ, å, æ और ø की तरह सभी विशेष वर्ण ? के रूप में लिखा जा रहा है। निश्चित रूप से एएनएसआई (1252) इन पात्रों का समर्थन करेगा। मैं यह कैसे तय करुं?

संपादित करें: यहां कोड का वह टुकड़ा है जिसका उपयोग मैं फ़ाइल को पढ़ने और लिखने के लिए करता हूं।

private void ReadFile() 
{ 
    StreamReader sreader = new StreamReader(sourceVCFFile); 
    string fullFileContents = sreader.ReadToEnd(); 
} 

private void WriteFile() 
{ 
    StreamWriter swriter = new StreamWriter(sourceVCFFile, false, Encoding.GetEncoding(1252)); 
    swriter.Write(fullFileContents); 
} 

उत्तर

12

आप यह सोचते हैं कि विंडोज़ -1252 विशेष वर्ण आप ऊपर सूचीबद्ध का समर्थन करता है में सही कर रहे हैं (पूरी सूची के लिए Wikipedia entry देखें)।

Look at the cool letters I can make: å, æ, and ø!

कोई प्रश्न चिह्न पाया जा सकता है:

using (var writer = new StreamWriter(destination, true, Encoding.GetEncoding(1252))) 
{ 
    writer.WriteLine(source); 
} 

अपने परीक्षण एप्लिकेशन में यह ऊपर कोड का उपयोग कर इस परिणाम का उत्पादन किया। क्या आप StreamReader के साथ इसे पढ़ते समय एन्कोडिंग सेट कर रहे हैं?

संपादित करें: तुम बस Encoding.Convert उपयोग करने के लिए विंडोज़ -1252 में UTF-8 वीसीएफ फ़ाइल को रूपांतरित करने में सक्षम होना चाहिए। Regex.Replace के लिए कोई ज़रूरत नहीं है। यहाँ

// You might want to think of a better method name. 
public string ConvertUTF8ToWin1252(string source) 
{ 
    Encoding utf8 = new UTF8Encoding(); 
    Encoding win1252 = Encoding.GetEncoding(1252); 

    byte[] input = source.ToUTF8ByteArray(); // Note the use of my extension method 
    byte[] output = Encoding.Convert(utf8, win1252, input); 

    return win1252.GetString(output); 
} 

और कैसे अपने एक्सटेंशन विधि लग रहा है:: यहाँ मैं इसे कैसे करना होगा है

public static class StringHelper 
{ 
    // It should be noted that this method is expecting UTF-8 input only, 
    // so you probably should give it a more fitting name. 
    public static byte[] ToUTF8ByteArray(this string str) 
    { 
     Encoding encoding = new UTF8Encoding(); 
     return encoding.GetBytes(str); 
    } 
} 

इसके अलावा, आप शायद add usings to your ReadFile and WriteFile methods.

+0

चाहता हूँ मुझे लगता है कि करने के लिए महत्वपूर्ण ओपी की समस्या आपका आखिरी सवाल है: सुनिश्चित करें कि वीसीएफ को पढ़ने वाले 'स्ट्रीम रीडर' में 1252 एन्कोडिंग सेट है। –

+0

मैं 'StreamReader' का उपयोग कर फ़ाइल पढ़ने के दौरान एन्कोडिंग सेट नहीं कर रहा हूं। और मैं आपके नमूने के रूप में कोड के उसी टुकड़े का उपयोग कर काफी ज्यादा हूं। लेकिन इनपुट वीसीएफ फ़ाइल यूटीएफ -8 में है। किसी कारण से, सोनी एरिक्सन की "बैकअप टू एमएस" सुविधा यूटीएफ -8 में वीसीएफ फाइल को बचाती है! – GPX

+0

@GPX: मेरा अद्यतन उत्तर देखें, मुझे लगता है कि इसे आपकी समस्या का समाधान करना चाहिए। – Kredns