gpt4 book ai didi

java - 实现一个函数来检查字符串/字节数组是否遵循 utf-8 格式

转载 作者:搜寻专家 更新时间:2023-10-30 19:57:48 25 4
gpt4 key购买 nike

我正在尝试解决这个面试问题。

After given clearly definition of UTF-8 format. ex: 1-byte : 0b0xxxxxxx 2- bytes:.... Asked to write a function to validate whether the input is valid UTF-8. Input will be string/byte array, output should be yes/no.

我有两种可能的方法。

首先,如果输入的是一个字符串,由于UTF-8最多4个字节,在我们去掉前两个字符“0b”之后,我们可以使用Integer.parseInt(s)来检查字符串的其余部分是否范围为 0 到 10FFFF。此外,最好先检查字符串的长度是否为 8 的倍数,以及输入字符串是否包含全 0 和 1。所以我将不得不遍历字符串两次,复杂度为 O(n)。

其次,如果输入是一个字节数组(如果输入是一个字符串,我们也可以使用这个方法),我们检查每个 1 字节的元素是否在正确的范围内。如果输入是字符串,首先检查字符串的长度是 8 的倍数,然后检查每个 8 字符的子字符串是否在范围内。

我知道有几个关于如何使用 Java 库检查字符串的解决方案,但我的问题是我应该如何根据问题实现该功能。

非常感谢。

最佳答案

我们先来看一个visual representation of the UTF-8 design .

enter image description here


现在让我们继续我们必须做的事情。

  • 遍历字符串的所有字符(每个字符是一个字节)。
  • 我们需要根据代码点对每个字节应用掩码,因为 x 字符代表实际代码点。我们将使用二进制 AND 运算符 (&),如果它在两个操作数中都存在,则将其复制到结果中。
  • 应用掩码的目的是删除尾随位,以便我们将实际字节与第一个代码点进行比较。我们将使用 0b1xxxxxxx 进行按位运算,其中 1 将出现“Bytes in sequence”时间,其他位将为 0。
  • 然后我们可以与第一个字节进行比较以验证它是否有效,并确定实际字节是什么。
  • 如果输入的字符不是大小写,则表示该字节无效,我们返回“否”。
  • 如果我们能跳出循环,那就意味着每个字符都是有效的,因此字符串也是有效的。
  • 确保返回 true 的比较对应于预期的长度。

这个方法看起来像这样:

public static final boolean isUTF8(final byte[] pText) {

int expectedLength = 0;

for (int i = 0; i < pText.length; i++) {
if ((pText[i] & 0b10000000) == 0b00000000) {
expectedLength = 1;
} else if ((pText[i] & 0b11100000) == 0b11000000) {
expectedLength = 2;
} else if ((pText[i] & 0b11110000) == 0b11100000) {
expectedLength = 3;
} else if ((pText[i] & 0b11111000) == 0b11110000) {
expectedLength = 4;
} else if ((pText[i] & 0b11111100) == 0b11111000) {
expectedLength = 5;
} else if ((pText[i] & 0b11111110) == 0b11111100) {
expectedLength = 6;
} else {
return false;
}

while (--expectedLength > 0) {
if (++i >= pText.length) {
return false;
}
if ((pText[i] & 0b11000000) != 0b10000000) {
return false;
}
}
}

return true;
}

编辑: 实际方法不是原来的方法(几乎,但不是),是从here 偷来的.根据@EJP 评论,原始版本无法正常工作。

关于java - 实现一个函数来检查字符串/字节数组是否遵循 utf-8 格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28890907/

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