可能涉及到的人,
我想使用 PowerShell 将 UTF-8 格式的 CSV 转换为 UTF-16。对于这个任务,我编写了以下代码行:
$schuelerCSVUTF8 = Get-Content -Path "C:\tmp\PSProjekt\schueler.csv" | Set-Content -Path "C:\tmp\PSProjekt\lol\schueler.csv" -Encoding Unicode -Force
我在 VS Code 中看到格式已正确更改为 UTF-16 LE。但有一个问题。
某些条目已正确转换:
转换之前,CSV 中的条目如下所示:
Z�rcher
。
转换后,如下所示:
Zürcher
。
但其他人不:
转换之前,CSV 中的条目如下所示(已经正确):
Meriç
转换后,它看起来像这样(现在是错误的):
Meriç
有谁知道解决方案或为什么会发生这种情况?
如果您的输入文件被解释为 UTF-8 文件并包含 both 字符串,例如
Z�rcher
和 Meriç
,则意味着 您的输入文件已损坏,如果 Z�rcher
本来就是Zürcher
:
�
的存在表示输入文件中设置了高位 的字节(或其序列)(即介于
U+FFFD
( 0x80
)和128
(0xFF
),包括 ) 不构成非 ASCII 范围字符的有效 UTF-8 编码。
解释为的UTF-8文件转换为UTF-16(LE)涉及不会丢失或转换信息,因此从255
到
Z�rcher
以及从的转换您描述的
Zürcher
到
Meriç
在这种情况下不可能发生。
Meriç
很可能是使用固定宽度、单字节编码(如 Windows-1252)的文件被 错误解释为 UTF-8 的结果,这是编码用作旧系统语言环境的 ANSI 代码页(例如,在美国英语和西欧版本的 Windows 上。
Z�rcher
很可能是错误地将UTF-8编码的文件解释为Windows-1252的结果。
PowerShell 版本有根本的不同,它们使用的字符编码默认情况下:
Windows PowerShell(旧版、Windows 附带、仅限 Windows 的 PowerShell 版本,其最新且最后一个版本为 5.1) 在其 Meriç
中默认使用 ANSI 编码
和
Set-Content
cmdlet(以及当它读取源代码时)。 也就是说,
Get-Content
BOM-less文件,
Set-Content
默认将BOM-less文件解释为 ANSI 编码。
PowerShell(核心)7(现代、跨平台、按需安装版本)始终使用(无 BOM)UTF-8。
是:
字符编码),请先修复它们并将其另存为 UTF-8。
Get-Content
读取它们以确保正确读取它们(在 PowerShell 7 中并非严格需要)。
-Encoding uf8