java编码(ISO-889-1、UTF-8、GBK、Unicode)

java编码

java内部使用Unicode编码处理;iso-8859-1是JAVA网络传输使用的标准字符集

ACSII编码对应表

在这里插入图片描述

常用编码

1、ISO-8859-1

	属于单字节编码,最多能表示的字符范围0-255;应用于英文系列;无法标识中文

2、GB2312/GBK

	汉字的国际码,专门用来表示汉字,是双字节编码;英文字母和ISO-8859-1一致(兼容ISO-8859-1编码);GBK是不定长编码
	GBK能同同时表示繁体字和简体字
	GB2312只能表示简体字;GBK兼容GB2312编码

3、Unicode

	最统一编码,可以表示所有语言的字符;是定长双字节编码(定长编码便于计算机处理);不兼容任何编码;对应英文是在ISO-8859-1之前加一个0字节

4、UTF-8

	由于Unicode不兼容ISO-8859-1,而且容易占用更多空间,不便于传输和存储,因此产生了UTF-8编码;UTF-8兼容ISO-8859-1同时可以表示所有语言字符;英文1个字节表示,汉字3个字节表示;UTF-8是不定长编码	

    注意:UTF-8节省空间是相对Unicode来说的;如果已知是汉字,使用GBK是最节省

几种编码关系

如:a中
Unicode:61 4e2d
GBK:61 d6d0
UTF-8:61 e4b8ad
汉字没有ISO-8859-1编码,可以用iso8859-1编码来表示

java字符串处理

getBytes(charset) 将字符串所表示的字符按照设置charset编码以字节形式表示

private static void codeArray(String str) throws Exception{
        System.out.println("IDE设置默认编码:"+Arrays.toString(str.getBytes()));
        System.out.println("ISO-8859-1:"+Arrays.toString(str.getBytes("ISO-8859-1")));
        System.out.println("GBK:"+Arrays.toString(str.getBytes("GBK")));
        System.out.println("GB2312:"+Arrays.toString(str.getBytes("GB2312")));
        System.out.println("UTF-8:"+Arrays.toString(str.getBytes("UTF-8")));
    }

在这里插入图片描述

new String(byte[],charset) 将字节数组按照设置charset编码识别,最后转换为Unicode存储

private static void codeConvert(String str) throws Exception{
		System.out.println("IDE默认编码:"+System.getProperties().getProperty("file.encoding"));
        System.out.println("Unicode与IDE默认编码转换:"+new String(str.getBytes()));
        System.out.println("Unicode与GBK转换:"+new String(str.getBytes("GBK"),"GBK"));
        System.out.println("Unicode与GB2312转换:"+new String(str.getBytes("GB2312"),"GB2312"));
        System.out.println("Unicode与UTF-8转换:"+new String(str.getBytes("UTF-8"),"UTF-8"));
        System.out.println("Unicode与ISO-8859-1转换:"+new String(str.getBytes("ISO-8859-1"),"ISO-8859-1"));
    }

在这里插入图片描述

GBK、UTF-8、ISO-8859-1转换

private static void codeIsoConvert(String str) throws Exception{
        String gbk2iso = new String(str.getBytes("GBK"),"ISO-8859-1");
        System.out.println("GBK编码ISO-8859-1解码,再反过来操作:"+new String(gbk2iso.getBytes("ISO-8859-1"),"GBK"));

        String utf2iso = new String(str.getBytes("UTF-8"),"ISO-8859-1");
        System.out.println("UTF-8编码ISO-8859-1解码,再反过来操作:"+new String(utf2iso.getBytes("ISO-8859-1"),"UTF-8"));
    }

    private static void codeUtf2GbkConvert(String str) throws Exception{
        String utf2gbk = new String(str.getBytes("UTF-8"),"GBK");
        System.out.println("UTF-8编码GBK解码,再反过来操作:"+new String(utf2gbk.getBytes("GBK"),"UTF-8"));
    }

    private static void codeGbk2UtfConvert(String str) throws Exception{
        String gbk2utf = new String(str.getBytes("GBK"),"UTF-8");
        System.out.println("GBK编码UTF-8解码,再反过来操作:"+new String(gbk2utf.getBytes("UTF-8"),"GBK"));
    }

在这里插入图片描述

结论:
* utf-8、gbk编码可以用iso8859-1解码后编回去
* gbk与utf-8不可以

字符串内存Unicode16进制值

