强制标准输出编码为 UTF8

2024-01-01

我希望从我的 C# 项目中另一个应用程序的标准输出流中解析 UTF8 字符。使用默认方法,从进程的标准输出流读取时,ANSI 范围之外的字符会被损坏。

现在根据微软的说法,我需要做的是设置StandardOutputEncoding:

如果 StandardOutputEncoding 属性的值为 Nothing,则进程使用标准输出的默认标准输出编码。必须在进程启动之前设置 StandardOutputEncoding 属性。设置此属性并不能保证进程将使用指定的编码。应测试应用程序以确定该进程支持哪些编码。

但是,尝试将 StandardOutputEncoding 设置为 UTF8/CP65001,当转储到二进制文件时,读取的输出显示相同的外语字符阉割。它们总是读作“?” (又名 0x3F)而不是它们应该的样子。

我知道此时的假设是我正在解析其输出的应用程序根本不发送 UTF8 输出,但绝对不是这种情况,因为当我尝试将应用程序的输出从命令行转储到文件时将命令提示符的代码页强制为 65001,一切看起来都很好。

chcp 65001 && slave.exe > file.txt

由此,我知道应用程序 Slave.txt 能够输出 UTF8 编码的标准输出,但尽我所能,我无法让 StandardOutputEncoding 在我的 C# 应用程序中执行相同的操作。

每次我最终处理 .NET 中的编码时,我都希望自己能回到 C++ 世界,因为一切都需要更多工作,但更加透明。我正在考虑编写一个 C 应用程序来将slave.txt 的输出读取到一个 UTF8 编码的文本文件中,以供 C# 解析,但我现在暂缓采用这种方法。


StandardOutputEncoding 的唯一影响对执行的应用程序的标准输出没有任何影响。它所做的唯一事情是设置位于从正在运行的应用程序捕获的二进制标准输出流顶部的 StreamReader 的编码。

这对于本机输出 UTF8 或 Unicode 标准输出的应用程序来说是可以的,但大多数 Microsoft 实用程序都这样做not这样做,只会根据控制台的代码页对结果进行编码。控制台的代码页是使用 WIN32 API 手动设置的SetConsoleOutputCP and SetConsoleCP,并且如果您想阅读的话,需要手动强制为 UTF8。这需要在正在执行 exe 的控制台上完成,并且据我所知,无法从主机的 .NET 环境中完成。

因此,我编写了一个名为 UtfRedirect 的代理应用程序,我已经发布了其源代码在 GitHub 上 https://github.com/NeoSmart/UtfRedirect根据 MIT 许可证的条款,该许可证旨在在 .NET 主机中生成,然后告诉执行哪个 exe。它将为最终从属 exe 的控制台设置代码页,然后运行它并将标准输出通过管道传输回主机。

UtfRedirector 调用示例:

//At the time of creating the process:
_process = new Process
                {
                    StartInfo =
                        {
                            FileName = application,
                            Arguments = arguments,
                            RedirectStandardInput = true,
                            RedirectStandardOutput = true,
                            StandardOutputEncoding = Encoding.UTF8,
                            StandardErrorEncoding =  Encoding.UTF8,
                            UseShellExecute = false,
                        },
                };

_process.StartInfo.Arguments = "";
_process.StartInfo.FileName = "UtfRedirect.exe"

//At the time of running the process
_process.Start();

//Write the name of the final slave exe to the stdin of UtfRedirector in UTF8
var bytes = Encoding.UTF8.GetBytes(application);
_process.StandardInput.BaseStream.Write(bytes, 0, bytes.Length);
_process.StandardInput.WriteLine();

//Write the arguments to be sent to the final slave exe to the stdin of UtfRedirector in UTF8
bytes = Encoding.UTF8.GetBytes(arguments);
_process.StandardInput.BaseStream.Write(bytes, 0, bytes.Length);
_process.StandardInput.WriteLine();

//Read the output that has been proxied with a forced codepage of UTF8
string utf8Output = _process.StandardOutput.ReadToEnd();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

