将UTF-16索引转换为UTF-8兼容索引

将UTF-16索引转换为UTF-8兼容索引,utf-8,utf-16,Utf 8,Utf 16,我目前正在使用Telegram API,其中一个API返回以下信息: 一段文字 以UTF-16代码单位表示的偏移量 以UTF-16代码单位表示的长度 在我的编程语言Rust中,所有字符串都是有效的UTF-8。这意味着UTF-16偏移量不是立即有用的,因为它们可以以可变量关闭(由于1或3字节代码点)。UTF-8中的一个单字节代码点对应于UTF-16中的一个双字节代码点,因此我不能简单地索引UTF-8字符串,因为我可能位于代码点边界之外 我现在想知道:有没有一种方法可以将其转换为有效的UTF-8

我目前正在使用Telegram API,其中一个API返回以下信息:

  • 一段文字
  • 以UTF-16代码单位表示的偏移量
  • 以UTF-16代码单位表示的长度
在我的编程语言Rust中,所有字符串都是有效的UTF-8。这意味着UTF-16偏移量不是立即有用的,因为它们可以以可变量关闭(由于1或3字节代码点)。UTF-8中的一个单字节代码点对应于UTF-16中的一个双字节代码点,因此我不能简单地索引UTF-8字符串,因为我可能位于代码点边界之外


我现在想知道:有没有一种方法可以将其转换为有效的UTF-8,而无需重复使用UTF-8字符串,或者信息在UTF-8中一次都是无用的?

我没有标记Rust,因为它只是与问题偶然相关。这是一个有趣的界面。文本以UTF-8传输,但偏移量以UTF-16传输。这对于将文本转换为字符串(内部使用UTF-16)的Java和.NET程序员来说可能是有意义的。在Rust中,必须迭代字符串(或将其转换为UTF-16数组)。由于UTF-8的可变长度特性,只有UTF-8偏移量可以在不迭代的情况下直接访问UTF-8字符串的一部分。如何对>0xFFFF的代码点进行编码?对于这样的接口(你说是1到3个字节,而不是4个字节),我怀疑每个代码单元都被翻译成UTF-8。你能检查一下吗?注意:严格来说,这样的UTF-8不是有效的Unicode字符串:您得到的代码点不正确,但可能将代理项作为代码点进行编码是可以的[UTF-8允许使用数字,但结果不是Unicode字符串]。在任何情况下,都有必要进行迭代,但无论如何您都应该这样做,出于安全原因:您不希望接收退化UTF-8(通常是Unicode代码点的退化序列)。过滤器在这种情况下可能不起作用(例如,UTF-8实现有各种别名
NUL
),UTF-8和UTF-16都是Unicode的可变长度编码。虽然这两种形式都提供了一种以“码点”形式传达文本的方法,但即使是那些并不一定意味着用户可能会识别为“字符”。正确的术语可能是“grapheme”,它是文本的量,即单个表示“单位”——然而,那些可以像包括组合变音符号的grapheme或标志一样使用多个代码点来表示它们的grapheme。