【问题标题】:Strange character appearing after doing UTF-8 Base64 Encoding/Decoding Java执行 UTF-8 Base64 编码/解码 Java 后出现的奇怪字符
【发布时间】:2017-12-14 06:32:58
【问题描述】:

我通过这个在线转换器 UTF8 运行了一些输入文本

https://www.base64encode.org/

我将输出放入我的 API,它会对其进行解码并进行进一步处理。

API 调用

@RequestMapping(value = "/highlight", method = RequestMethod.POST)
@ResponseBody
public String highlightTester(@RequestBody String programInput) throws UnsupportedEncodingException {
    byte[] decoded = Base64.getMimeDecoder().decode(programInput);
    String result = new String(decoded, StandardCharsets.UTF_8);

当我记录这些信息时,我不断得到一个奇怪的字符..

输入

{
    "code": "ICAgICAgICAvLyBTaW1wbGUgdXNlIFB5Z21lbnRzIGFzIHlvdSB3b3VsZCBpbiBQeXRob24NCiAgICAgICAgaW50ZXJwcmV0ZXIuZXhlYygiZnJvbSBweWdtZW50cyBpbXBvcnQgaGlnaGxpZ2h0XG4iDQogICAgICAgICAgICAgICAgKyAiZnJvbSBweWdtZW50cy5sZXhlcnMgaW1wb3J0IFB5dGhvbkxleGVyXG4iDQogICAgICAgICAgICAgICAgKyAiZnJvbSBweWdtZW50cy5mb3JtYXR0ZXJzIGltcG9ydCBIdG1sRm9ybWF0dGVyXG4iDQogICAgICAgICAgICAgICAgKyAiZm9ybWF0dGVyID0gSHRtbEZvcm1hdHRlcihzdHlsZT0nbW9ub2thaScsIg0KICAgICAgICAgICAgICAgICsgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lbm9zPUZhbHNlLCINCiAgICAgICAgICAgICAgICArICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9jbGFzc2VzPVRydWUsIg0KICAgICAgICAgICAgICAgICsgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3NjbGFzcz0nJywiDQogICAgICAgICAgICAgICAgKyAiICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXN0eWxlcz0nbWFyZ2luOiAwJykiDQogICAgICAgICAgICAgICAgKyAiXG5yZXN1bHQgPSBoaWdobGlnaHQoY29kZSwgUHl0aG9uTGV4ZXIoKSwgZm9ybWF0dGVyKSIpOw0KDQogICAgICAgIC8vIEdldCB0aGUgcmVzdWx0IHRoYXQgaGFzIGJlZW4gc2V0IGluIGEgdmFyaWFibGUNCiAgICAgICAgbG9nLmluZm8oaW50ZXJwcmV0ZXIuZ2V0KCJyZXN1bHQiLCBTdHJpbmcuY2xhc3MpKTsNCiAgICAgICAgcmV0dXJuIGludGVycHJldGVyLmdldCgicmVzdWx0IiwgU3RyaW5nLmNsYXNzKTs="
}

奇怪的输出

....#1e0010">�</span><span style="color: #f92672">^</span>....

现在,即使我使用不同的编码器,我传入的每一种输入都会发生这种情况。为什么会这样?

更多输出

r�^wefwefwef

我正在使用 Java Spring Boot 来运行我的 API,所以想知道我是否将它通过 Postman 传递给我的调用添加了一些额外的风味。

【问题讨论】:

  • 给我们一个合适的例子,我们可以重现这个问题。您提供哪些输入,您在控制器中收到哪些输入等。
  • 创建String时需要指定字符集。 从不在服务器应用程序中使用单个参数new String(byte[]),始终使用您指定字符集作为第二个参数的双参数版本:new String(decoded, StandardCharsets.UTF_8)
  • mime 解码器也是个奇怪的选择。你试过Base64.getDecoder()吗?
  • @ErwinBolwidt 已更新。另外,我尝试了 getDecoder 没有任何变化。
  • 等一下。您正在通过解码器运行整个 JSON 片段吗?还是只是 base64 字符串?

标签: java spring spring-boot encoding utf-8


【解决方案1】:

您将整个请求正文传递给 base64 解码器。由于请求正文不仅包含 base64 编码的字符串,还包含 JSON 标记,因此解码将失败或导致意外输出。

要修复,要么:

  • 确保您的请求正文中只有 base64 内容;或
  • 解析请求正文中的 JSON 并提取要解码的 base64 字符串;或
  • 创建一个与您的 JSON 结构相对应的 bean,并让 Spring 自动将请求正文映射到该 bean。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    相关资源
    最近更新 更多