You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Base64解码后文本首行出现中文乱码问题排查求助

解决Base64解码后第一行开头乱码的问题

嘿,我之前做类似的文本转Base64工具时也踩过编码的坑,咱们来看看你的代码问题出在哪~

核心问题分析

你当前代码里的字符流与字节流混用是导致乱码的主要原因:

  • Files.readAllBytes是直接读取文件的原始字节,这一步没问题;
  • 但你用PrintWriter来写入内容,PrintWriter是字符流,默认会用系统编码把字符串转成字节写入。Base64编码后的字符串在这个转换过程中,很可能因为编码不匹配导致字节被篡改,后续解码时自然就出现乱码了。
  • 另外,writer.print("")这种清空文件的方式也不够可靠,它并没有真正截断文件内容,可能残留旧数据的字节。

修复后的代码示例

咱们把字符流换成字节流来处理,保证编码全程一致:

加密方法(文本转Base64)

public void encrypt() {
    try {
        // 读取原始文件字节
        byte[] fileText = Files.readAllBytes(appFile.toPath());
        // 进行Base64编码
        Base64.Encoder encoder = Base64.getEncoder();
        byte[] encodedBytes = encoder.encode(fileText);
        // 直接写入字节,覆盖原有文件
        Files.write(appFile.toPath(), encodedBytes, StandardOpenOption.TRUNCATE_EXISTING);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

解密方法(Base64转文本)

public void decrypt() {
    try {
        // 读取Base64编码后的字节
        byte[] encodedBytes = Files.readAllBytes(appFile.toPath());
        // 进行Base64解码
        Base64.Decoder decoder = Base64.getDecoder();
        byte[] decodedBytes = decoder.decode(encodedBytes);
        // 写入解码后的原始字节,保证和原文件完全一致
        Files.write(appFile.toPath(), decodedBytes, StandardOpenOption.TRUNCATE_EXISTING);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

额外注意事项

如果你的原始文本文件是用特定编码(比如UTF-8)保存的,解码后写入时不需要额外指定编码——因为decodedBytes就是原文件的原始字节,直接写入就能完美还原内容。

内容的提问来源于stack exchange,提问作者K.Milli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 02:33:32