我有陌生感的问题.在Windows7操作系统下,我try 在PowerShell中运行该命令.

Ruby-E UTF-8-e"puts‘请多关照,Mr Jason’">test.txt

当我阅读test.txt文件时:

Ruby-E UTF-8-e"PUT GET"<test.txt

结果是:

I0F0 ^ 0 ^ 0 ^ 0 ^ 0 ^ 0 ^ 0J0J0 D0W0 ~ 0Y0Y0 , Jason先生

我判断了test.txt文件,发现文件类型编码为Unicode,而不是UTF-8.

我该怎么办呢?

我应该如何确保重定向后输出文件类型的编码?请帮帮我.

推荐答案

tl;dr

不幸的是,解决方案(在Windows上)比人们希望的要复杂得多:

# Make PowerShell both send and receive data as UTF-8 when talking to
# external (native) programs.
# Note: 
#  * In *PowerShell (Core) 7+*, $OutputEncoding *defaults* to UTF-8.
#  * You may want to save and restore the original settings.
$OutputEncoding = [Console]::OutputEncoding = [Text.UTF8Encoding]::new()
 
# Create a BOM-less UTF-8 file.
# Note: In *PowerShell (Core) 7+*, you can less obscurely use:
#   ruby -E UTF-8 -e "puts 'どうぞよろしくお願いします,Mr Jason'" | Set-Content test.txt
$null = New-Item -Force test.txt -Value (
  ruby -E UTF-8 -e "puts 'どうぞよろしくお願いします,Mr Jason'"
)

# Pipe the resulting file back to Ruby as UTF-8, thanks to $OutputEncoding
# Note that PowerShell has NO "<" operator - stdin input must be provided
# via the pipeline.
Get-Content -Raw test.txt | ruby -E UTF-8 -e "puts gets"

  • character encoding而言,PowerShell通过包含.NET System.Text.Encoding实例的两个设置与外部(本机)程序通信:

    • $OutputEncoding指定用于通过管道将数据发送到外部程序的编码.

    • [Console]::OutputEncoding指定用于解释(解码)来自外部程序(的标准输出流)的数据的编码;要使解码正常工作,此设置必须与外部程序的实际输出编码匹配.

  • 从PowerShell 7.3.1开始,PowerShell只在与外部程序通信时"说出文本",而在intermediate decoding and re-encoding step is invariably involved版本中--即使你只是在使用>(实际上是Out-File个cmdlet的别名)将输出发送到文件时也是如此.

    • 也就是说,PowerShell的管道不像其他shell 中的那样raw byte conduits%.

      • 有关解决办法和future 可能的原始字节支持,请参阅this answer.
    • 无论您使用什么输出运算符(>)或cmdlet(Out-File,Set-Content),都将使用its默认字符编码,这与原始输入的编码无关,当运算符/cmdlet对其进行操作时,将使用has already been decoded into .NET strings.

      • Windows PowerShell中的>/Out-File默认为"Unicode"(UTF-16LE)编码,这就是您所看到的.

      • 虽然Out-FileSet-Content有一个-Encoding参数,允许您控制输出编码,但在Windows PowerShell中,它们不允许您创建BOM-less个UTF-8文件;奇怪的是,New-Item does创建这样的文件,这就是上面使用它的原因;如果UTF-8 BOM是可以接受的,那么... | Set-Content -Encoding utf8在Windows PowerShell中就可以了.

      • 请注意,相比之下,PowerShell (Core) 7+版现在幸运的是,现代的跨平台版本一直默认使用无BOM的UTF-8.

        • 尽管如此,对于Windows上的[Console]::OutputEncoding,从v7.3.1开始,它仍然默认使用传统的OEM代码页,这意味着来自外部程序的UTF-8输出默认为misinterpreted-请参阅GitHub issue #7233以了解相关讨论.

Ruby相关问答推荐

如何将包含换行符(和可能其他特殊字符)的Ruby字符串转义为有效的shell变量值?

有没有办法在 Capybara 中保持登录状态?

如何过滤散列数组以仅获取另一个数组中的键?

如何替换 ruby​​ 中模式的每个实例?

构造Ruby的现代方法是什么?

如何在没有 Web 服务器的情况下从命令行执行 ruby​​ 模板文件 (ERB)?

如何将哈希保存到 CSV

从索引到字符串结尾的子字符串的Ruby成语

在 Ruby 中将数组转换为索引哈希

如何判断我是从 JRuby 还是 Ruby 运行?

安装 RVM:需求安装失败,状态为:1

Ruby 是否有任何数字格式化类?

我不明白Ruby本地范围(local scope)

如何在 RSpec 2 中自动加载 spec_helper.rb

我应该如何在哈希上使用 each_with_object?

在不同的换行符上拆分

如何通过拆分字符的最后一次出现将字符串拆分为仅两部分?

带有可选参数的方法

Ruby中的urldecode?

Ruby - 无法修改冻结的字符串 (TypeError)