#utf-16 #string #byte-string #endianness #encoded-string #wstring

utf16string

与UTF-16编码字符串直接工作的字符串类型

2个不稳定版本

0.2.0 2020年10月10日
0.1.0 2020年10月9日

#1038 in 编码

Download history 18294/week @ 2024-03-14 19578/week @ 2024-03-21 18732/week @ 2024-03-28 16461/week @ 2024-04-04 16419/week @ 2024-04-11 18274/week @ 2024-04-18 17957/week @ 2024-04-25 19943/week @ 2024-05-02 15658/week @ 2024-05-09 16015/week @ 2024-05-16 16006/week @ 2024-05-23 15386/week @ 2024-05-30 16036/week @ 2024-06-06 16484/week @ 2024-06-13 15682/week @ 2024-06-20 12172/week @ 2024-06-27

63,001 每月下载量
用于 10 个crate (4 直接)

MIT/Apache

74KB
1.5K SLoC

UTF-16字符串类型

此crate提供两种字符串类型以与UTF-16编码的字节直接工作,它们与String&str与UTF-8编码的字节工作的方式直接对应。

UTF-16可以使用小端和大端字节顺序进行编码,此crate使用泛型byteorder类型来识别这些类型包含的编码,因此公开的主要类型是

  • &WStr<ByteOrder>
  • WString<ByteOrder>

这些类型旨在与标准库中的&strString类型的行为非常相似。虽然已经涵盖了大量的API,但欢迎您贡献更多方法。

文档位于docs.rs。目前,许多文档相当简略,在这种情况下,最好参考标准库中字符串类型的匹配方法。欢迎您贡献更详尽的内联文档。


lib.rs:

UTF-16小端字符串类型。

此crate提供了两种字符串类型,可以直接将UTF-16编码的字节作为字符串处理:分别是WStringWStr。它们与UTF-16的关系就像Stringstr与UTF-8的关系一样。这里的一些概念和函数文档描述得相当简略,在这种情况下,你可以查阅Stringstr上的等效函数,行为应该完全相同,只是底层的字节编码不同。

因此,WString是一种拥有包含字符串的字节的数据类型。就像String和它所依赖的底层Vec一样,它区分了长度(WString::len)和容量(String::capacity)。这里长度是使用的字节数,而容量是指字符串在不重新分配的情况下可以增长的字节数。

WStr类型不拥有任何字节,它只能指向包含有效UTF-16的字节切片。因此,你只会将它用作引用,就像你将str用作&str一样。

WString类型实现了Deref<Target = WStr<ByteOrder>

UTF-16字节序

UTF-16将编码为无符号的16位整数([u16]),表示码位。然而,不同的CPU架构使用不同的字节序来编码这些 [u16] 整数:分别为小端大端。因此,在处理UTF-16字符串时,你需要了解编码的字节序,通常编码变体被称为UTF-16LE和UTF-16BE。

对于这个crate,这意味着类型需要知道字节序,这通过使用byteorder::ByteOrder特质作为类型泛型参数来实现:WString<ByteOrder>WStr<ByteOrder>通常写作WString<E>WStr<E>,其中E代表“端序”。

这个crate导出BigEndian,[BE],LittleEndian和[LE],以便您在需要表示类型时使用。

use utf16string::{BigEndian, BE, WString};

let s0: WString<BigEndian> = WString::from("hello");
assert_eq!(s0.len(), 10);

let s1: WString<BE> = WString::from("hello");
assert_eq!(s0, s1);

由于这些类型书写起来可能有些繁琐,它们通常可以自动推断,尤其是在使用简写构造函数的帮助下,如WString::from_utf16leWString::from_utf16beWStr::from_utf16leWStr::from_utf16be和相关函数的帮助下。例如

use utf16string::{LE, WStr};

let b = b"h\x00e\x00l\x00l\x00o\x00";

let s0: &WStr<LE> = WStr::from_utf16(b)?;
let s1 = WStr::from_utf16le(b)?;

assert_eq!(s0, s1);
assert_eq!(s0.to_utf8(), "hello");

依赖项

~120KB