VBA读写UTF-8带BOM文件:如何保留BOM与特殊字符?
处理UTF-8带BOM文件的VBA读写问题
问题现象
原文件为UTF-8带BOM编码,十六进制开头为ef bb bf(对应Notepad++中显示的)。使用VBA修改后出现两种异常情况:
- Open/Print写入方式:特殊字符(如
Ω)会被替换为O,但BOM保持正常,原应用可正常读取; - ADODB.Stream写入方式:能保留特殊字符,但BOM被破坏,文件开头变为
(十六进制ef bb bf c3 af c2 bb c2 bf),导致原应用无法读取。
问题根源
原读取方式使用Open/Input语句时,会将UTF-8的BOM标记当作普通文本字符读入fileContent中。后续用ADODB.Stream写入时,Stream会自动添加新的UTF-8 BOM,加上原内容中已存在的BOM字符被二次转码,最终形成双重BOM的异常格式。
解决方案
统一使用ADODB.Stream完成读写操作:读取时Stream会自动识别并跳过UTF-8 BOM,不会将其纳入内容;写入时Stream会自动添加正确的单个UTF-8 BOM,同时保留所有特殊字符。
修正后的读取代码
Dim stream As Object Dim fileContent As String Set stream = CreateObject("ADODB.Stream") With stream .Type = 2 ' adTypeText .Charset = "UTF-8" .Open .LoadFromFile filePath fileContent = .ReadText .Close End With Set stream = Nothing
修正后的写入代码
Dim stream As Object If fileContent <> modifiedContent Then Set stream = CreateObject("ADODB.Stream") With stream .Type = 2 ' adTypeText .Charset = "UTF-8" .Open .WriteText modifiedContent .SaveToFile filePath, 2 ' adSaveCreateOverWrite .Close End With Set stream = Nothing MsgBox "文件已成功修改。" Else MsgBox "无需修改文件。" End If
说明
- 确保读写都使用ADODB.Stream并指定
Charset = "UTF-8",Stream会自动处理BOM的识别和生成; - 该方案既保留特殊字符,又保证文件的UTF-8带BOM格式正确,原应用可正常读取。
内容的提问来源于stack exchange,提问作者Tanquen
相关产品推荐
相关产品推荐

