使用 Rust 将控制台类型更改为 UTF-16

问题描述 投票:0回答:1

我想在 Rust 中将控制台模式设置为 UTF-16 以打印出 UTF-16 (不带宏)。将文本从 UTF-16 转换为 UTF-8 不适用于我当前的用例。这适用于 Linux 版本,但不适用于 Windows 版本。

在 C 中,这可以通过以下方式完成:

_setmode(_fileno(stdout), _O_U16TEXT)

这如何在 Rust 中完成?

我用 Google 搜索并尝试在 Rust 文档中寻找 UTF-16,但没有找到任何与写入

stdout
相关的内容。

用例是在控制台中播放视频。我已经用 Python 和 C 扩展在这里编写了程序。我知道这不是 ascii,但听起来更好。写入特殊字符(如 UTF-16 0x2588 (█))在 UTF-8 中需要 3 个字节,在 UTF-16 中需要 2 个字节。在 Windows 中,程序的性能较差,因为 Windows 的终端速度较慢。 UTF-16 中的帧(具有某些参数)为 30,000 字节,UTF-8 中的帧为 37,000 字节。这会导致视频帧速率较低。

rust terminal utf-16
1个回答
0
投票

_setmode
是 Windows 特定函数,是 C 运行时库 (CRT) 的一部分。 Rust 标准库不提供它。

不幸的是,似乎 windows-sys 箱子也没有公开它

您的最佳选择可能是手动链接 Windows CRT 库(根据您的配置,这可能已经自动发生)。

然后您应该能够使用类似的方法自己定义和使用该函数

const _O_U16TEXT: i32 = 0x20000; 
const STDOUT_FILENO: i32 = 1; // using `_fileno` would be more 'proper'
extern "cdecl" {
    fn _setmode(fd: i32, mode: i32);
}

pub fn main()  {
    unsafe { _setmode(STDOUT_FILENO, _O_U16TEXT); }
}
© www.soinside.com 2019 - 2024. All rights reserved.