【问题标题】:Java Base64 Sun to JDK8Java Base64 Sun 到 JDK8
【发布时间】:2016-03-30 11:16:23
【问题描述】:

我在数据库中有一堆字符串,不久前用sun.misc.BASE64Encoder 编码。

现在我想用java.util.Base64 解码(并编码更多的字符串)。

这两者的区别在于,Sun 的每 n 个字符添加一个新的行字符串

示例:

Sun Base64:   54y49568uyj304j534w5y
              34y0639j6yh93j5h0653j
              s45hr68o

JDK8 Base64:  54y49568uyj304j534w5y34y0639j6yh93j5h0653js45hr68o

为了让 JDK 解码器解析这些压缩字符串,我需要删除换行符。

问题:

  1. 我要删除\r\n(Unix)还是\n(Windows)或\r(旧Mac)?因为字符串取决于它们被编码的机器

  2. 如果我说zippedString.replaceAll("\r", "").replaceAll("\n", ""),我如何确保我不会在实际字符串中包含\r 字符,从而导致数据损坏?

  3. 还有其他方法可以在这两种机制之间架起一座桥梁吗?

【问题讨论】:

标签: java encoding java-8 base64 sun


【解决方案1】:

Base64 中没有空格,所以我将全部删除。

String toDecode = str.replaceAll("\\s+", "");

这消除了关于如何处理特定换行符或空格的任何歧义。

【讨论】:

    【解决方案2】:

    此处的“\r”和“\n”字符的用途纯粹与文本格式有关,您可以假设它们是不可见的。

    读取字符串值的代码应该负责过滤掉它们,无论使用什么方法,例如

    读取行 -> 修剪 -> 连接

    然后,解码连接的字符串。

    题外话,假设应用了不同的编码算法,这些字符是编码字母表的一部分。由于 Java 将 '\r' 和 '\n' 字符解释为新行的指示符(取决于操作系统),因此需要对编码值的字符串表示形式进行转义,例如“14y6\\n75b...”。 . 但是,这会导致更多的问题而不是好处,因此应该避免。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-07
      • 1970-01-01
      • 2010-11-22
      • 1970-01-01
      • 1970-01-01
      • 2021-04-29
      • 2010-12-21
      • 1970-01-01
      相关资源
      最近更新 更多