当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 关于字符编码

作者:精品下载站 日期:2024-12-14 02:24:23 浏览:15 分类:玩电脑

关于字符编码


简短描述

描述 PowerShell 如何使用字符编码进行字符串数据的输入和输出。

详细描述

Unicode 是全球字符编码标准。系统专门使用 Unicode 进行字符和字符串操作。有关 Unicode 各方面的详细说明,请参阅 Unicode 标准。

Windows 支持 Unicode 和传统字符集。传统字符集(例如 Windows 代码页)使用 8 位值或 8 位值的组合来表示特定语言或地理区域设置中使用的字符。

PowerShell 默认使用 Unicode 字符集。但是,一些 cmdlet 具有 Encoding 参数,可以指定不同字符集的编码。此参数允许您选择与其他系统和应用程序互操作所需的特定字符编码。

以下 cmdlet 具有 Encoding 参数:

  • Microsoft.PowerShell.Management

    • Add-Content
  • Get-Content
  • Set-Content
  • Microsoft.PowerShell.Utility

    • Export-Clixml
  • Export-Csv
  • 导出-PSSession
  • Format-Hex
  • Import-Csv
  • Out-File
  • Select-String
  • Send-MailMessage
  • 字节顺序标记

    字节顺序标记 (BOM) 是文件或文本流的前几个字节中的 Unicode 签名,指示数据使用哪种 Unicode 编码。有关更多信息,请参阅字节顺序标记文档。

    在 Windows PowerShell 中,任何 Unicode 编码(UTF7 除外)始终会创建 BOM。对于所有文本输出,PowerShell(v6 及更高版本)默认为 utf8NoBOM

    为了获得最佳的整体兼容性,请避免在 UTF-8 文件中使用 BOM。 Unix 平台和 Windows 平台上使用的 Unix 继承实用程序不支持 BOM。

    同样,应避免 UTF7 编码。 UTF-7 不是标准的 Unicode 编码,在所有版本的 PowerShell 中都是不带 BOM 编写的。

    在类 Unix 平台上创建 PowerShell 脚本或在 Windows 上使用跨平台编辑器(例如 Visual Studio Code)会生成使用 UTF8NoBOM 编码的文件。这些文件在 PowerShell 中工作正常,但如果文件包含非 Ascii 字符,则可能会在 Windows PowerShell 中损坏。

    如果您需要在脚本中使用非 Ascii 字符,请将它们保存为带有 BOM 的 UTF-8。如果没有 BOM,Windows PowerShell 会将您的脚本误解为使用旧版“ANSI”代码页进行编码。相反,具有 UTF-8 BOM 的文件在类 Unix 平台上可能会出现问题。许多 Unix 工具如 catsedawk 和一些编辑器如 gedit 不知道如何操作来处理BOM。

    Windows PowerShell 中的字符编码

    在 PowerShell 5.1 中,Encoding 参数支持以下值:

    • Ascii 使用 Ascii(7 位)字符集。
    • BigEndianUnicode 使用具有大端字节顺序的 UTF-16。
    • BigEndianUTF32 使用具有大端字节顺序的 UTF-32。
    • Byte 将一组字符编码为字节序列。
    • 默认 使用与系统活动代码页相对应的编码(通常为 ANSI)。
    • Oem 使用与系统当前 OEM 代码页相对应的编码。
    • 字符串Unicode 相同。
    • Unicode 使用 UTF-16 和小端字节顺序。
    • 未知Unicode 相同。
    • UTF32 使用具有小端字节顺序的 UTF-32。
    • UTF7 使用 UTF-7。
    • UTF8 使用 UTF-8(带 BOM)。

    通常,Windows PowerShell 默认使用 Unicode UTF-16LE 编码。但是,Windows PowerShell 中 cmdlet 使用的默认编码并不一致。

    笔记

    使用任何 Unicode 编码(UTF7 除外)总是会创建 BOM。

    对于将输出写入文件的 cmdlet:

    • Out-File 和重定向运算符 >>> 创建 UTF-16LE,这与 Set-Content 明显不同> 和添加内容

    • New-ModuleManifestExport-CliXml 还会创建 UTF-16LE 文件。

    • 当目标文件为空或不存在时,Set-ContentAdd-Content 使用 Default 编码。 默认 是由活动系统区域设置的 ANSI 旧代码页指定的编码。

    • Export-Csv 创建 Ascii 文件,但在使用 Append 参数时使用不同的编码(见下文)。

    • Export-PSSession 默认情况下创建带有 BOM 的 UTF-8 文件。

    • New-Item -Type File -Value 创建一个无 BOM 的 UTF-8 文件。

    • Send-MailMessage 默认使用 Ascii 编码。

    • Start-Transcript 创建带有 BOM 的 Utf8 文件。当使用Append参数时,编码可以不同(见下文)。

    对于附加到现有文件的命令:

    • Out-File -Append>> 重定向运算符不会尝试匹配现有目标文件内容的编码。相反,除非使用 Encoding 参数,否则它们使用默认编码。附加内容时必须使用文件原始编码。

    • 如果没有显式 Encoding 参数,Add-Content 会检测现有编码并自动将其应用到新内容。如果现有内容没有 BOM,则使用默认 ANSI 编码。 Add-Content 的行为在 PowerShell(v6 及更高版本)中是相同的,只是默认编码为 Utf8

    • 当目标文件包含 BOM 时,Export-Csv -Append 与现有编码匹配。在没有 BOM 的情况下,它使用 Utf8 编码。

    • Start-Transcript -Append 与包含 BOM 的文件的现有编码相匹配。如果没有 BOM,则默认为 Ascii 编码。当转录本中的数据包含多字节字符时,此编码可能会导致数据丢失或字符损坏。

    对于在没有 BOM 的情况下读取字符串数据的 cmdlet:

    • Get-ContentImport-PowerShellDataFile 使用 Default ANSI 编码。 PowerShell 引擎从文件读取源代码时也使用 ANSI。

    • Import-CsvImport-CliXmlSelect-String 在没有 BOM 的情况下假定为 Utf8

    PowerShell 中的字符编码

    在 PowerShell(v7.1 及更高版本)中,Encoding 参数支持以下值:

    • ascii:使用 ASCII(7 位)字符集的编码。
    • ansi:使用当前区域性的 ANSI 代码页的编码。此选项是在 PowerShell 7.4 中添加的。
    • bigendianunicode:使用 big-endian 字节顺序以 UTF-16 格式进行编码。
    • bigendianutf32:使用 big-endian 字节顺序以 UTF-32 格式进行编码。
    • oem:使用 MS-DOS 和控制台程序的默认编码。
    • unicode:使用小端字节顺序以 UTF-16 格式进行编码。
    • utf7:以UTF-7格式编码。
    • utf8:以 UTF-8 格式编码(无 BOM)。
    • utf8BOM:使用字节顺序标记 (BOM) 以 UTF-8 格式进行编码
    • utf8NoBOM:以 UTF-8 格式编码,不带字节顺序标记 (BOM)
    • utf32:使用小端字节顺序以 UTF-32 格式进行编码。

    对于所有输出,PowerShell 默认为 utf8NoBOM

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

    从 PowerShell 7.4 开始,您可以使用 Encoding 参数的 Ansi 值来传递当前区域性 ANSI 代码页的数字 ID,而无需手动指定。

    更改默认编码

    PowerShell 有两个默认变量,可用于更改默认编码行为。

      $PSDefaultParameterValues
      $OutputEncoding

      有关详细信息,请参阅 about_Preference_Variables。

      从 PowerShell 5.1 开始,重定向运算符(>>>)调用 Out-File cmdlet。因此,您可以使用 $PSDefaultParameterValues 首选项变量设置它们的默认编码,如下例所示:

      $PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'
      

      使用以下语句更改具有 Encoding 参数的所有 cmdlet 的默认编码。

      $PSDefaultParameterValues['*:Encoding'] = 'utf8'
      

      这很重要

      将此命令放入 PowerShell 配置文件中会使首选项成为会话全局设置,该设置会影响未显式指定编码的所有命令和脚本。

      同样,您应该在脚本或模块中包含您希望以相同方式运行的命令。使用这些命令可确保 cmdlet 的行为方式相同,即使由其他用户、在不同计算机上或在不同版本的 PowerShell 中运行也是如此。

      自动变量 $OutputEncoding 影响 PowerShell 用于与外部程序通信的编码。它对输出重定向运算符和 PowerShell cmdlet 用于保存到文件的编码没有影响。

      参见

      • about_Preference_Variables
      • 字节顺序标记
      • 代码页 - Win32 应用程序
      • 编码.代码页
      • .NET 中的字符编码简介
      • 统一码标准
      • UTF-16LE

      您需要 登录账户 后才能发表评论

      取消回复欢迎 发表评论:

      关灯