String 是否有UTF-16字符串类型的Rust库?(用于编写Javascript解释器)

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中,有一种命名恰当的编码来存储未配对的代理,但我不想使用这样的东西

对于大多数程序来说,最好是在必要时转换为其他编码。但在我的例子中,我想编写一个Javascript解释器,只存储UTF-16字符串(或
u16
数组)要简单得多,因为

  • 我需要单独处理16位代码单元(一般来说这是个坏主意,但Javascript需要这样做)。这意味着我需要它来实现
    索引

  • 我需要存储未配对的代理,即格式错误的UTF-16字符串(因此,ECMAScript字符串在技术上定义为表示UTF-16字符串的
    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解释器,而不是浏览器)。我想你是对的,没关系。