由于这里有多个问题,我将尝试分别回答:
我认为你想要的类型是[u16]
and Vec<u16>
.
默认字符串类型str
and String
是包装纸[u8]
and Vec<u8>
(技术上不正确str
这是原始的,但足够接近)。具有单独类型的要点是保持底层字节的不变性UTF-8 格式良好.
同样,你可以有Utf16Str
and Utf16String
类型环绕[u16]
and Vec<u16>
保留一个UTF-16 格式良好不变,即不存在未配对的代理。
但正如您在问题中注意到的那样,JavaScript 字符串can包含未配对的代理。那是因为JavaScript 字符串并非严格意义上的 UTF-16,它们确实是任意序列u16
没有额外的不变量。
由于没有需要维护的不变量,我认为包装类型没有那么有用。
rust-encoding 支持基于字节的 UTF-16-LE 和 UTF-16-BE。您可能需要基于 UTF-16u16
相反。
std::str::Utf16Units
确实不是字符串类型。它是由返回的迭代器str::utf16_units()
将 Rust 字符串转换为 UTF-16(不是 LE 或 BE)的方法。您可以使用.collect()
在该迭代器上得到Vec<u16>
例如。
唯一安全的获取方式Rc<[u16]>
是要胁迫Rc<[u16; N]>
其大小在编译时已知,这显然是不切实际的。我不会推荐不安全的方法:分配内存,向其写入一个希望与内存表示相匹配的标头RcBox
,并转变。
如果您要使用原始内存分配来完成此操作,最好使用您自己的类型,以便您可以使用其私有字段。卷须这样做:https://github.com/servo/tendril/blob/master/src/buf32.rs https://github.com/servo/tendril/blob/master/src/buf32.rs
或者,如果您愿意承担额外间接的成本,Rc<Vec<u16>>
既安全又容易。