当前位置: 首页 > news >正文

Java String.getBytes()编码

在Java中,String的getBytes()方法是得到一个操作系统默认的编码格式的字节数组。这个表示在不通OS下,返回的东西不一样!


String.getBytes(String decode)方法会根据指定的decode编码返回某字符串在该编码下的byte数组表示,如

byte[] b_gbk = "中".getBytes("GBK");
byte[] b_utf8 = "中".getBytes("UTF-8");
byte[] b_iso88591 = "中".getBytes("ISO8859-1");


将分别返回“中”这个汉字在GBK、UTF-8和ISO8859-1编码下的byte数组表示,此时b_gbk的长度为2,b_utf8的长度为3,b_iso88591的长度为1。

而与getBytes相对的,可以通过new String(byte[], decode)的方式来还原这个“中”字时,这个new String(byte[], decode)实际是使用decode指定的编码来将byte[]解析成字符串。

String s_gbk = new String(b_gbk,"GBK");
String s_utf8 = new String(b_utf8,"UTF-8");
String s_iso88591 = new String(b_iso88591,"ISO8859-1");

通过打印s_gbk、s_utf8和s_iso88591,会发现,s_gbk和s_utf8都是“中”,而只有s_iso88591是一个不认识的字符,为什么使用ISO8859-1编码再组合之后,无法还原“中”字呢,其实原因很简单,因为ISO8859-1编码的编码表中,根本就没有包含汉字字符,当然也就无法通过"中".getBytes("ISO8859-1");来得到正确的“中”字在ISO8859-1中的编码值了,所以再通过new String()来还原就无从谈起了。

因此,通过String.getBytes(String decode)方法来得到byte[]时,一定要确定decode的编码表中确实存在String表示的码值,这样得到的byte[]数组才能正确被还原。

有时候,为了让中文字符适应某些特殊要求(如http header头要求其内容必须为iso8859-1编码),可能会通过将中文字符按照字节方式来编码的情况,如

String s_iso88591 = new String("中".getBytes("UTF-8"),"ISO8859-1"),

这样得到的s_iso8859-1字符串实际是三个在 ISO8859-1中的字符,在将这些字符传递到目的地后,

目的地程序再通过相反的方式String s_utf8 = new String(s_iso88591.getBytes("ISO8859-1"),"UTF-8")来得到正确的中文汉字“中”。这样就既保证了遵守协议规定、也支持中文。

转自:http://jiapumin.iteye.com/blog/1006144

转载于:https://www.cnblogs.com/wlliac/p/9981847.html

相关文章:

  • smm架构的优势
  • 不学无数——SpringBoot入门Ⅲ
  • 比特币的暴跌史
  • 微信小程序直播,腾讯云直播+微信小程序实现实时直播
  • POI导出数据以Excel的方式录入,下载
  • 如何实现MetaMask签名授权后DAPP一键登录功能?
  • 双十一流量洪峰 支撑阿里核心业务的云数据库揭秘
  • python编程入门----测试与类编写
  • 项目(八) Jenkins持续集成与构建
  • Dashboard安装配置
  • vue中的slot
  • String和StringBuilder、StringBuffer的区别?
  • 关于Numba开源库(Python语法代码加速处理,看过一个例子,速度可提高6倍)
  • Aibee完成A轮6000万美元融资 宣布前阿里达摩院朱胜火加盟
  • re:Invent 大会第一天,看看AWS有哪些最新进展?\n
  • [笔记] php常见简单功能及函数
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • flask接收请求并推入栈
  • java 多线程基础, 我觉得还是有必要看看的
  • MobX
  • PAT A1050
  • python 装饰器(一)
  • Swoft 源码剖析 - 代码自动更新机制
  • 工作中总结前端开发流程--vue项目
  • 聊聊flink的TableFactory
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 深度学习中的信息论知识详解
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 算法---两个栈实现一个队列
  • 我的业余项目总结
  • 消息队列系列二(IOT中消息队列的应用)
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • FaaS 的简单实践
  • ​力扣解法汇总946-验证栈序列
  • (C#)一个最简单的链表类
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .equals()到底是什么意思?
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .NET开发不可不知、不可不用的辅助类(一)
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .NET命名规范和开发约定
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • @RequestMapping处理请求异常
  • @Resource和@Autowired的区别
  • [1181]linux两台服务器之间传输文件和文件夹
  • [acwing周赛复盘] 第 94 场周赛20230311
  • [Bzoj4722]由乃(线段树好题)(倍增处理模数小快速幂)
  • [C#][opencvsharp]opencvsharp sift和surf特征点匹配
  • [C#7] 1.Tuples(元组)
  • [hihocoder1395] 最大权闭合子图
  • [Hive] INSERT OVERWRITE DIRECTORY要注意的问题
  • [LeetCode] 148. Sort List 链表排序
  • [Linux] 一文理解HTTPS协议:什么是HTTPS协议、HTTPS协议如何加密数据、什么是CA证书(数字证书)...