[[20211008184630]] 『テキストファイルをUTF16LE(BOM付き)で保存する』(KonNo) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『テキストファイルをUTF16LE(BOM付き)で保存する』(KonNo)

テキストファイルをUTF16LE(BOM付き)で保存する方法をお願いします

UTF8(BOM無し)の場合は、

    ネット情報を参考に下記で処理できています。

コードをUTF16LE(BOM付き)に改造したい

Sub UTF8_BOM_無_Write()

Dim Data(1 To 30) As String
Dim i As Single
Dim Path As String
Dim Ws As Worksheet
Dim LastNo As Single

Set Ws = Worksheets("Check")

LastNo = Ws.Cells(Rows.Count, "B").End(xlUp).Row

' 出力先パス作成
Path = "C:\Users\*******\Downloads\temp\List_(UTF8_BOM_Nothing).txt"

' 出力用テストデータ作成
For i = 1 To LastNo

   Data(i) = Ws.Cells(i, "B")
Next

' UTF8(BOMなし)ファイルを出力
Call WriteToUTF8NoBomFile(Path, Data())

End Sub


'UTF8(BOMなし)のファイルを出力する関数
Sub WriteToUTF8NoBomFile(ByRef OutputPath As String, ByRef OutputLines() As String, _
                        Optional InLineSeparator As String = "LF", _
                        Optional InOverWrite As Boolean = True)

   ' ADODBの設定パラメータ
   Const SaveCreateNotExist = 1
   Const SaveCreateOverWrite = 2
   Const TypeBinary = 1
   Const TypeText = 2
   Const lineSeparatorLF = 10
   Const lineSeparatorCRLF = -1
   Const WriteLine = 1
   Const notWriteLine = 0

   Dim objStreamUTF8: Set objStreamUTF8 = CreateObject("ADODB.Stream")  ' UTF8(BOM)ありのストリーム
   Dim objStreamUTF8NoBOM: Set objStreamUTF8NoBOM = CreateObject("ADODB.Stream")  ' UTF8(BOM)なしのストリーム

   Dim lineSeprator As Long  ' 改行コードを格納する変数
   Dim overWrite As Long  ' 上書きフラグを格納する変数
   Dim line As Variant  ' For Each用の一時変数

   ' 改行コードの設定
   If InLineSeparator = "CRLF" Then
      lineSeprator = lineSeparatorCRLF
   ElseIf InLineSeparator = "LF" Then
      lineSeprator = lineSeparatorLF
   Else
      MsgBox "改行コード(InLineSeparator)は CRLF か LF のみ使用可能です。"
      End
   End If

   ' 上書きするかどうかの設定
   If InOverWrite Then
      overWrite = SaveCreateOverWrite
   Else
      overWrite = SaveCreateNotExist
      If Dir(OutputPath) <> "" Then
            MsgBox "上書きしないオプションが設定されましたが、出力先パスは存在します。"
            End
      End If
   End If

   With objStreamUTF8
      .Charset = "UTF-8"
      .LineSeparator = lineSeprator
      .Open

      For Each line In OutputLines
            .WriteText line, WriteLine
      Next

      .Position = 3
   End With

   With objStreamUTF8NoBOM
      .Type = TypeBinary
      .Open
      objStreamUTF8.CopyTo objStreamUTF8NoBOM
      .SaveToFile OutputPath, overWrite
   End With

   objStreamUTF8.Close
   objStreamUTF8NoBOM.Close

End Sub

< 使用 Excel:Excel2019、使用 OS:Windows10 >


 FileSystemObjectのTextStreamでTristateTrueにして作ったテキストって、
 確かUTF-16のBOM付き(FF FE)だったと思いますよ。

(白茶) 2021/10/08(金) 19:18


 あ。
 ADODB.Streamでも Charset = "utf-16" でSaveToFileしたテキストも同じですね。

(白茶) 2021/10/08(金) 19:26


白茶さん、アドバイス感謝します。

私がUPしたコードを改造すれば問題は解決するとの意味だと思いますが ?

具体的には、

    以下のように書き換えるだけで良いのでしょうか ?

Sub UTF16_BOM_Write()

Path = "C:\Users\*******\Downloads\temp\List_(UTF16_BOM).txt"

' UTF16(BOM付き)ファイルを出力
Call WriteToUTF16BomFile(Path, Data())

'UTF8(BOMなし)のファイルを出力する関数
Sub WriteToUTF16BomFile(ByRef OutputPath As String, ByRef OutputLines() As String, _

                        Optional InLineSeparator As String = "LF", _
                        Optional InOverWrite As Boolean = True)

.Charset = "utf-16"

 With objStreamUTF16

      .Type = TypeBinary
      .Open
      objStreamUTF16.CopyTo objStreamUTF16
      .SaveToFile OutputPath, overWrite
   End With

(KonNo) 2021/10/09(土) 06:18


 'ADODB.Streamの場合 (Position指定でBinaryモードにコピーしてから保存←とかしなくてもUTF-16(LE)で書き込まれる)
    With New ADODB.Stream
        .Open
        .Charset = "utf-16"
          For Each line In OutputLines
                .WriteText line, adWriteLine '(Const adWriteLine = 1)
          Next
        .SaveToFile OutputPath, adSaveCreateNotExist '(Const adSaveCreateNotExist = 1)
        .Close
    End With

 'FileSystemObject.TextStreamの場合(TristateTrueで保存すればUTF-16(LE)で書き込まれる)
    With New Scripting.FileSystemObject
        With .OpenTextFile(OutputPath, ForWriting, True, TristateTrue)'(Const ForWriting = 2)(Const TristateTrue = -1 (&HFFFFFFFF))
            For Each line In OutputLines
                .WriteLine line
            Next
            .Close
        End With
    End With

 実際に両方バイナリエディタで見てみましたけど、先頭は「FF FE」で始まってましたよ。

(白茶) 2021/10/09(土) 09:32


白茶さん、回答ありがとうございます。

お陰様で何とか解決できそうです。
(KonNo) 2021/10/10(日) 04:51


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.