2012-05-04 14 views
8

VB6でテキストファイルを作成する必要があります。私はappendとutf-8でエンコードする必要があります。テキストファイルをVB6で追加(utf-8エンコード)して書き込みます。

"TextStream"と "ADODB.Stream"の2つのソリューションを試しました。

最初の1:

追加で良い作品が、どのように私はそれがUTF-8エンコードを書くことができます

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

秒1

: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 Streamオブジェクトを使用して、あなたが追加されているファイルは、あなたがに既存のテキストを読んで、それを開くことができますあまりにも大きくない場合変数を作成し、変数を書き出し、新しいテキストを戻します。また、毎回新しいファイルを開き、既存のテキストを書き込んだり新しいテキストを書き込んだりすることもできます。現在のファイルを強制終了し、新しいファイルの名前を変更します。複雑ではありますが、ユーザーが待っていない小さなファイルの場合は、すばやく動作します。 – jac

+0

残念ながら私は大きなテキストファイルで作業しています。私はそれを開いて、各ループの既存のテキストを読むことは、私のアプリケーションのための重い作業になると思います。 – epi82

答えて

7

あなたはUTF-8への変換を実行するためのAPI呼び出しでバイナリI/Oを組み合わせることができます

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)がゼロの場合は、UTF-8 BOMを追加するだけです。 – wqw

+0

実際、UTF-8ファイルはBOMを持つことは決してありませんが、Windowsファイルでよく見られます。 http://en.wikipedia.org/wiki/UTF-8#Byte_order_markしたがって、そういったBOMが必要な場合は追加してください。また、UTF-8ファイルはCRLFの区切り文字の代わりにLFを持つことが多いと考えられています。 – Bob77

0

私はそれがデフォルトで行うようにそれをANSIを保存することを好みます。メモ帳でそれを開き、UTF8エンコーディングを選択して上書きします。私はそれがはるかに速い方法だとわかった。 そして私のデータベースconvertionため、たとえば、追加するためにいくつかの他のコードを使用します。

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

これは機能しますか?私はあなたがANSIで最初にそれを書くと、あなたのキャラクタセットを制限していると思っていました。それがANSIの後にUTF8で保存しないと、UTFバージョンのANSI文字セットが返されますか?あなたのテキストがロシア語であれば、本当に適切な文字を維持しますか? CreateTextFileは、別の「True」を追加することでUnicode(UTF16)として保存できます。おそらくワードパッドやUTF8に変換することができます。 – JeffG

関連する問題