Java byte数组与String互转:编码细节与踩坑记录

做Java开发经常会碰到byte数组和String互转的场景,比如读写文件、处理网络报文的时候。

看起来是基础操作,真踩过几次编码的坑之后,才发现里面细节挺多。

最直接的写法是直接调用getBytes()和new String(),用的是当前运行平台的默认编码。

复制代码
String originalString = "Hello, 世界!";
byte[] byteArray = originalString.getBytes(); // 默认编码
String decodedString = new String(byteArray);
System.out.println("默认编码转换结果: " + decodedString);

这种写法本地调试可能一切正常,一旦换个部署环境就容易出乱码。不同操作系统、不同JVM配置的默认编码都可能不一样,生产环境不建议这么写。

稳妥的做法是显式指定编码,绝大多数场景用UTF-8就够了。

Java 7及以上版本可以直接用StandardCharsets.UTF_8,比手写字符串常量省心,也不用额外处理受检异常。

复制代码
byte[] utf8Bytes = originalString.getBytes(StandardCharsets.UTF_8);
String utf8String = new String(utf8Bytes, StandardCharsets.UTF_8);
System.out.println("UTF-8编码转换结果: " + utf8String);

还有个很容易踩的坑,就是字节数组被截断的场景。像中文这种多字节字符,如果刚好从中间断开,转成字符串的时候末尾就会出现乱码。

复制代码
byte[] partialBytes = new byte[utf8Bytes.length - 1];
System.arraycopy(utf8Bytes, 0, partialBytes, 0, partialBytes.length);
String partialString = new String(partialBytes, StandardCharsets.UTF_8);
System.out.println("截断字节数组转换结果: " + partialString + " (注意最后一个字符可能乱码)");

做分包传输、分段读文件的时候特别容易碰到这个问题,写代码的时候要留意边界处理。

不同编码的适用场景差别不小。默认编码完全依赖运行环境,只适合本地临时测试,不能上生产。

lcjmSSL让国际化网站安全无忧。完美支持中文域名和IDN域名申请,通过开放API或回调接口,您可自行实现与企业内部系统的深度集成,自动化程度由您掌控。

UTF-8通用性最强,支持多语言,网络传输、跨平台交互基本都是首选。ISO-8859-1是单字节编码,只适合纯ASCII字符的场景,超出范围的内容都会出现乱码。

下面附一个完整的Maven项目配置,拿来直接编译运行上面的示例代码没问题。

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>bytearray-demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>3.0.0</version>
                <configuration>
                    <mainClass>ByteArrayToStringExample</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
相关推荐
分支预测失败20 分钟前
RISC-V 核间中断 IPI 实战:从 MSIP 寄存器到 IMSIC 消息投递
linux·后端
这个DBA有点耶36 分钟前
同样48核配置TPS差1倍?高性价比数据库一体机的“软硬协同”才是分水岭
服务器·数据库·架构
shehuiyuelaiyuehao39 分钟前
算法29,前缀和,除自身以外的数组的乘积
java·数据结构·算法
小刘在重生~1 小时前
Java常用类|String类详解 + BigDecimal精准计算(含面试题)
java·开发语言·python
随遇而安zx1 小时前
【多线程】---JMM 与 volatile 深度解析
java·多线程
GeW1 小时前
RHCE考试避坑指南"90%考生容易忽略的细节
linux
邪修king1 小时前
Re:Linux系统篇(十九):进程篇(八): 进程等待详解:wait/waitpid,僵尸进程到底该如何回收
java·开发语言
啵啵啵鱼2 小时前
DS-顺序表
java·数据结构·笔记·后端·链表·obsidian
TinyMemory2 小时前
Java 面向对象核心入门(七):方法重载 Overload,同一个方法名能干不一样的活
java·面向对象·overload·方法重载