[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『テキストファイルを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
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.