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