You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Rust中将控制台模式设置为UTF-16以输出UTF-16内容

在Rust中设置Windows控制台为UTF-16模式直接输出内容

问题背景

需要在Rust中将Windows控制台设置为UTF-16模式,直接输出UTF-16编码的内容(不使用宏)。将UTF-16转UTF-8输出的方案在Linux下正常运行,但Windows终端性能有限,无法满足场景需求:例如█(U+2588)这类字符,UTF-8编码占3字节,UTF-16仅占2字节,在视频帧输出场景中,一帧内容UTF-16编码为30000字节,UTF-8则为37000字节,会导致帧率下降。

在C语言中可以通过以下代码实现控制台模式切换:

_setmode(_fileno(stdout), _O_U16TEXT)

但在Rust官方文档及搜索结果中未找到直接对应的实现方式,请问如何在Rust中完成相同操作?

最终实现方案

通过直接调用Windows CRT的相关函数来实现,具体步骤如下:

1. 声明外部函数

首先声明需要调用的Windows CRT函数:

enum FILE {}

const STDOUT_FILENO: i32 = 1; // 更规范的方式是通过`_fileno`获取,此处直接定义常量简化示例
extern "cdecl" {
    fn _setmode(fd: i32, mode: i32) -> i32;
    fn fputws(ws: *const u16, stream: *mut FILE) -> i32;
    fn __acrt_iob_func(fd: i32) -> *mut FILE; // 用于获取stdout的文件句柄
}

2. 设置控制台为UTF-16模式

在unsafe块中调用_setmode切换stdout的编码模式为UTF-16(_O_U16TEXT对应的数值为0x00020000):

unsafe {
    _setmode(STDOUT_FILENO, 0x00020000); // 切换为UTF-16输出模式
}

3. 输出UTF-16内容

将UTF-16编码的内容(以Vec<u16>类型的pts为例)通过fputws输出到控制台:

unsafe {
    fputws(pts.as_ptr(), __acrt_iob_func(STDOUT_FILENO));
}

内容的提问来源于stack exchange,提问作者ThatOneShortGuy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 00:31:08