首页 > 编程语言 >【java技术总结】将中文通过ISO-8859-1方式编码传输

【java技术总结】将中文通过ISO-8859-1方式编码传输

时间:2022-11-21 01:22:37浏览次数:50  
标签:编码 java String unicode 8859 ISO ISO8859 byte getBytes

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

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

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

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

而与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");   
String s_unicode = new String(b_unicode, "unicode");  

通过打印s_gbk、s_utf8、s_iso88591和unicode,会发现,s_gbk、s_utf8和unicode都是“深”而只有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”)

来得到正确的中文汉字“深”。这样就既保证了遵守协议规定、也支持中文。

同样,在开发会检查字符长度,以免数据库字段的长度不够而报错,考虑到中英文的差异,肯定不能用String.length()方法判断,而需采用String.getBytes().length;而本方法将返回该操作系统默认的编码格式的字节数组。如字符串“Hello!你好!”,在一个中文WindowsXP系统下,结果为12,而在英文的UNIX环境下,结果将为9。因为该方法和平台(编码)相关的。在中文操作系统中,getBytes方法返回的是一个GBK或者GB2312的中文编码的字节数组,其中中文字符,各占两个字节,而在英文平台中,一般的默认编码是"ISO-8859-1",每个字符都只取一个字节(而不管是否非拉丁字符)。所以在这种情况下,应该给其传入字符编码字符串,即String.getBytes(“GBK”).length。

标签:编码,java,String,unicode,8859,ISO,ISO8859,byte,getBytes
From: https://www.cnblogs.com/blanset/p/16910177.html

相关文章

  • 在java中new一个对象的流程是什么?
    Dogdog=newDog()背后执行过程这个涉及到字节码文件结构,类加载机制,堆,栈的认识等知识点。在执行new的时候可以大致分为二个过程,初始化以及实例化,初始化就是类的加载过程,......
  • Java高手请进:关于接口的问题。
    《鲁提辖剃度》和尚要做什么呢,要吃斋(chiZai())、念经(nianJing())、打坐(daZuo())、撞钟(zhuangZhong())、习武(xiWu())等。如果设计一个和尚(Monk)接口,给出所有和尚都需要实现的方法,那么这个接......
  • Java中使用javassist库动态操作类
    它是一个用来处理Java字节码的类库,也就是说没有.java文件,用它可以直接造一个.class文件。直接创建一个class类例如:importjavassist.*;/***使用javassist库*/......
  • 新手随笔java+cpp
    随便写写关于java和cpp感悟·1.初学java(在学ing),学了几个月cpp(也不算熟练,但是目前比java好点)·2.java应该是更灵活的,比如【一些灵活点和区别】,二维数组不是非要矩阵形......
  • javascript - 练习题:事件练习 - 贪吃蛇
    贪吃蛇原生JS(非面向对象的方式),渡一教学的笔记;地图坐标{0,0}{1,0}{2,0}{3,0}{4,0}{0,1}{1,1}{2,1}{3,1}{4,1}{0,2}{1,2}{2,2}{3,2}{4,2}{0,3}{1,3}{2,3}{3,3}{4,3}{0,4}{1,4}......
  • java-网络编程
    一、概述1、两个主要问题(1)如何准确定位网络上一台或多台主机;定位主机上的特定应用(2)找到主机后如何可靠高效的进行数据传输2、两个要素(1)IP和端口号(2)网络通信协议(OSI参......
  • Wust Java Club 2022-2023上半学年中期考核
    WustJavaClub2022-2023上半学年中期考核前言提交时的注意事项不可写入包名,如packageedu.wust必须有且只能有一个公有类publicclassMain,若有其他类,不应给其赋为......
  • JAVA 代码优化
    1基本类型使用优化1.1尽量重用对象特别是对于String对象的使用,如需拼接字符串,使用如下例子://拼接字符串,不重视效率的写法Stringstr1="aaa";str1=str1+"bbb"......
  • Java_JDBC
    JDBC一、JDBC简介1、概念:​ JDBC就是使用Java语言操作关系型数据库的一套API​ 全称:(JavaDataBaseConnectivity)Java数据库连接2、本质:为了使得Java代码可以......
  • C语言标准ISO9899的各个版本
    C90ISO/IEC9899:1990219PagesISO/IEC9899:1990/AMD1:199551PagesISO/IEC9899:1990/COR1:19948PagesISO/IEC9899:1990/COR2:19961PagesC99ISO/IEC9899:......