1个不稳定版本

0.1.0 2024年2月18日

963文本处理

Download history 1317/week @ 2024-04-08 1492/week @ 2024-04-15 1454/week @ 2024-04-22 6810/week @ 2024-04-29 5327/week @ 2024-05-06 4833/week @ 2024-05-13 4813/week @ 2024-05-20 3170/week @ 2024-05-27 4048/week @ 2024-06-03 3348/week @ 2024-06-10 4207/week @ 2024-06-17 5463/week @ 2024-06-24 5934/week @ 2024-07-01 3985/week @ 2024-07-08 4343/week @ 2024-07-15 5717/week @ 2024-07-22

21,031 每月下载量
用于 7 个crate (4 个直接)

MIT 许可证

9KB
69

Crates.io Discord License dependency status

CodeCov

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