【发布时间】: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
我有一个用 atom 创建的 html 文件 test.html,其中包含:
Testé 编码 utf-8
当我使用 Powershell 控制台阅读时(我使用的是法语 Windows)
Get-Content -Raw test.html
我回来了:
Testé encoding utf-8
为什么重音字符不能正确打印?
【问题讨论】:
标签: powershell utf-8 utf
Atom editor 默认创建 UTF-8 文件pseudo-BOM(从跨平台的角度来看,这是正确的做法)。
Windows PowerShell[1] 仅识别 UTF-8 文件带有伪 BOM。
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 的文件。
【讨论】:
# 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'}
}
}
【讨论】:
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。你得到了什么?
UTF-8 Signature。是的,你是对的,因为当我使用标准 UTF-8 不带签名时,我也会从函数中得到 ascii