private static void codeHexValue(String str) throws Exception{
        for(int i=0;i<str.length();i++){
            System.out.println("字符串:"+str+" 第"+i+"个字符,Unicode值:"+Integer.toHexString(str.charAt(i)));
        }
        byte[] gbkArray = str.getBytes("GBK");
        for(int i=0;i<gbkArray.length;i++){
            System.out.println("字符串:"+str+" 转换GBK编码字节数组,第"+i+"个字节,GBK值:"+Integer.toHexString(gbkArray[i]));
        }
        byte[] utf8Array = str.getBytes("UTF-8");
        for(int i=0;i<utf8Array.length;i++){
            System.out.println("字符串:"+str+" 转换UTF-8编码字节数组,第"+i+"个字节,UTF-8值:"+Integer.toHexString(utf8Array[i]));
        }
        byte[] isoArray = str.getBytes("ISO-8859-1");
        for(int i=0;i<isoArray.length;i++){
            System.out.println("字符串:"+str+" 转换ISO-8859-1编码字节数组,第"+i+"个字节,ISO-8859-1值:"+Integer.toHexString(isoArray[i]));
        }
    }

在这里插入图片描述

web乱码问题

浏览器发送文字编码是和页面编码一直的(一般默认为UTF-8)
tomcat接收请求没有设置的情况下,默认使用ISO-8859-1

get乱码

  • 手动转换编码:String key = new String(request.getParameter(“key”).getBytes(“ISO-8859-1”), “UTF-8”);
  • 设置tomcat编码server.xml:
  • 前端对中文参数encode处理,服务端decode处理;如下
    前端:encodeURI(encodeURI(“中文”));
    后端:URLDecoder.decode(request.getParameter(“key”), “UTF-8”)

注意:前端需要两次encode;容器会默认解码一次,容器解码采用的是容器默认编码,可能是UTF-8,GBK等,若与应用使用编码不一致直接获取会存在乱码,所以使用两次encode

post乱码

	设置setCharacterEncoding() 需要在第一个getParameter之前设置,因为在执行第一个getParameter会按照设置编码分析内容,后续不在分析

其他相关

	指定jsp文件存储编码<%@ page contentType="text/html; charset=UTF-8" %>

参考
https://www.cnblogs.com/haimishasha/p/6117968.html
https://blog.csdn.net/u012564085/article/details/80003283

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RestTemplate是一个用于发送HTTP请求的Java库,可以用于上传和下载文件等功能。在使用RestTemplate时,有时会遇到返回的中文乱码问题。解决这个问题的方法是将返回的字符串按照ISO_8859_1编码转换为UTF-8编码。具体的代码示例如下: ```java RequestEntity<String> gh = RequestEntity.post(new URI("")).header("GH", "").body(""); ResponseEntity<String> exchange = restTemplate.exchange(gh, String.class); String body = exchange.getBody(); String s = new String(body.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8); ``` 以上代码中,`body.getBytes(StandardCharsets.ISO_8859_1)`将返回的字符串按照ISO_8859_1编码转换为字节数组,然后使用`new String()`方法将字节数组按照UTF-8编码转换为字符串。这样就可以解决返回的中文乱码问题。\[1\]\[2\] 另外,在实际开发中,如果需要通过RestTemplate调用其他服务进行文件上传,可以通过配置RestTemplate来实现功能。可以使用JavaConfig的方式进行配置,如下所示: ```java @Configuration public class RestTemplateConfig { @Bean public RestTemplate restTemplate(@Qualifier("simpleClientHttpRequestFactory") ClientHttpRequestFactory factory){ return new RestTemplate(factory); } @Bean public ClientHttpRequestFactory simpleClientHttpRequestFactory(){ SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); factory.setConnectTimeout(15000); // 设置连接超时时间,单位为毫秒 factory.setReadTimeout(5000); // 设置获取数据超时时间,单位为毫秒 return factory; } } ``` 以上代码中,通过`@Configuration`注解标注的配置类,将RestTemplate和ClientHttpRequestFactory注册到Spring容器中。可以通过`restTemplate`方法获取RestTemplate实例,通过`simpleClientHttpRequestFactory`方法获取ClientHttpRequestFactory实例。可以根据实际需求进行配置。\[3\] 综上所述,使用RestTemplate时可以通过编码转换解决返回的中文乱码问题,并且可以通过配置RestTemplate实现文件上传等功能。 #### 引用[.reference_title] - *1* *2* [restTemplate返回字符乱码问题](https://blog.csdn.net/haohaounique/article/details/116034779)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [RestTemplate-文件上传下载](https://blog.csdn.net/zouliping123456/article/details/117338378)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值