String 是否有UTF-16字符串类型的Rust库?(用于编写Javascript解释器)
对于大多数程序来说,最好是在必要时转换为其他编码。但在我的例子中,我想编写一个Javascript解释器,只存储UTF-16字符串(或String 是否有UTF-16字符串类型的Rust库?(用于编写Javascript解释器),string,rust,utf-16,String,Rust,Utf 16,对于大多数程序来说,最好是在必要时转换为其他编码。但在我的例子中,我想编写一个Javascript解释器,只存储UTF-16字符串(或u16数组)要简单得多,因为 我需要单独处理16位代码单元(一般来说这是个坏主意,但Javascript需要这样做)。这意味着我需要它来实现索引 我需要存储未配对的代理,即格式错误的UTF-16字符串(因此,ECMAScript字符串在技术上定义为表示UTF-16字符串的u16数组)。在UTF-8中,有一种命名恰当的编码来存储未配对的代理,但我不想使用这样的东西
u16
数组)要简单得多,因为
索引
u16
数组)。在UTF-8中,有一种命名恰当的编码来存储未配对的代理,但我不想使用这样的东西String
/str
和CString
/CStr
)。我不想滚动我自己的字符串类型(如果我可以避免的话)
此外,我的字符串始终是不可变的,位于Rc
后面,并从包含指向所有字符串的弱指针的数据结构中引用(实现)。这可能是相关的:也许最好使用Rc
作为字符串类型,其中Utf16Str
是未指定大小的字符串类型(可以定义为struct Utf16Str([u16])
)。这将避免在访问字符串时使用两个指针,但我不知道如何用未大小的类型实例化Rc
鉴于上述要求,仅使用rust编码是非常不方便的,因为它处理所有非UTF-8编码
另外,我也不确定是否能帮到我。我查看了
Utf16Units
,它只是一个迭代器,不是正确的字符串类型。(另外,我知道OsString
没有帮助-我不在Windows上,它甚至没有实现索引
)因为这里有多个问题,我将尝试分别回答:
我认为您需要的类型是
[u16]
和Vec
默认的字符串类型str
和string
是围绕[u8]
和Vec
的包装(从技术上讲,str是基本的,但足够接近)。使用单独类型的目的是保持不变,即底层字节在UTF-8中格式良好
类似地,可以有Utf16Str
和Utf16String
类型环绕[u16]
和Vec
,它们保留格式良好的UTF-16不变量,即不存在未配对的代理项
但正如您在问题中所注意到的,JavaScript字符串可以包含未配对的代理。这是因为JavaScript字符串并不是严格意义上的UTF-16,它们实际上是u16
的任意序列,没有额外的不变量
由于没有要维护的不变量,我认为包装器类型并没有那么有用
rust编码支持基于字节的UTF-16-LE和UTF-16-BE。您可能需要基于u16的UTF-16
std::str::Utf16Units
确实不是字符串类型。它是一个迭代器,由str::utf16\u units()
方法返回,用于将Rust字符串转换为UTF-16(而不是LE或BE)。例如,您可以在该迭代器上使用.collect()
,以获取Vec
获取
Rc
的唯一安全方法是强制执行编译时已知大小的Rc
,这显然是不切实际的。我不推荐这种不安全的方法:分配内存,给它写一个头,希望与RcBox
的内存表示相匹配,然后进行转换
如果要使用原始内存分配,最好使用自己的类型,这样就可以使用它的私有字段。卷须的作用是:
或者,如果您愿意承担额外间接寻址的成本,
Rc
是安全且容易得多的。为什么不使用WTF-8?好吧,这就是Servo所做的。Servo中的Javascript字符串不是真的归SpiderMonkey所有吗?在SpiderMonkey中,字符串是。我的理解是,Servo在字符串不属于Javascript引擎时存储WTF-8,在存储在Javascript值中时转换为UTF-16(我想编写Javascript解释器,而不是浏览器)。我想你是对的,没关系。