gpt4 book ai didi

java - JAVA 中具有 2 个以上字节的 UTF8 字符串的 Substring 或 characterAt 方法

转载 作者:搜寻专家 更新时间:2023-10-31 19:39:43 24 4
gpt4 key购买 nike

我试图找到一个子字符串方法或 characterAt 方法,它适用于 JAVA 中包含 UTF-8 编码文本的字符串。

在内部,JAVA 使用 UTF-16。这意味着 String 由大小为 2 个字节的字符组成。UTF-8 字符的大小最多为 6 个字节。当 JAVA 将其存储在字符串中时,它会将 UTF-8 字符拆分为多个字符。

例如:字符 U+20000(UTF-8 十六进制:F0 A0 80 80)在 JAVA 内部存储为具有两个字符(UTF-16 十六进制:D840 和 DC00)的字符串。

当您有一个包含 4 字节 UTF-8 字符的字符串并使用长度时,答案是“2”。当您使用 substring(0,1) 时,您将获得字符的前半部分。

一些代码来说明这一点:

    ByteBuffer inputBuffer = ByteBuffer.wrap(new byte[]{(byte)0xF0, (byte)0xA0, (byte)0x80, (byte)0x80});
CharBuffer data = Charset.forName("UTF-8").decode(inputBuffer);
String string_test = data.toString();
int length = string_test.length();
String first_half = string_test.substring(0, 1);
String second_half = string_test.substring(1, 2);
String full_character = string_test.substring(0, 2);

所有这一切,即使出乎意料,也不是错误,因为 JAVA 在 UTF-16 中工作。固有的 UTF-8 支持会很好。但它不在那里。

JAVA 是否在默认库中有任何类,或者某个地方是否存在提供 UTF-8 支持的类?如:

  • utf8string.length() - 如果
    中有一个 4 字节字符,则返回 1那里
  • utf8string.getCharacterAt(0) - 返回第一个字符,不是前半部分。
  • utf8string.substring(0,1) - 返回第一个字符,而不是它的前半部分。

或者,对此常用的解决方案是什么?读取 UTF-8 文件时,将所有非 UTF-16 支持的 UTF-8 字符转换为默认的 UTF-16 字符?结果,丢失了 UTF-16 不支持的代码点范围内字符的所有信息?这在我的具体实现中不一定是个问题,所以如果有通用的方法,我会很感兴趣。

最佳答案

Does JAVA have any class in the default library, or does a class exist somewhere that provides UTF-8 support?

您并不是真正追求 UTF-8 支持。您追求的是 Unicode 代码点(普通 32 位整数),而不是 UTF-16 代码单元。是的,Java 对此提供了支持,但使用起来并不非常容易。

例如,要获取特定代码点,请使用 String.codePointAt - 请记住,您提供的索引是根据 UTF-16 代码单元,不是代码点。

要查找代码点的长度,请使用 String.codePointCount .

要找到一个子串,你需要找到UTF-16编码单元的偏移量,然后使用普通的substring方法;使用 String.offsetByCodePoints找到正确的索引。

基本上通过 String API 查看所有包含 codePoint 的方法。

关于java - JAVA 中具有 2 个以上字节的 UTF8 字符串的 Substring 或 characterAt 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17524432/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com