带有德国变音符号的导入-CSV/导出-Csv (ä,ö,ü)

Pet*_*ore 6 powershell character-encoding import-csv export-csv

我在处理 csv 导出时遇到了一个小问题,其中包含像 ä,ö,ü(德语元音变音)这样的变异元音

我只是导出

Get-WinEvent -FilterHashtable @{Path=$_;ID=4627} -ErrorAction SilentlyContinue |export-csv -NoTypeInformation -Encoding Default -Force ("c:\temp\CSV_temp\"+ $_.basename + ".csv")
Run Code Online (Sandbox Code Playgroud)

这工作正常。我的 csv 文件中有 ä,ö,ü 正确。

之后我做了一些排序:

Get-ChildItem 'C:\temp\*.csv' |
    ForEach-Object { Import-Csv $_.FullName } |
    Sort-Object { [DateTime]::ParseExact($_.TimeCreated, $pattern, $culture) } |
    Export-Csv 'C:\temp\merged.csv' -Encoding Default -NoTypeInformation -Force
Run Code Online (Sandbox Code Playgroud)

我尝试了所有编码、ASCII、BigEndianUnicode、UniCode,但都没有成功。

导出和排序时如何保留特殊字符 ä,ö,ü 等?

mkl*_*nt0 6

Mathias R. Jessen在对该问题的评论中提供了关键点:

\n\n

在您的情况下,问题的原因是调用,而不是Import-CsvExport-Csv

\n\n

与 一样Export-CsvImport-Csv也需要传递-Encoding Default才能正确处理使用系统的活动“ANSI”旧代码页编码的文本文件,这是一种 8 位、单字节字符编码,例如 Windows-1252。

\n\n

Windows PowerShell中,尽管通用文本文件处理Get-Content/ Set-Contentcmdlet对默认Default编码(顾名思义),但遗憾且令人惊讶的是,Import-Csv事实Export-Csv并非如此

\n\n

请注意,读取时仅在输入文件没有BOM(字节顺序标记,又名 Unicode 签名,文件开头的魔术字节序列,明确标识文件的编码)时才假定默认编码。

\n\n

不仅 和Import-Csv的默认值与/Export-Csv不同,而且它们各自具有不同的默认值:Get-ContentSet-Content

\n\n
    \n
  • Import-Csv默认为 UTF-8
  • \n
  • Export-Csv默认为 ASCII(!),这意味着任何非 ASCII 字符 - 例如\xc3\xa4, \xc3\xb6, \xc3\xbc- 都会被音译为文字 ?字符,从而导致数据丢失
  • \n
\n\n
\n\n

相比之下,在PowerShell Core(基于 .NET Core 构建的跨平台版本)中,默认编码是(无 BOM)UTF-8,在所有 cmdlet 中一致,这大大简化了问题,并且更容易确定何时确实需要使用该-Encoding参数。

\n\n
\n\n

Import-CsvWindows PowerShell /Export-Csv行为演示

\n\n

Import-Csv- 默认为UTF-8

\n\n
# Sample CSV content.\n$str = @\'\nColumn1\na\xc3\xa4\xc3\xb6\xc3\xbc\n\'@\n\n# Write sample CSV file \'t.csv\' using UTF-8 encoding *without a BOM*\n# (Note that this cannot be done with standard PowerShell cmdlets.)\n$null = new-item -type file t.csv -Force\n[io.file]::WriteAllLines((Convert-Path t.csv), $str)\n\n# Use Import-Csv to read the file, which correctly preserves the UTF-8-encoded\n# umlauts\nImport-Csv .\\t.csv\n
Run Code Online (Sandbox Code Playgroud)\n\n

上面的结果是:

\n\n
Column1\n-------\na\xc3\xa4\xc3\xb6\xc3\xbc\n
Run Code Online (Sandbox Code Playgroud)\n\n

正如您所看到的,变音符号被正确保留。

\n\n

相比之下,如果文件是“ANSI”编码的($str | Set-Content t.csv-Encoding Default隐含的),变音符号就会被损坏。

\n\n
\n\n

Export-Csv- 默认为ASCII - 数据丢失的风险

\n\n

基于上面的例子:

\n\n
Import-Csv .\\t.csv | Export-Csv .\\t.new.csv\nGet-Content .\\t.new.csv\n
Run Code Online (Sandbox Code Playgroud)\n\n

产量:

\n\n
"Column1"\n"a???"\n
Run Code Online (Sandbox Code Playgroud)\n\n

正如您所看到的,元音变音被替换为字面问号( ?)。

\n