【问题标题】:Input encoding : accepting UTF-8输入编码:接受 UTF-8
【发布时间】:2010-05-25 07:47:40
【问题描述】:

我需要在 PowerShell 下获取本机应用程序的输出。问题是,输出是用 UTF-8(无 BOM)编码的,PowerShell 无法识别,只是将那些时髦的 UTF 字符直接转换为 Unicode。

我发现 PowerShell 有 $OutputEncoding 变量,但它似乎不会影响输入数据。

好的 ol' iconv 也无济于事,因为这种不必要的 UTF8-as-if-ASCII => Unicode 转换发生在下一个管道成员获取数据之前。

【问题讨论】:

  • 你能举个例子来说明你想要达到的目标吗?如果您使用的是文件或只想在屏幕上显示一些数据,答案可能会有所不同...
  • 我怎样才能让它更清楚呢? “./program-that-outputs-utf8 > 1.txt”——不起作用,“./program-that-outputs-utf8 | out-file -enc utf8 1.txt”——也不起作用。确切的程序和确切的数据不会告诉你任何事情。
  • 那条评论更清楚了。
  • 我认为您的意思是“UTF8-as-if-current-codepage”。 ASCII 只定义最多 0x7F 的字符。 UTF-8 是一个严格的超集。 UTF-8 中的所有非 ASCII 字符都表示为所有 >=0x80 的字节序列。

标签: encoding powershell


【解决方案1】:

我现在看到以下程序的问题 (stdout.cpp - cl stdout.cpp):

#include <stdio.h>

void main()
{
    char bytes[] = { 0x41, 0x53, 0x43, 0x49, 
                     0x49, 0x20, 0x6F, 0x75, 
                     0x74, 0x70, 0x75, 0x74,
                     0xE1, 0xBE, 0xB9};

    for (int i = 0; i < 15; i++)
    {
        printf("%c", bytes[i]);
    }                
}

通过| Out-File -enc UTF8 foo.txt 运行它会产生乱码:

PS> fhex foo.txt

Address:  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F ASCII
-------- ----------------------------------------------- ----------------
00000000 EF BB BF 41 53 43 49 49 20 6F 75 74 70 75 74 0D ...ASCII output.
00000010 9F E2 95 9B E2 95 A3 0D 0A                      .........

请注意,fhex 是一个PSCX 实用程序。

更新:想出了如何让它工作:

$enc = [Console]::OutputEncoding
[Console]::OutputEncoding = [text.encoding]::utf8
.\stdout.exe | out-file fubar3.txt -enc utf8
fhex .\fubar3.txt

Address:  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F ASCII
-------- ----------------------------------------------- ----------------
00000000 EF BB BF 41 53 43 49 49 20 6F 75 74 70 75 74 E1 ...ASCII output.
00000010 BE B9 0D 0A                                     ....

[Console]::OutputEncoding = $enc

【讨论】:

  • 多么简单 :) 这个例子表明在某些情况下确实需要了解 .NET。光有知识是不够的……
【解决方案2】:

您可能需要执行“chcp 65001”(修改powershell.exe的字体后)。
此命令可用于 PSISE。

【讨论】:

    【解决方案3】:

    如果您的目标是在 powershell 中处理来自本机命令的数据,您可以尝试

    ./program-that-outputs-utf8 > temp.txt
    get-content temp.txt -Encoding utf8 | (do_whatever)
    

    【讨论】:

    • 这不起作用。看,最初 powershell 解码来自 program-that-outputs-utf8 的所有数据,就好像它是 ASCII 一样,有效地在 UNICODE 字符串中给出 UTF 乱码(而不是这个乱码代表的真实字符)。然后,如果我使用 ">" 运算符,它将以 UTF-16 编码 THAT 乱码。
    猜你喜欢
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 2013-09-01
    • 2014-07-01
    • 2012-11-07
    • 1970-01-01
    • 2012-07-30
    相关资源
    最近更新 更多