我想在 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 字节。这会导致视频帧速率较低。
_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); }
}