中文Windows系统下程序输出重定向乱码问题解决方案

导言

最近我在用 Rust 开发时,遇到了一个让人头疼的问题:运行 cargo run -- version Cargo.toml > output.txt 将输出重定向到文件后,打开 output.txt 却发现里面全是乱码!我的程序确实是UTF8但是输出的文件却是UTF16LE编码的。特别是在中文 Windows 系统上,这个问题尤为明显。
经过一番折腾和向 AI 求助,我终于搞清楚了问题的根源,并找到了一个简单有效的解决方案。这篇博客将记录我的问题、分析过程和解决办法,希望能帮到遇到同样困扰的你。


问题的表象

事情是这样的:我在中文 Windows 系统上用 PowerShell 运行了一个 Rust 命令,想把输出保存到文件里:

cargo run -- version Cargo.toml > output.txt

命令运行没问题,但打开 output.txt 后,里面的内容不是我期待的版本信息,而是一堆乱码。哪怕改为UTF8编码打开,也是乱码。这让我百思不得其解——明明在控制台直接运行时输出是正常的,为什么重定向到文件就出问题了呢?


问题的根源

经过研究,我发现问题的核心在于编码的不一致。整个过程可以看作三个人在用不同语言对话。让我们把这三个环节拆开来看:

1. Rust 程序(cargo run

  • 它的语言:Rust 程序默认用 UTF-8 编码输出内容。这是现代编程语言的“母语”,简单高效,全球通用。

2. PowerShell 的管道(|>

  • 它的“听力”:PowerShell 负责接收外部程序(如 Rust)的输出,并试图理解这些内容。它的“听力”模式由 [Console]::OutputEncoding 设置决定。
  • 关键区别
    • 英文版 Windows 上,默认是 Code Page 437(一种扩展 ASCII 编码)。
    • 中文版 Windows 上,默认是 Code Page 936(也就是 GBK 编码)。
  • 这就埋下了隐患:Rust 说的是 UTF-8,而 PowerShell 听的是 GBK 或 CP 437,两者不匹配就会“听不懂”。

3. PowerShell 的文件输出(>

  • 它的“笔”:PowerShell 在理解了内容后,会把结果写到文件里。在 PowerShell 5.1 中,默认使用 UTF-16 LE 编码。
  • 如果前面“听”的环节已经出了乱码,后面再怎么写也救不回来。

解决方案

明白了问题根源后,解决办法就很简单了:让 PowerShell 的“听力”也用 UTF-8,这样就能和 Rust 程序无缝对话。具体操作是通过修改 PowerShell 的配置文件(Profile),让它启动时自动设置 [Console]::OutputEncoding 为 UTF-8。

具体步骤

第 1 步:找到并打开你的 Profile 文件
  1. 打开 PowerShell 窗口。
  2. 运行以下命令检查配置文件是否存在:
    Test-Path $PROFILE
    
    • 如果返回 True,说明已有配置文件。
    • 如果返回 False,需要创建。
  3. 用以下命令创建(如果需要)并打开配置文件:
    if (!(Test-Path $PROFILE)) { New-Item -Path $PROFILE -ItemType File -Force }
    code $PROFILE
    

    提示:没装 VS Code?可以用 notepad $PROFILE 用记事本打开。

第 2 步:将编码命令写入 Profile

在打开的配置文件(通常是 Microsoft.PowerShell_profile.ps1)中,添加这一行:

[Console]::OutputEncoding = [System.Text.Encoding]::UTF8

保存并关闭文件。

第 3 步:重启 PowerShell 并验证

关闭当前 PowerShell 窗口,重新打开一个新的。然后再试试:

cargo run -- version Cargo.toml > output.txt

这次打开 output.txt,内容应该完美显示,不再有乱码!


结语

通过这次探索,我不仅解决了 Rust 输出乱码的问题,还深入理解了 PowerShell 管道中的编码机制。这个方案简单实用,适用于所有 Windows 系统,尤其是在中文环境下,能极大提升开发体验。如果你也遇到类似问题,不妨试试这个方法——让编码一致,乱码自然无处藏身!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/84871.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/84871.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python管理工具UV

常用 UV 命令 安装 pip install uv 版本相关 uv python list 打印所有uv支持的python版本uv python install cpython-3.12 安装指定的python版本uv run -p 3.12 test.py 用指定的python版本运行python代码uv run -p 3.12 python 进入python执行环境。假如输入的版本是一个本…

论文略读:ASurvey on Intent-aware Recommender Systems

202406 arxiv 推荐系统在许多现代在线服务中发挥着关键作用,例如电子商务或媒体流服务,它们能够为消费者和服务提供商创造巨大的价值。因此,过去几十年来,研究人员提出了大量生成个性化推荐的技术方法。传统算法——从早期的 Gro…

Neo4j 中存储和查询数组数据的完整指南

Neo4j 中存储和查询数组数据的完整指南 图形数据库 Neo4j 不仅擅长处理节点和关系,还提供了强大的数组(Array)存储和操作能力。本文将全面介绍如何在 Neo4j 中高效地使用数组,包括存储、查询、优化以及实际应用场景。 数组在 Neo4j 中的基本使用 数组…

Android 编译和打包image镜像流程

1. 编译命令 source build/envsetup.sh lunch aosp_car_arm64-userdebug make2. 编译流程 source build/envsetup.sh 定义一些函数的环境变量,如 lunchvalidate_current_shell,确认 shell 环境set_global_paths,设置环境变量 ANDROID_GLOB…

MySQL:SQL 慢查询优化的技术指南

1、简述 在 Java 后端开发中,数据库是系统性能瓶颈的高发地带,而 慢 SQL 查询 往往是系统响应迟缓的“罪魁祸首”。本文将全面梳理慢 SQL 的优化思路,并结合 Java 示例进行实战演练。 2、慢查询的常见表现 慢查询通常表现为: 接…

leetcode543-二叉树的直径

leetcode 543 思路 路径长度计算:任意两个节点之间的路径长度,等于它们的最低公共祖先到它们各自的深度之和递归遍历:通过后序遍历(左右根)计算每个节点的左右子树深度,并更新全局最大直径深度与直径的关…

详解main的参数并实现读取文件

在 C 语言中,main函数的参数argc和argv用于接收命令行传入的参数 main 函数的两个参数 int main(int argc, char* argv[]) 假设顾客通过手机 APP 点餐,订单信息会被传递给餐厅的处理系统(也就是你的程序)。 订单信息结构 argc…

c++IO类

概述 c不直接处理输入输出,而是通过定义在标准类库中的类来处理IO。这些类支持从设备读取数据,向设备写入数据的IO操作,设备可以是文件、控制台窗口等。还可以从内存IO。 IO类 iostream: istream,wistreamostream,wo…

springboot的后端处理HTML的页面请求

下面是一个完整的 Spring Boot 后端示例&#xff0c;用于接收 <form> 提交的文件上传请求&#xff08;/article/uploadLifeImage 接口&#xff09;&#xff0c;并将上传的文件保存到本地目录。 ✅ 一、项目结构 upload-demo/ ├── src/ │ └── main/ │ ├…

深入探究 Go 语言中使用 SQLite 数据库

引言 在软件开发中&#xff0c;数据库是管理和存储数据的关键组件。SQLite 作为一款轻量级的嵌入式数据库&#xff0c;因其零配置、高性能和易于集成等特性&#xff0c;成为众多小型项目和嵌入式系统的理想选择。而 Go 语言以其高效、简洁的特点&#xff0c;为操作 SQLite 数据…

Portable Computer Power Adapter

Portable Computer Power Adapter 笔记本电源适配器&#xff0c;将220伏特的交流电转化直流电 现在的适配器真的体积之大&#xff0c;让我无法理解&#xff0c;本来便携计算机为了方便减少体积重量&#xff0c;现在都倒反天罡了。让我无法理解设计师是怎么干出来的。这玩意有2…

Uniapp 网络请求封装专题

目录 一、前言 二、uniapp官方文档 三、举例演示 3.1 使用说明 3.2 Content-Type 3.2.1 ​​基本概念 ​​3.2.2 核心作用 3.2.3 常见 Content-Type 类型及使用场景 1&#xff09;文本类 a&#xff09;text/plain​​​​ b&#xff09;text/html​​ 2&#xf…

2025年渗透测试面试题总结-2025年HW(护网面试) 07(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 2025年HW(护网面试) 07 一、OWASP Top 10 2023核心漏洞 二、XSS窃取Cookie全流程 三、渗透测试五阶段模型…

Seata分布式事务解决框架

Seata&#xff08;Simple Extensible Autonomous Transaction Architecture&#xff09;是一个开源的分布式事务解决方案&#xff0c;旨在帮助开发者更容易地在微服务架构中解决分布式事务问题。 你可以把它理解为一个工具箱&#xff0c;专门用来处理微服务之间操作的一致性。…

旧物回收小程序开发:开启绿色生活新方式

在环保理念日益深入人心的今天&#xff0c;每一件旧物都承载着资源再生的无限可能。我们精心打造的旧物回收小程序&#xff0c;宛如一把神奇的钥匙&#xff0c;为你开启绿色生活新方式&#xff01; 想象一下&#xff0c;家中堆积如山的旧衣物、闲置的电子产品、废弃的书籍杂志…

STM32 串口通信②:蓝牙模块HC-05控制单片机

一 前言 上一篇我们已经成功实现单片机和电脑的连接&#xff0c;接下来&#xff0c;我们学习一个有趣的板块&#xff0c;HC-05蓝牙模块&#xff0c;这个蓝牙模块&#xff0c;我们就要建立手机和单片机的通讯啦&#xff0c;还是比较有趣的一个过程&#xff0c;大家可以跟着多操作…

【Verilog】Verilator的TestBench该用C++还是SystemC

Verilator的Testbench&#xff08;测试平台&#xff09;主要使用 C 或 SystemC 来编写。这是由Verilator的工作原理决定的&#xff1a;它将你的Verilog/SystemVerilog设计转换成一个C类&#xff0c;因此你需要一个C环境来实例化和驱动这个类。 下面详细说明这两种方式以及如何…

71-Oracle Undo与Flashback管理(Guarantee设置)深度解析

小伙伴们有没有在操作undo表空间、Flashback管理&#xff0c;时间保留设置&#xff0c;总有些配置需要提前预置好&#xff0c;否则闪回查询和表的时候出现报错。 需短期恢复&#xff08;秒级~小时&#xff09;直接上UNDO_RETENTION同时启用RETENTION GUARANTEE&#xff0c;Und…

单片机——浮点数转换4位数码管显示

浮点数转换4位数码管显示 static char buffer[5]; int DecimalPlace 0; #define HideChar h void DisplayFloatOn4LED(float value) {long integer roundf(value );if (integer > 9999) //4位{integer 9999;snprintf(buffer, sizeof(buffer), "%4ld", integer…

金融行业B端系统布局实战:风险管控与数据可视化的定制方案

摘要 在金融行业&#xff0c;一次小小的数据泄露可能引发千万级资金损失&#xff0c;一次错误的风险评估或许让企业陷入危机。传统 B 端系统布局在应对复杂多变的金融业务时&#xff0c;常出现风险预警滞后、数据杂乱无章的情况&#xff0c;让从业者如履薄冰。如何才能在瞬息万…