2012-05-04 25 views
8

में संलग्न करने में टेक्स्ट फ़ाइल लिखें (यूटीएफ -8 एन्कोडेड) मुझे वीबी 6 में टेक्स्टफाइल लिखना है। मुझे इसे एपेंडिंग और यूटीएफ -8 एन्कोडेड में करने की ज़रूरत है।वीबी 6

मैंने दो समाधानों की कोशिश की, एक "टेक्स्टस्ट्रीम" और "एडीओडीबी.स्ट्रीम" वाला दूसरा।

पहले एक:

Set fsoFile = fso.OpenTextFile(FileIn(fi), ForAppending, True) 
    fsoFile.WriteLine "<tag>kkkjòòkkkkjlòlk</tag>" 
    fsoFile.Close 

जोड़कर में अच्छा काम करता है, लेकिन मैं यह कैसे लिख सकते हैं utf-8 इनकोडिंग?

दूसरा एक: utf-8 में

Dim ST As ADODB.Stream 

Set ST = New ADODB.Stream 
ST.Mode = adModeReadWrite 
ST.Type = adTypeText 
ST.Charset = "UTF-8" 

ST.Open 
ST.LoadFromFile FileIn(fi) 
ST.Position = ST.Size 
ST.WriteText "<tag>kkkjòòkkkkjlòlk</tag>" 
ST.SaveToFile FileIn(fi) 
ST.Close 

लिखें सही ढंग से, लेकिन मैं केवल "adSaveCreateOverWrite" के साथ जोड़कर लेकिन में फ़ाइल नहीं लिख सकते हैं।

मैं यह कैसे कर सकता हूं? क्या कोई और तरीका है?

बहुत बहुत धन्यवाद।

+1

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

+0

दुर्भाग्य से मैं बड़ी टेक्स्ट फ़ाइल के साथ काम कर रहा हूं। मुझे लगता है कि इसे खोलें और प्रत्येक लूप को मौजूदा पाठ को पढ़ें मेरे आवेदन के लिए एक भारी काम होगा। – epi82

उत्तर

7

आप एक API कॉल के साथ बाइनरी आई/ओ गठबंधन UTF-8 में रूपांतरण करने के लिए कर सकते हैं:

Option Explicit 

Private Const CP_UTF8 As Long = 65001 

Private Declare Function WideCharToMultiByte Lib "kernel32" (_ 
    ByVal CodePage As Long, _ 
    ByVal dwFlags As Long, _ 
    ByVal lpWideCharStr As Long, _ 
    ByVal cchWideChar As Long, _ 
    ByVal lpMultiByteStr As Long, _ 
    ByVal cchMultiByte As Long, _ 
    ByVal lpDefaultChar As Long, _ 
    ByVal lpUsedDefaultChar As Long) As Long 

Private Function OpenAppendUTF8(ByVal FileName As String) As Integer 
    OpenAppendUTF8 = FreeFile(0) 
    Open FileName For Binary Access Write As #OpenAppendUTF8 
    Seek #OpenAppendUTF8, LOF(OpenAppendUTF8) + 1 
End Function 

Private Sub WriteUTF8(_ 
    ByVal FNum As Integer, _ 
    ByVal Text As String, _ 
    Optional ByVal NL As Boolean) 

    Dim lngResult As Long 
    Dim UTF8() As Byte 

    If NL Then Text = Text & vbNewLine 
    lngResult = WideCharToMultiByte(CP_UTF8, 0, StrPtr(Text), Len(Text), _ 
            0, 0, 0, 0) 
    If lngResult > 0 Then 
     ReDim UTF8(lngResult - 1) 
     WideCharToMultiByte CP_UTF8, 0, StrPtr(Text), Len(Text), _ 
          VarPtr(UTF8(0)), lngResult, 0, 0 
     Put #FNum, , UTF8 
    End If 
End Sub 

Private Sub Main() 
    Dim F As Integer 

    F = OpenAppendUTF8("test.txt") 
    WriteUTF8 F, "Hello" 
    WriteUTF8 F, ChrW$(&H2026&) 
    WriteUTF8 F, "World", True 
    Close #F 
    MsgBox "Done" 
End Sub 
+1

यदि 'LOF (OpenAppendUTF8)' शून्य है तो बस यूटीएफ -8 बीओएम जोड़ें। – wqw

+0

असल में यूटीएफ -8 फाइलों को * बीओएम * नहीं माना जाता है, हालांकि आप उन्हें अक्सर विंडोज फाइलों पर देखेंगे। http://en.wikipedia.org/wiki/UTF-8#Byte_order_mark तो हाँ, अगर आपको ऐसे बीओएम की आवश्यकता है तो सुझाव दिया गया है। यह भी ध्यान रखें कि यूटीएफ -8 फ़ाइलों को अक्सर सीआरएलएफ लाइन डिलीमीटर के बजाय एलएफ होने की उम्मीद है, एक और ट्विक कर सकता है। – Bob77

0

मैं इसे एएनएसआई को बचाने के लिए के रूप में यह डिफ़ॉल्ट रूप से करता है पसंद करते हैं। इसे नोटपैड के साथ खोलें और इसे यूटीएफ 8 एन्कोडिंग का चयन करें। मैंने पाया कि यह अब तक का सबसे तेज़ तरीका है। और मैं कुछ अन्य कोड, उदाहरण के लिए एक डेटाबेस रूपांतरण के लिए उपयोग करें संलग्न करने के लिए:

Dim fs As Object, a 
Set fs = CreateObject("Scripting.FileSystemObject") 
Set a = fs.CreateTextFile(filename, True) 'example (myfile.xml, True) 
a.writeline var1 
a.writeline var2 
a.Close 
+0

क्या यह काम करता है? मैंने सोचा कि यदि आप इसे एएनएसआई के साथ पहले लिखते हैं तो आप अपने चरित्र सेट को सीमित कर रहे हैं। एएनएसआई के बाद यूटीएफ 8 में इसे सहेजना नहीं होगा, केवल एएनएसआई चरित्र सेट के यूटीएफ संस्करण में परिणाम होगा? तो यदि आपका पाठ रूसी में था, तो क्या आप वास्तव में उचित पात्र बनाएंगे? CreateTextFile एक और "ट्रू" जोड़ कर यूनिकोड (यूटीएफ 16) के रूप में सहेज सकता है, तो आप शायद इसे वर्डपैड में परिवर्तित कर सकते हैं या कुछ खोए बिना यूटीएफ 8 में कुछ बदल सकते हैं। – JeffG