在 PowerShell 中将 UTF-8-CSV 转换为 UTF-16 (Unicode)

问题描述 投票:0回答:1

可能涉及到的人,

我想使用 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ç

有谁知道解决方案或为什么会发生这种情况?

powershell csv unicode utf-8 utf-16
1个回答
0
投票
  • 如果您的输入文件被解释为 UTF-8 文件并包含 both 字符串,例如

    Z�rcher
    Meriç
    ,则意味着 您的输入文件已损坏,如果
    Z�rcher
    本来就是
    Zürcher

  • 解释为的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
      • 默认使用 ANSI 编码创建
        BOM-less
        文件,Set-Content默认将
        BOM-less
        文件解释为 ANSI 编码。
    • PowerShell(核心)7(现代、跨平台、按需安装版本)始终使用(无 BOM)UTF-8

您的情况的
结果

是:

    如果输入文件确实损坏(包含
  • mix

    字符编码),请先修复它们并将其另存为 UTF-8。

  • 然后,使用
  • Get-Content

    读取它们以确保正确读取它们(在 PowerShell 7 中并非严格需要)。

    
    

  • -Encoding uf8
	
© www.soinside.com 2019 - 2024. All rights reserved.