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

2024-02-14

For most程序,最好内部使用 UTF-8 http://utf8everywhere.org/并在必要时转换为其他编码。但就我而言,我想编写一个 Javascript 解释器,并且仅存储 UTF-16 字符串(或数组)要简单得多u16), 因为

  1. 我需要单独寻址 16 位代码单元(这通常是一个坏主意,但 Javascript 需要这样做)。这意味着我需要它来实现Index<usize>.

  2. 我需要存储不成对的代理,即格式错误的 UTF-16 字符串(因此,ECMAScript 字符串在技术上被定义为数组u16, that usually http://www.ecma-international.org/ecma-262/5.1/#sec-4.3.16代表 UTF-16 字符串)。有一种编码恰如其名WTF-8 https://simonsapin.github.io/wtf-8/以 UTF-8 存储未配对的代理,但我不想使用这样的东西。

我想要通常拥有/借用的类型(比如String / str and CString / CStr)与所有或最常用的方法。我不想滚动我自己的字符串类型(如果我可以避免的话)。

另外,我的字符串永远是不可变的,在Rc并从包含指向所有字符串的弱指针的数据结构中引用(实现字符串实习 https://en.wikipedia.org/wiki/String_interning)。这可能是相关的:也许最好有Rc<Utf16Str>作为字符串类型,其中Utf16Str是未调整大小的字符串类型(可以定义为struct Utf16Str([u16]))。这将避免在访问字符串时跟随两个指针,但我不知道如何实例化一个Rc具有未调整大小的类型。

考虑到上述要求,仅仅使用 rust-encoding 是非常不方便的,因为它会处理所有非 UTF-8 编码作为向量u8 https://lifthrasiir.github.io/rust-encoding/encoding/types/trait.Encoding.html#method.encode.

另外,我不确定是否使用标准库 https://internals.rust-lang.org/t/pre-rfc-stabilize-utf-16-encoding-in-std/2152一切都可能对我有帮助。我调查了Utf16Units它只是一个迭代器,而不是正确的字符串类型。 (另外,我知道OsString没有帮助 - 我不在 Windows 上,它甚至没有实现Index<usize>)


由于这里有多个问题,我将尝试分别回答:


我认为你想要的类型是[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>>既安全又容易。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • PHP 的 mb_internal_encoding 实际上是做什么的?

    根据 PHP 网站 http www php net manual en function mb internal encoding php它这样做 coding 是用于 HTTP 输入的字符编码名称 字符编码转换 HTTP输出字符编码 转
  • 更改特定字符串的颜色

    有谁知道如果将特定单词输入文本区域 我如何更改它的颜色 例如 如果用户输入 你好我的朋友 它会动态地将 你好 更改为绿色 在google上花了很多时间 找不到任何相关的东西 谢谢 textareas 的设计目的不是选择性着色
  • 如何在 xslt 2.0 中解析字符串到日期

    是否可以像这样转换字符串30042013 2013 年 4 月 30 日 日期格式 所以我可以稍后在类似的函数中使用它format date 就像托马拉克说的 你可以使用substring and concat 要构建一个字符串 您可以将其
  • toUpperCase() 方法什么时候创建一个新对象?

    public class Child public static void main String args String x new String ABC String y x toUpperCase System out println
  • 错误[E0554]:#![功能]可能无法在稳定发布通道上使用无法使用货物安装赛车

    我正在尝试使用 Cargo 安装 Racer 所以我执行了命令cargo install racer在终端中并导致错误 error E0554 feature may not be used on the stable release ch
  • Rust 为什么要费心“let”? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我对 Rust 很感兴趣 所以我开始阅读 Rust 网站上的 Rust 编程指南 发现变量是通过以下方式声明的 let x i32 5 这意味着
  • C 支持原始字符串吗?

    C 11 添加了对原始字符串文字的支持 例如 R foo A weird string foo C有这样的东西吗 如果有 标准是什么版本 C11 如果没有 有谁知道它是否正在计划中以及是否有编译器支持它 C有这样的东西吗 如果有 标准是什么
  • 为什么是 ”\?” C/C++ 中的转义序列?

    C C 中有四种特殊的非字母字符需要转义 单引号 双引号 反斜杠 和问号 显然是因为它们有特殊的含义 对于单身char 对于字符串文字 对于转义序列 但为什么是 其中之一 我今天读了教科书上的转义序列表 我意识到我已经never逃脱了 以前
  • 将 numpy 代码点数组与字符串相互转换

    我有一个很长的 unicode 字符串 alphabet range 0x0FFF mystr join chr random choice alphabet for in range 100 mystr re sub W mystr 我想
  • 获取两个字符串之间的公共部分c# [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要的是获取两个单词之间的共同部分并获取差异 例子 场景1 word1 感言 word2 Test 将返回 公共部分Test 不同之
  • 删除Android所有语言中的字符串

    我有一个包含多个翻译的应用程序 我想删除一些字符串 我怎样才能重构并删除它们一次 例如在默认情况下strings xml文件并自动将删除传播到其他翻译的其他 strings xml 文件 您可以通过 Android Studio 中的 翻译
  • 字符串列表,获取n个元素的公共子串,Python

    我的问题可能类似于this https stackoverflow com questions 37514193 count the number of occurrences of n length not given string in
  • string.Compare 行为

    怎么会这样呢 这是从VS2008中的立即窗口获取的 string Compare 1 string Compare 0 0 1 从言论来看字符串比较 http msdn microsoft com en us library 84787k2
  • 用于字数计算的 Swift String 中的字数

    我想做一个程序来找出字符串中有多少个单词 用空格 逗号或其他字符分隔 然后把总数加起来 我正在制作一个平均计算器 所以我想要数据总数 然后将所有单词相加 update Xcode 10 2 x Swift 5 或更高版本 使用基础方法enu
  • 从 Rust 中的函数返回异步函数

    第 1 部分 返回异步函数的函数的签名应该是什么 pub async fn some async func arg str What should be sig here pub fn higher order func action st
  • 将 Excel 范围转换为 VBA 字符串

    我想将给定范围内的值转换为 VBA 字符串 其中原始单元格值由任何选定的列分隔符和行分隔符分隔 分隔符可以是一个字符或更长的字符串 行分隔符是行末尾的字符串 该字符串应该像我们从左上角 从左到右 到右下角读取文本一样完成 以下是范围 A1
  • 如何处理最终字符串?

    制作有什么好处吗String as final或者我们可以做String as final 我的理解是 由于 String 是不可变的 因此没有必要将其设为最终的 这是正确的还是人们想要的情况String as Final Code pri
  • 清洁琴弦的更好方法?

    我正在使用这种方法来清理字符串 public static string CleanString string dirtyString string removeChars lt gt string result dirtyString f
  • Javascript:删除字符串标点符号并拆分成单词?

    抱歉 如果之前有人问过这个问题 但我正在尝试从这样的字符串中获取单词数组 Exclamation Question Quotes Apostrophe Wasn t Couldn t Didn t 该数组应该看起来像这样 exclamati
  • str.translate 与 str.replace - 何时使用哪一个?

    何时以及为什么使用前者而不是后者 反之亦然 目前尚不完全清楚为什么有些人使用前者以及为什么有些人使用后者 它们有不同的目的 translate只能用任意字符串替换单个字符 但一次调用可以执行多次替换 它的参数是一个特殊的表 它将单个字符映射

随机推荐