强制标准输出编码为 UTF8 的相关文章

  • 有什么工具可以了解 Windows 中正在运行的进程的布局(段)?

    我一直很好奇 该进程在内存中到底是什么样子的 其中有哪些不同的部分 部分 程序 在磁盘上 和进程 在内存中 到底是如何相关的 我之前的问题 有关可执行程序 进程 的内存布局的更多信息 https stackoverflow com ques
  • 如果我使用带有表单身份验证的 WCF,php 或 java 客户端将如何进行身份验证?

    我有一个通用的概念验证 WCF 服务 它使用表单身份验证来保护访问 当我的客户端是 NET 时 一切都很好 vb 代码如下 Dim client As SupplierServiceClient New SupplierServiceCli
  • 将参数传递给模板类型的 C# 泛型 new()

    添加到列表时 我试图通过其构造函数创建一个 T 类型的新对象 我收到编译错误 错误消息是 T 创建变量实例时无法提供参数 但我的类确实有一个构造函数参数 我怎样才能做到这一点 public static string GetAllItems
  • 160 位 SHA1 哈希值的前 32 位是否可以替代 CRC32 哈希值?

    我正在开发一个 NET 3 5 项目 我需要一个 32 位哈希值 NET 加密类中似乎没有任何方法返回 32 位哈希 MD5 是 128 位 SHA1 是 160 位等 我实现了一个 CRC32 类 但我发现现有的 SHA1 和 MD5 哈
  • 在 Android 中将应用程序上下文保存到静态变量是否安全?

    我知道在 Android 上使用静态变量是相当危险的 特别是当您将它们引用到活动时 但是 如果我有一个扩展 Application 的类 我们称此类为 App 引用此类的实例是否安全 如果是这样 任何其他类对应用程序上下文进行任何类型的引用
  • ROWNUM 的 OracleType 是什么

    我试图参数化所有现有的 sql 但以下代码给了我一个问题 command CommandText String Format SELECT FROM 0 WHERE ROWNUM lt maxRecords command CommandT
  • 如何在 Android 上的 HttpPost 中发送 unicode 字符

    我试图在我的应用程序中允许多语言支持 这会发出 HTTP post 来上传新消息 我需要做什么才能支持日语和其他非拉丁语语言 我的代码目前看起来像这样 note the msg string is a JSON message by the
  • 如何在Vim中正确显示UTF-8字符

    我想要 需要编辑包含 UTF 8 字符的文件 并且我想使用 Vim 在我被指责问以前问过的问题之前 我已经阅读了有关编码 文件编码 s 术语编码等的 Vim 文档 用 google 搜索了该主题 并阅读这个问题 https stackove
  • 使用 Google Analytics API 在 C# 中显示信息

    我一整天都在寻找一个好的解决方案 但谷歌发展得太快了 我找不到有效的解决方案 我想做的是 我有一个 Web 应用程序 它有一个管理部分 用户需要登录才能查看信息 在本节中 我想显示来自 GA 的一些数据 例如某些特定网址的综合浏览量 因为我
  • 在 SpecFlow 测试中使用 ChromeDriver

    因此 正如我们所知 当您使用 SpecFlow 时 如果您重复使用另一个测试中的步骤 它会自动将其拉入并重复使用 但是 我遇到了一个问题 测试 A 登录我 测试 B 登录并确认主页是正确 但当我开始使用测试 B 时 测试 A 正在初始化 C
  • 在 C# 应用程序中使用 LinkedIn API

    我正在构建一个小型 Windows 窗体应用程序 并且想要从公司搜索 API 访问信息 我什至不想在个人资料中写入任何内容 我已经打开一个网络浏览器并要求我的用户在我的应用程序中输入一些验证码 这真是令人难以置信的令人沮丧 有大量针对 Py
  • “反序列化操作回复消息正文时出错...” - 对于我调用的每个方法

    我正在尝试为我们的波兰拍卖服务 Allegro 创建非常简单的客户端应用程序 他们提供 SOAP 架构中的 API 问题是 每次我尝试调用任何方法时 我都会收到 反序列化操作 方法名称 的回复消息正文时出错 一般来说 我对网络服务不熟悉 所
  • python 子进程编码

    我试图将 powershell 的输出存储在 var 中 import subprocess subprocess check call powershell Get ChildItem LiteralPath HKLM SOFTWARE
  • 是否需要连续编号?

    我正在开发一个 winform NET 应用程序 其中包括订单 发票 服务订单 票务等 这些实体在对其 ID 进行编号时是否必须按顺序排列 国际海事组织没有 以一个订单为例 它只有通过业务层才有效 在此过程中 可能已经创建了另一个订单 批准
  • 使用 WPF 网络浏览器以及带有斜体标签和阿拉伯文本的 HTML 时出现奇怪的字符

    我无法弄清楚这个 但我在下面做了一个简单的演示 当在 IE 或 Edge 中查看此页面时 它会正确呈现 我尝试过不同的编码 如 utf 16 Windows 1252 但没有成功 对我来说 看起来像是 WebBrowser 控件的问题 有人
  • 公共交通错误队列正在消耗,但仍然不为空

    我正在使用 Mastransit 3 5 0 和 RabbitMq 如果队列消费者抛出异常 则默认由 MoveExceptionToTransportFilter 处理异常并移至 error 队列 对于 error 队列 我有单独的消费者
  • 为什么 F# 的默认集合是排序的,而 C# 的不是?

    当从 C 世界迁移到 F 最惯用的可能 思维方式时 我发现了这个有趣的差异 在 C 的 OOP mutable 世界中 默认的集合集合似乎是HashSet https learn microsoft com en us dotnet api
  • 如何使用 EPPlus 在单个 Excel 单元格中加载包含逗号的文本

    我正在尝试EPPlus 库 http epplus codeplex com 我被困在这个问题上 我必须在单个单元格中加载文本 但是当该文本包含逗号时 我使用的代码会沿着多个单元格 沿着正确的方向 分割文本 这是我用来加载文本的代码 usi
  • C# 5 async/await 线程机制感觉不对?

    为什么让调用线程进入异步方法直到内部 等待 一旦调用异步方法就生成一个线程 这不是更干净吗 这样您就可以确定异步方法会立即返回 您不必担心在异步方法的早期阶段没有做任何昂贵的事情 我倾向于知道某个方法是否要在 我的 线程上执行代码 不管是堵
  • 在 .NET 中,多次调用 string.Replace() 是否比单次调用 Regex 方法效率低?

    我想替换字符串中大约 8 个字符 使用 Regex 方法或仅使用对 string Replace 的多次调用会更有效吗 我将替换可能出现的大约 7 个字符 全部替换为下划线 字符可以出现在字符串中的任何位置 并且不按特定顺序等 除非您确实需

