讲师中心 微信公众号
AI工具推荐 视频效率加速

如何在Java中将字符串转换为字节数组_指定字符集的重要性

酷婷君_8990

酷婷君_8990

发布时间:2026-02-15 12:11:53

|

212人浏览过

|

来源于php中文网

原创

String.getBytes() 不指定字符集会使用系统默认编码,导致跨平台结果不一致,引发乱码等问题;必须显式指定StandardCharsets.UTF_8等标准字符集,且编解码字符集需严格匹配。

如何在java中将字符串转换为字节数组_指定字符集的重要性

String.getBytes() 不指定字符集等于埋雷

Java 里 String.getBytes() 看似简单,但不传字符集参数时,它会用系统默认编码(比如 Windows 上是 GBK,Linux/macOS 默认可能是 UTF-8)。同一段代码在不同机器上跑,byte[] 结果可能完全不同——这不是 bug,是设计使然,但极易引发数据错乱。

常见错误现象:
本地测试正常,部署到服务器后 JSON 解析失败、文件写入乱码、HTTP 请求体被截断、Redis 存的字符串取出来变成乱码。

  • 永远显式传入字符集,例如 str.getBytes(StandardCharsets.UTF_8)
  • 避免用 str.getBytes("UTF-8") 这种字符串形式——它抛 UnsupportedEncodingException,且运行时才校验,编译期不报错
  • 如果必须用字符串名(如配置驱动),至少包一层 try-catch 并 fallback 到 UTF_8

UTF-8 和 ISO-8859-1 在字节长度上的直观差异

同一个中文字符,在 UTF-8 下占 3 字节,在 ISO-8859-1 下根本无法表示(会变成 ? 或抛异常);而英文字符在两者下都是 1 字节。这种差异直接影响网络传输、数据库字段长度校验、加密签名结果。

使用场景举例:
调用某老系统 HTTP 接口,文档写“编码为 ISO-8859-1”,你却用 UTF_8 编码发过去,对方解析出一堆问号;又或者你把用户昵称存进 MySQL VARCHAR(32) 字段,按 UTF_8 存没问题,但若误用 GBK 编码再转回字符串,长度计算就偏了。

立即学习“Java免费学习笔记(深入)”;

  • "你好".getBytes(StandardCharsets.UTF_8).length → 6
  • "你好".getBytes(StandardCharsets.ISO_8859_1).length → 抛 java.lang.IllegalArgumentException(因为无法映射)
  • "abc".getBytes(StandardCharsets.UTF_8).length == "abc".getBytes(StandardCharsets.ISO_8859_1).length → true(都是 3)

从 byte[] 回转 String 时,字符集必须严格匹配

用 A 字符集转出的 byte[],必须用 A 字符集再构造 String,否则轻则乱码,重则丢失数据(如某些字节序列在目标编码中非法,被替换为 \uFFFD)。

典型翻车点:
读取文件时用了 Files.readAllBytes(path) 得到原始字节,然后直接 new String(bytes) —— 这里没指定编码,就又掉进默认编码陷阱;或者 HTTP 响应头声明 Content-Type: text/plain; charset=GBK,你却用 UTF_8 解码。

  • 解码前务必确认来源明确的字符集,优先从协议头、BOM、配置项或约定中获取
  • 不要依赖 String 构造函数的无参版本:new String(bytes) 是危险操作
  • 如果只有字节没有上下文,可尝试 CharsetDecoder 配合 onMalformedInput(CodingErrorAction.REPORT) 主动检测异常

Netty/OkHttp/Spring Web 等框架内部怎么处理的

这些框架多数会在关键路径强制指定字符集:比如 OkHttp 的 RequestBody.create() 要求传 MediaType(含 charset),Spring 的 @RequestBody 默认走 UTF-8,Netty 的 HttpContent 解析也会检查 Content-Type 头。但它们不会替你修复业务层手动调用 String.getBytes() 的错误。

也就是说:框架帮你拦住了部分问题,但一旦你绕过封装、直操作字节,责任就回到你手上。

  • Spring MVC 中,@RequestBody 对象反序列化用的是 Jackson,默认 UTF-8;但如果你在 @Controller 里手动读 request.getInputStream(),就得自己处理字符集
  • Netty 中 FullHttpRequest.content().array() 返回原始字节,toString(Charset) 方法才是安全解码入口
  • 日志打印 byte[] 时别直接 Arrays.toString(bytes),容易误判内容——先确认编码再转成字符串看

字符集不是个“选填项”,是字节与文本之间那条不可省略的翻译契约。少写一个 StandardCharsets.UTF_8,就可能让两个服务之间持续数月的偶发乱码问题查不出根源。

热门AI工具

更多
Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2373

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

1439

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

855

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3332

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

5688

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

1239

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

5951

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

5182

2023.08.14

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

100

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn