【发布时间】:2022-01-07 10:24:49
【问题描述】:
如何根据字节大小限制拆分包含非ascii字符的字符串? 我想拆分以下字符串并添加到列表中,拆分基于大小限制(例如)3 个字节。
这里的问题是扩展 ascii char 需要 2 个字符,拆分后数据变成垃圾,如实际输出所示。
我想要的是下面给出的预期输出,如果我们遇到非 ascii 字符,它可以只写 2 个字节。请让我知道如何解决它。 问题:
String words = "Hello woræd æåéøòôóâ";
List<String> payloads = new ArrayList<>();
try( ByteArrayOutputStream outStream = new ByteArrayOutputStream();) {
byte[] chars = words.getBytes(StandardCharsets.UTF_8);
for (byte ch: chars) {
outStream.write(ch);
if (outStream.size() >= 3) {
String s = outStream.toString("UTF-8");
payloads.add(s);
outStream.flush();
outStream.reset();
}
}
payloads.add(outStream.toString("UTF-8"));
outStream.flush();
System.out.println(payloads);
} catch (IOException e) {
e.printStackTrace();
}
实际输出: [Hel, lo , wor, æd, �, �å, é�, �ò, ô�, �â, ]
预期输出: [Hel, lo , wor, æd, ,æ, å, é, ø, ò, ô, ó, â] ]
【问题讨论】:
-
你想对占用四个字节的字符发生什么?
-
我这里说的是解决实际问题的核心问题。考虑一个具有可变列的动态行的表,其中每列长度的最大大小为 64KB。此表行必须从长度可以超过 64KB 的字符串填充。超过 64kb 的行添加动态列,如果拆分时有 2 或 4 字节的 char,可以将值
-
逐个代码点循环遍历字符串代码点(使用
String.codePointAt和Character.charCount),将每个代码点转换为UTF-8字节,并在将字节写入ByteArrayOutputStream之前检查字节数。顺便说一句,ByteArrayOutputStream 的flush和close方法什么都不做,所以调用flush() 没有意义,使用try-with-resources 语句也没有意义。
标签: java unicode utf-8 byte bytearrayoutputstream