【问题标题】:Java code to convert between UTF8 and UTF16 offsets (Java string offsets to/from Python 3 string offsets)用于在 UTF8 和 UTF16 偏移之间转换的 Java 代码(Java 字符串偏移到/来自 Python 3 字符串偏移)
【发布时间】:2019-12-12 05:02:38
【问题描述】:

给定一个 Java 字符串和该字符串的偏移量,计算同一位置到 UTF8 字符串的偏移量的正确方法是什么?

更具体地说,给定 Java 字符串中有效代码点的偏移量,如何将该偏移量映射到 Python 3 字符串中该代码点的新偏移量?反之亦然?

是否有任何库方法已经提供了 Java 字符串偏移量和 Python 3 字符串偏移量之间的映射?

【问题讨论】:

  • 一种天真的方法是获取该偏移量之前的子字符串,将其转换为 UTF-8,然后计算字节数。
  • Joshm 要求的是代码点索引,而不是字节索引。

标签: java python-3.x unicode utf-8 utf-16


【解决方案1】:

Java 中正确的方法是使用codePointCount:

String sample = "? - abc";
int javaIndex = sample.indexOf("abc");
int codePointIndex = sample.codePointCount(0, javaIndex);

System.out.println(javaIndex);
System.out.println(codePointIndex);

输出:

5
4

虽然 Java 的 UTF-16 格式是一种可变长度格式,并且表情符号需要两个 chars,但根据 Unicode 标准,它只是一个代码点。所以abc 的 Java 索引是 5,但代码点索引(也适用于 Python 3 字符串)是 4。

请注意,正如方法名称所暗示的那样,Java 方法需要逐个计数代码点。所以它不是一个封闭的数学公式。

【讨论】:

    【解决方案2】:

    不,不可能。 UTF-16 每个代码点使用不同数量的代码单元,UTF-8 也是如此。因此,索引完全取决于字符串中的代码点。您必须扫描字符串并计数。

    不过,编码之间存在关系。一个代码点有两个 UTF-16 代码单元当且仅当它有四个 UTF-8 代码单元。因此,算法可以通过扫描 UTF-16 代码点来计算 UTF-8 代码单元:4 四个代表高代理,0 代表低代理,3 代表某个范围,2 代表另一个,1 代表另一个。

    【讨论】:

    • 我的意思是必须可以将所有偏移量映射到指向有效代码点的 Java 字符串中,然后再将偏移量映射到 Python 字符串中并返回。据我了解,这可以通过查看代码点索引来完成(正如@Codo 在 Java 方面所解释的那样),但我会对一些执行此操作而不是自己编程的库代码感兴趣(可能有细节或我不知道的陷阱)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 2013-09-30
    • 2020-11-29
    • 2017-09-13
    • 1970-01-01
    相关资源
    最近更新 更多