随机推荐

  • Python(PIL):淡化透明图像并粘贴到另一张图像

    我有两个相同大小的 png 图像 A 和 B 第二个 B 是部分透明的 如果我使用代码将图像 B 粘贴到图像 A 中 base paste overlay mask overlay 我得到了它们近乎完美的组合 但我想在将图像 B 粘贴到图像
  • 多进程守护进程不会在父进程退出时终止

    我有一个 Python 2 7 多处理进程 它不会在父进程退出时退出 我已经设置了守护进程标志 该标志应该强制它在父进程死亡时退出 文档指出 当一个进程退出时 它会尝试终止其所有守护进程子进程 p Process target server
  • 在对域进行建模时是否应该考虑“每个聚合一个事务”的规则?

    考虑到领域事件模式和这一点post http lostechies com jimmybogard 2010 04 08 strengthening your domain domain events 为什么人们建议每个交易模型保留一个聚合
  • 为什么我无法使用 SDL2 创建 OpenGL ES 3.0 上下文?

    我在 Debian 稳定版上使用 SDL2 2 0 2 并且尝试使用它获取 OpenGL ES 3 0 上下文 如果我请求 OpenGL ES 2 0 上下文 则此方法有效 但如果我直接请求 OpenGL ES 3 0 上下文 则此方法无效
  • iOS 上的 GCM 生成令牌时出错:(com.google.iid 错误 7。)

    我正在开发一个使用推送通知的应用程序GCM 谷歌云消息传递 服务 问题是 有时在生成令牌时 它会显示以下错误 GCM 失败并出现错误 操作无法完成 com google iid 错误 7 有人可以帮我吗 None
  • Devise - 在开发中跳过用户确认

    如何在设计中的开发中跳过用户确认 我已经设置了生产环境以使用 SendGrid 发送电子邮件 但现在我已经这样做了 它不会让我登录 谢谢你的时间 在控制台中创建用户 user User create first name gt admin
  • EC2 用户数据无法通过 python boto 命令运行

    我正在尝试启动一个实例 并在第一次作为用户数据的一部分启动时运行一个脚本 使用以下代码 python boto3 库 import boto3 ec2 boto3 resource ec2 instance ec2 create insta
  • Angular 4:无法从响应中读取标头 - 不是 CORS 问题

    在服务器自动更新令牌的上下文中 我正在努力解决基础知识 从响应中获取标头数据 它似乎与 CORS 无关 因为我的 Node express 允许 Authorization x access token 并相应地响应 请参见下面的网络选项卡
  • 使用 Jenkins 构建 Docker 镜像会导致“发现不支持的协议方案”

    我正在跟进this https www katacoda com courses jenkins build docker images在线教程逐行 但在第 3 步 任务 配置插件 当我按下 测试连接 按钮时 我收到此错误消息 发现不支持的
  • 张量流中使用的钩子是什么意思

    我无法理解python tensorflow中Hook的确切含义 LearningRateSetterHook tf train SessionRun Hook 如果您向我解释一下 我将不胜感激 谢谢 这可能是一个关于什么是钩子的更普遍的问
  • 如何获取 dockerregistryv2 上的镜像列表

    我正在使用 dockerregistry v1 并且有兴趣迁移到较新的版本 v2 但我需要某种方法来获取注册表中存在的图像列表 例如 使用注册表 v1 我可以执行 GET 请求http myregistry 5000 v1 search 结
  • 调整自定义对象的 console.log 行为

    有什么方法可以影响 console log 给出的自定义对象吗 我尝试覆盖 customObject prototype toString 方法 但这不起作用 有任何想法吗 之前的答案在较新版本的节点中已被弃用 现在需要实现的方法是符号 u
  • 将数组的所有元素设置为一个值的最佳方法是什么?

    我有一个整数数组 我想在每次调用函数时将数组中的所有值设置为 x 我看过 memset 但我认为这只适用于字节数组 我可以做明显的 for 循环 但我猜有一个标准的 lib 函数可以更好地完成这个任务 有人知道吗 就循环一下 差不多了 或者
  • 雨果与 Asciidoctor

    我正在尝试用 Hugo 建立一个博客 只要我使用 Markdown 它基本上就可以正常工作 但由于我在存储库中还有一些带有 antora 的其他网站内容 文档 所以我想用 asciidoc 编写所有文本 但当我尝试从 adoc 文件生成网站
  • jest typescript - 模拟日期构造函数

    我试图嘲笑new Date 返回特定日期 下面的代码 const now new Date jest spyOn global Date mockImplementation gt now 给出编译错误 Argument of type g
  • 哪些 Rust 数据结构是不确定的

    编写智能合约时 确保使用的所有数据结构都是确定性的非常重要 具体来说 如果HashMap or HashSet使用 Rust 标准库是否存在可能的非确定性 由于 Wasm 运行时无法访问非确定性输入 因此整个执行是确定性的 HashSet
  • Entity Framework 5.0 PostgreSQL (Npgsql) 默认连接工厂

    我试图首先使用 PostgreSQL Npgsql 提供程序 获取 EF 5 0 代码 我通过 NuGet 安装了 Npgsql 2 0 12 1 尽管引用的程序集是 2 0 12 0 我在 app config 中声明了 Npgsql 默
  • mmap:强制 64K 对齐

    我正在将 由我 为 Windows 编写的项目移植到移动平台 我需要相当于VirtualAlloc 朋友 自然的就是mmap 然而 有两个显着差异 返回的地址VirtualAlloc保证是所谓的倍数分配粒度 dwAllocationGran
  • 在 SQLalchemy 中过滤左连接

    使用 SQLalchemy 我想执行左外连接并且过滤掉在连接表中确实有匹配的行 我正在发送推送通知 所以我有一个Notification桌子 这意味着我也有一个ExpiredDeviceId用于存储不再有效的 device id 的表 我不
  • 强制标准输出编码为 UTF8

    我希望从我的 C 项目中另一个应用程序的标准输出流中解析 UTF8 字符 使用默认方法 从进程的标准输出流读取时 ANSI 范围之外的字符会被损坏 现在根据微软的说法 我需要做的是设置StandardOutputEncoding 如果 St