【问题标题】:Powershell and UTF-8Powershell 和 UTF-8
【发布时间】:2017-03-01 21:38:14
【问题描述】:

我有一个用 atom 创建的 html 文件 test.html,其中包含:

Testé 编码 utf-8

当我使用 Powershell 控制台阅读时(我使用的是法语 Windows)

Get-Content -Raw test.html

我回来了:

Testé encoding utf-8

为什么重音字符不能正确打印?

【问题讨论】:

    标签: powershell utf-8 utf


    【解决方案1】:
    • Atom editor 默认创建 UTF-8 文件pseudo-BOM(从跨平台的角度来看,这是正确的做法)。

    • Windows PowerShell[1] 仅识别 UTF-8 文件带有伪 BOM

      • 在没有伪 BOM 的情况下,PowerShell 将文件解释为根据系统的旧 ANSI 代码页进行格式化,例如美国系统上的 Windows-1252
        (这也是记事本使用的默认编码,它称为“ANSI”,不仅在读取文件时,而且在创建文件时也是如此。Windows PowerShell 的@987654327 同上@ / Set-Content(此编码称为Default,是实际默认值,因此无需指定);相比之下,Out-File / > 创建 UTF-16LE-默认情况下编码文件 (Unicode)。)

    因此,为了让Get-Content 在 Windows PowerShell 中正确识别 BOM-less UTF-8 文件,您必须使用 -Encoding utf8


    [1] 相比之下,跨平台的 PowerShell Core 版本值得称道默认为 UTF-8,在 cmdlet 中始终如一地读取和写入,因此它确实解释了 UTF- 8 编码文件即使没有 BOM 也能正确创建,默认情况下也会创建没有 BOM 的文件。

    【讨论】:

    • 绝对漂亮的答案。 SO很高兴你的出现。谢谢!!
    • 我很高兴听到这个消息,@jtubre,感谢您的反馈。
    【解决方案2】:
    # Created a UTF-8 Sig File 
    notepad .\test.html
    
    # Get File contents with/without -raw
    cat .\test.html;Get-Content -Raw .\test.html
    Testé encoding utf-8
    Testé encoding utf-8
    
    # Check Encoding to make sure
    Get-FileEncoding .\test.html
    utf8
    

    如您所见,它绝对适用于 Windows 10 上的 PowerShell v5。我会仔细检查文件格式和您创建的文件的内容,因为可能引入了您的编辑器可能无法识别的字符。

    如果您的 PowerShell 中没有 Get-FileEncoding 作为 cmdlet,您可以运行以下实现:

    function Get-FileEncoding([Parameter(Mandatory=$True)]$Path) {
        $bytes = [byte[]](Get-Content $Path -Encoding byte -ReadCount 4 -TotalCount 4)
    
        if(!$bytes) { return 'utf8' }
    
        switch -regex ('{0:x2}{1:x2}{2:x2}{3:x2}' -f $bytes[0],$bytes[1],$bytes[2],$bytes[3]) {
            '^efbbbf'   {return 'utf8'}
            '^2b2f76'   {return 'utf7'}
            '^fffe'     {return 'unicode'}
            '^feff'     {return 'bigendianunicode'}
            '^0000feff' {return 'utf32'}
            default     {return 'ascii'}
        }
    }
    

    【讨论】:

    • 尽管我在 Windows 10 上,但我的 Powershell 无法识别 Get-FileEncoding ?
    • OP 使用 GitHub 的 Atom 编辑器创建了他们的文件,该编辑器默认创建 没有伪 BOM 的 UTF-8 文件,这就是问题的原因。默认情况下,记事本创建 UTF-8 文件 - 默认情况下它使用系统的旧代码页(例如,英语系统上的 Windows-1252),PowerShell 也是如此当 读取 没有 BOM 的文件时,这就是您没有看到问题的原因。顺便说一句:cat 只是 Windows 上Get-Content 的别名,因此没有必要对比这两个命令。
    • Get-FileEncoding 不是标准 cmdlet。检查文件的最佳方法是使用标准 cmdlet Format-Hex (PSv5+) 并研究原始字节。我发现了两个可能的Get-FileEncoding 来源:来自here at poshcode.org 或作为PowerShell 库中PowerShellCookbook module 的一部分。两个版本都不为我报告 UTF-8(Windows 10,PSv5.1):前者只查找 BOM,如果没有则报告 ASCII(test.html 是这样);同样,后者回退到 UTF-7。
    • 感谢您提供Get-FileEncoding 功能。但是,就像我链接的版本一样,它只查看BOMs,当它报告ascii时,这实际上意味着“我不知道编码是什么,因为文件没有BOM "(我有点好奇为什么零字节文件是utf8)。但是,足以验证您关于记事本默认创建 UTF-8 文件的声明:如果我按照您在回答中的说明,使用您的功能 - 确保没有预先存在的文件 .\test.html 并粘贴文本 Testé encoding utf-8 ,我得到ascii不是utf8。你得到了什么?
    • 所以我使用Notepad2,因此能够将文件编码更改为:UTF-8 Signature。是的,你是对的,因为当我使用标准 UTF-8 不带签名时,我也会从函数中得到 ascii
    猜你喜欢
    • 2014-04-16
    • 1970-01-01
    • 2020-12-09
    • 2017-05-07
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 2011-10-11
    • 2017-05-19
    相关资源
    最近更新 更多