输入编码:接受UTF-8

发布于 2024-09-03 08:09:58 字数 264 浏览 0 评论 0原文

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

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

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

I need to get output of native application under PowerShell. The problem is, output is encoded with UTF-8 (no BOM), which PowerShell does not recognize and just converts those funky UTF chars directly into Unicode.

I've found PowerShell has $OutputEncoding variable, but it does not seem to affect input data.

Good ol' iconv is of no help either, since this unnecessary UTF8-as-if-ASCII => Unicode conversion takes place before the next pipeline member acquires data.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

筱武穆 2024-09-10 08:09:58

我现在看到下面的程序存在问题(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

I see the issue now with the program below (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]);
    }                
}

And running that through | Out-File -enc UTF8 foo.txt gives the gibberish:

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                      .........

Note that fhex is a PSCX utility.

UPDATE: Figured out how to get this to work:

$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
清眉祭 2024-09-10 08:09:58

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

Probabry you need to execute "chcp 65001" (after modifying powershell.exe's font).
This command is available with PSISE.

青朷 2024-09-10 08:09:58

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

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

If your goal is to process data from your native command in powershell, you may try

./program-that-outputs-utf8 > temp.txt
get-content temp.txt -Encoding utf8 | (do_whatever)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文