【问题标题】:How to split a string containing non ascii characters based on the byte size limit?如何根据字节大小限制拆分包含非 ascii 字符的字符串?
【发布时间】: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.codePointAtCharacter.charCount),将每个代码点转换为UTF-8字节,并在将字节写入ByteArrayOutputStream之前检查字节数。顺便说一句,ByteArrayOutputStream 的flushclose 方法什么都不做,所以调用flush() 没有意义,使用try-with-resources 语句也没有意义。

标签: java unicode utf-8 byte bytearrayoutputstream


【解决方案1】:

它是 UTF-8。 UTF-8 旨在让您可以轻松检测字符边界。

所以:将 String 转换为 UTF-8 字节。

然后回溯,直到第一个排除的字节是合法的“第一个字节”,即不是 10xxxxxx。您现在位于字符边界处。

【讨论】:

猜你喜欢
  • 2011-03-08
  • 1970-01-01
  • 2011-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-05
  • 2014-10-09
  • 1970-01-01
相关资源
最近更新 更多