PowerShell中Sqlite两种.dump调用方式UTF-8字符处理差异问询
两种SQLite导出命令的核心差异与乱码原因
核心差异
- 第一种方式:导出逻辑完全在sqlite3进程内部完成,通过sqlite3内置的
.output命令直接将dump结果写入目标文件,整个过程不经过PowerShell的管道传递,没有中间层的编码转换。sqlite3默认输出UTF-8编码的文本,直接落盘时所有Unicode字符可以原样保留。 - 第二种方式:sqlite3将dump结果输出到标准输出流(stdout),经过PowerShell管道传递给
Set-Content命令后再写入文件,传输过程会经过PowerShell的编码转换逻辑,编码不匹配时就会出现乱码。
乱码根因
你看到的GÇÖ是典型的UTF-8字符被错误使用Windows-1252(西欧编码)解码再重编码的结果:右单引号’的UTF-8编码为0xE2 0x80 0x99,这三个字节按Windows-1252解码就会对应G、Ç、Ö三个字符。
第二种方式的编码错误出在两个节点:
- PowerShell接收外部程序(sqlite3)的标准输出时,默认使用系统默认ANSI编码(简体中文系统为GBK、西欧系统为Windows-1252)解码,但sqlite3的标准输出是UTF-8编码,解码逻辑不匹配直接导致字符识别错误。
- 即使第一步解码正常,
Set-Content默认写入文件的编码也是系统默认ANSI编码,不是UTF-8,二次编码转换会进一步破坏Unicode字符。
第二种方式的修复方案
要保留管道写法的灵活性,只需要显式指定全链路的编码为UTF-8即可:
# 临时修改PowerShell接收外部程序输出的编码为UTF-8 $OutputEncoding = [Console]::OutputEncoding = [Text.UTF8Encoding]::new($false) # 写入文件时显式指定UTF-8编码 sqlite3 database.db .dump | Set-Content output.sql -Encoding UTF8
如果需要生成无BOM的UTF-8文件(绝大多数数据库导入工具的默认要求),PowerShell 7+可直接使用-Encoding UTF8NoBOM参数;Windows PowerShell 5.1可以使用以下写法:
$OutputEncoding = [Console]::OutputEncoding = [Text.UTF8Encoding]::new($false) $dumpContent = sqlite3 database.db .dump [IO.File]::WriteAllText("output.sql", $dumpContent, [Text.UTF8Encoding]::new($false))
内容的提问来源于stack exchange,提问作者Kamalpreet Singh
相关产品推荐
相关产品推荐

