【问题标题】:How to keep UTF-8 in batch for csv file?如何为csv文件批量保存UTF-8?
【发布时间】:2019-04-30 08:36:28
【问题描述】:

你好 Stackoverflow 社区!

我有一些值“{Null}”和“Null”的 .csv 文件。我使用带有 PowerShell 函数的批处理文件 (.cmd) 将这些值替换为“”。 问题是输出文件的编码 (utf-16le) 与输入 (UTF-8) 不同。有没有办法保留原来的编码?

powershell -Command "(gc myfile.csv) -replace '{NULL}', '' | Out-File myfile_replaced.csv"

我试图找到一个解决方案并理解,记事本默认具有 UTF-16le 编码。理论上,我可以更改 Notepad++ 的编码,但这不是一个选项,因为代码应该与其他人共享。

这应该在批处理中实现,否则我可以手动搜索和替换值。

【问题讨论】:

  • 您是否从未想过查看您使用过的命令的帮助?当你使用Out-File时,告诉它你想要什么编码,如果使用powershell的pre v6,你可以使用以下任何一个,ASCIIBigEndianUnicodeOEMUnicodeUTF7UTF8UTF8BOMUTF8NoBOMUTF32。在您的情况下,您似乎会使用 UTF8 之一,例如 Out-File myfile_replaced.csv -Encoding UTF8.
  • 如果输入文件是 UTF8 编码的(没有 BOM),您还需要使用 Get-Content 指定编码。 Out-File 将不可避免地包含 -Encoding UTF8 到 PSv5.1 的 BOM,@Compo 提到的 -Encoding UTF8NoBOM 特定于 PSv6+
  • 我的评论应该是“pre v6.2”,但感谢您发现它@LotPings。

标签: powershell csv utf-8


【解决方案1】:

Out-File 支持使用-Encoding 作为参数。对于其他各种写入文件的 cmdlet(例如 Export-Csv)也是如此。

根据文档:

-Encoding

指定导出的 CSV 文件的编码。默认值为 UTF8NoBOM。

此参数可接受的值如下:

  • ASCII:使用 ASCII(7 位)字符集的编码。
  • BigEndianUnicode:使用大端字节顺序以 UTF-16 格式编码。
  • OEM:对 MS-DOS 和控制台程序使用默认编码。
  • Unicode:使用 little-endian 字节顺序以 UTF-16 格式编码。
  • UTF7:以 UTF-7 格式编码。
  • UTF8:以 UTF-8 格式编码。
  • UTF8BOM:使用字节顺序标记 (BOM) 以 UTF-8 格式编码
  • UTF8NoBOM:以 UTF-8 格式编码,不带字节顺序标记 (BOM)
  • UTF32:以 UTF-32 格式编码。

从 PowerShell 6.2 开始,Encoding 参数还允许注册代码页的数字 ID(如 -Encoding 1251)或注册代码页的字符串名称(如 -Encoding "windows-1251")。有关详细信息,请参阅 Encoding.CodePage 的 .NET 文档。

【讨论】:

  • 除非使用标签 powershell-core,否则 IMO 不能假定 PowerShell 版本 6。
  • 这是 Out-File 至少从 PS 版本 3 开始的一项功能。请注意,帮助页面的最后一段提到了 PowerShell 6 的更改。
  • 您在答案中链接了 PSv6 文档,并且引用的 UTF8(no)BOM 编码是 PSv6+。
  • 如果您使用的是其他版本,请使用菜单更改文档版本。如果没有说明版本,可以假设最新版本 - 在大多数情况下,PS 也是向下兼容的。选项卡完成将告诉您安装可用的内容。如果您真的认为这是一个问题,请随时发布您自己的答案。无论默认值是什么,使用-Encoding 都将允许原始发布者专门设置他需要的编码。感谢您抽出宝贵时间发表评论。
【解决方案2】:

不幸的是,out-file 或“>”或“>>”默认为“unicode”或 utf16 编码。您甚至可以使用“>>”或“out-file -append”在同一个文件中混合两种编码。您可以改用 set-content 或“out-file -encoding utf8”。实际上 set-content 默认为 ansi 编码。但如果没有特殊字符,它将与 utf8 相同(没有 bom),或者您也可以使用带有 set-content 的 -encoding 选项。记事本默认为 ansi,但即使没有 bom 或编码签名也可以识别 utf8 或 unicode。

powershell -Command "(gc myfile.csv) -replace '{NULL}', '' | set-content myfile_replaced.csv"

【讨论】:

    猜你喜欢
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    相关资源
    最近更新 更多