1个不稳定版本
0.1.0 | 2024年2月18日 |
---|
963 在 文本处理 中
21,031 每月下载量
用于 7 个crate (4 个直接)
9KB
69 行
ANSI宽度
测量字符串在终端打印时的宽度
对于ASCII,这等同于字符串的字节数。然而,有2个特殊情况
- 许多Unicode字符(CJK、emoji等)跨越多个列。
- 应忽略ANSI转义码。
第一种情况由unicode-width
crate处理。这个函数通过忽略ANSI转义码扩展了该crate。
局限性
- 我们无法知道终端模拟器中
TAB
字符的宽度。 - 退格也被视为零宽度。
ANSI转义码简介(以及这个crate是如何工作的)
ANSI码是通过字符串中的特殊字符序列创建的。这些序列以ESC字符开始:'\x1b'
,后跟其他字符以确定转义码的类型。第二个字符决定了序列的长度
ESC [
:直到找到范围'\x40'..='\x7E'
中的字符。ESC ]
:直到找到ST
。
ST
是字符串终止符,由序列ESC \
(或在Rust语法中'\x1b\x5c'
)给出。
这是该库支持的序列子集,因为这些被大多数需要此功能的应用程序所使用。如果您有其他代码的使用案例,请在GitHub仓库上提出问题。
ansi-width
为了提高性能,不会解析实际的ANSI代码,它只能跳过ANSI代码。
示例
use ansi_width::ansi_width;
// ASCII string
assert_eq!(ansi_width("123456"), 6);
// Accents
assert_eq!(ansi_width("café"), 4);
// Emoji (2 crab emoji)
assert_eq!(ansi_width("🦀🦀"), 4);
// CJK characters (“Nǐ hǎo” or “Hello” in Chinese)
assert_eq!(ansi_width("你好"), 4);
// ANSI colors
assert_eq!(ansi_width("\u{1b}[31mRed\u{1b}[0m"), 3);
// ANSI hyperlink
assert_eq!(
ansi_width("\x1b]8;;http://example.com\x1b\\This is a link\x1b]8;;\x1b\\"),
14
);
替代方案
str::len
:仅返回字节数长度,因此仅适用于ASCII字符。unicode-width
:按照设计不考虑ANSI字符(见此问题)。如果您不关心ANSI代码,这可能是您想要的。此crate内部也使用了unicode-width
。textwrap::core::display_width
:与这个crate的功能非常相似,并且从版本0.16.1开始支持超链接。这个crate的优点是不需要引入textwrap
的其他功能(尽管这些功能非常优秀,如果您需要的话)。console::measure_text_width
:与textwrap
类似,并且经过非常好的测试。然而,它内部首先构造一个没有ANSI代码的新字符串,然后测量该字符串的宽度。虽然与这个crate相比解析更稳健。
参考
上面的信息基于
依赖
~375KB