gpt4 book ai didi

java - 是否有 UTF-8 无法识别的字节?

转载 作者:行者123 更新时间:2023-12-01 08:46:16 25 4
gpt4 key购买 nike

我使用以下代码将字符串写入 UTF-8 中的流中格式。我在字符串的字节前加上一个带符号的短整型前缀,然后将它们写出来。有一个异常(exception):我不能以 0x0010 为前缀,因为它是最终格式中的关键字。但我必须确保读取器最终得到与我的 str 参数完全相同的字符串,即使它的长度是 0x0010。

public static void writeString(DataOutputStream out,String str) throws IOException{
byte[] bytes = str.getBytes(CHARSET_UTF_8);
if(bytes.length > Short.MAX_VALUE){
throw new IOException();
}
short len = (short)bytes.length;
if(bytes.length == 0x0010){
len++;
}
out.writeShort(len);
out.write(bytes);
if(bytes.length == 0x0010){
out.write(DEAD_BYTE);
}
}
public static final Charset CHARSET_UTF_8 = Charset.forName("UTF-8");

字符串末尾是否有 UTF-8 无法识别的字节(256 个字节)?

此外,以下问题对我没有帮助。我最后得到了一个 ? 字符。 30025693

最佳答案

默认情况下,您放入 UTF-8 字符串中的任何内容都将被解码为某个字符。如果它不是有效的 UTF-8 序列,将使用替换字符 () - 并且仍会出现在您的输出中。

您可以从输出字符串中删除 ,但它也可以来自输入字符串。相反,您应该从编码的 UTF-8 字节中去除额外的字节:

static String readString(final DataInputStream in) throws IOException {
int len = in.readUnsignedShort();
final byte[] bytes = new byte[len];
in.read(bytes);
if (bytes[len - 1] == -1) {
len--;
}
return new String(bytes, 0, len, UTF_8);
}

另一种选择是在编码长度时跳过0x0010并将上面的所有值移动1:

static void writeString(final DataOutputStream out, final String str) throws IOException {
final byte[] bytes = str.getBytes(UTF_8);
short len = (short) bytes.length;
if (bytes.length >= 0x0010) {
len++;
}
out.writeShort(len);
out.write(bytes);
}

static String readString(final DataInputStream in) throws IOException {
int len = in.readUnsignedShort();
if (len == 0x0010) {
throw new IllegalStateException();
} else if (len > 0x0010) {
len--;
}
final byte[] bytes = new byte[len];
in.read(bytes);
return new String(bytes, UTF_8);
}

这两种解决方案都是黑客行为,可能会在未来造成麻烦。正确的解决方案是消除这种人为限制:

  1. 如果您控制最终格式,请重新设计它,以便允许任何字节序列。
  2. 否则,如果仅在第一个位置不允许 0x0010,则始终在此处放置一个常量值,后跟实际长度。 (例如:00 11 00 10 ...)
  3. 否则,如果0x0010不能出现在任何位置,则将其转义:\x00\x10被编码为\\n\ 编码为 \\

最后0x0010看起来像UTF-16编码的新行。如果确实如此,那么您不应该将二进制数据放入文本中 - 这会导致更多问题。在这种情况下,您应该将字符串直接放入 UTF-16 编码文本中,或使用 ASCII 安全编码(如 base64)。

关于java - 是否有 UTF-8 无法识别的字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43026907/

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