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>
相关推荐
晚风醉蝶1 小时前
1-6-插入排序-InsertionSort
java·数据结构·排序算法
木白CPP1 小时前
Linux 驱动UART子系统源码分析
linux·运维·服务器·驱动开发·嵌入式硬件·开源软件
yaoxin5211232 小时前
497. Java 反射 - 使用反射读取注解
java·开发语言·python
RisunJan2 小时前
Linux命令-times(进程累计时间显示)
linux·运维·chrome
eralong3 小时前
Java 面向对象:继承、多态、接口
java·后端
哦虎!3 小时前
【数据库】事务
java·数据库·mysql
CDN3603 小时前
流媒体加速实践:出海东南亚短视频点播频繁缓冲,HLS 分片与 Nginx 配置调优
java·网络·nginx·流媒体加速
程序员黑豆3 小时前
Java中的null与NullPointerException完全指南:安全处理、实战排查与面试题
java·前端·ai编程
晴天164 小时前
Electron面试题-Day19
java·javascript·electron