2个不稳定版本
0.2.0 | 2020年10月10日 |
---|---|
0.1.0 | 2020年10月9日 |
#1038 in 编码
63,001 每月下载量
用于 10 个crate (4 直接)
74KB
1.5K SLoC
UTF-16字符串类型
此crate提供两种字符串类型以与UTF-16编码的字节直接工作,它们与String
和&str
与UTF-8编码的字节工作的方式直接对应。
UTF-16可以使用小端和大端字节顺序进行编码,此crate使用泛型byteorder类型来识别这些类型包含的编码,因此公开的主要类型是
&WStr<ByteOrder>
WString<ByteOrder>
这些类型旨在与标准库中的&str
和String
类型的行为非常相似。虽然已经涵盖了大量的API,但欢迎您贡献更多方法。
文档位于docs.rs。目前,许多文档相当简略,在这种情况下,最好参考标准库中字符串类型的匹配方法。欢迎您贡献更详尽的内联文档。
lib.rs
:
UTF-16小端字符串类型。
此crate提供了两种字符串类型,可以直接将UTF-16编码的字节作为字符串处理:分别是WString
和WStr
。它们与UTF-16的关系就像String
和str
与UTF-8的关系一样。这里的一些概念和函数文档描述得相当简略,在这种情况下,你可以查阅String
或str
上的等效函数,行为应该完全相同,只是底层的字节编码不同。
因此,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_utf16le
、WString::from_utf16be
、WStr::from_utf16le
、WStr::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