001. Java内存中的字符编码
Java内存中的字符编码
Unicode字符集及utf-8 、utf-16、utf-32 等字符编码方式
字符集:字符表示的数字集合,元素称为码点或码位;
字符编码:字符实际的储存表示;
码点:一个码点对应 一个字符;
utf-8编码:可变长编码,一个字符编码使用 1或2或3或4个字节表示; https://blog.csdn.net/hezh1994/article/details/78899683
utf-32编码:定长编码,一个字符编码使用4个字节
utf-16编码:结合可变长编码及定长编码,BMP平面字符编码2个字节,SMP平面字符比编码使用4字节;
Java内存中字符(char变量或String(char[]))以utf-16BE编码存在
String str = new String(Character.toChars(0x1D56B)); // 一个字符
字符从内存输出,如何显示在屏幕 ?
//System.out.println(strings);
System.out.print() 将内存中的字符串(char[])按utf-16解码为unicode码点,再以系统编码方式(如utf-8,将码点编码)输出字节流,
控制台收到的字节流,以相同的方式(utf-8)解码为unicode码点
系统将码点以图形的形式显示
测试代码
(1)SMP平面字符
String str = new String(Character.toChars(0x1D56B)); //UTF-16 representation stored ,所以这个unicode扩展字符保存在内存的需要 2个char
System.out.println("码点: "+Integer.toHexString(str.codePointAt(0)));
System.out.println("utf-8编码的内存形式: 字节数量 "+str.getBytes().length); //4
System.out.println("utf-8编码的内存形式: 字节序列 "+Arrays.toString(str.getBytes())); //IDE设置使用 utf-8
System.out.println("utf-16编码的内存形式: 双字节(码元)数量 "+str.toCharArray().length); //2
System.out.println("utf-16编码的内存形式: 双字节(码元)序列 "+"["+Integer.toHexString((int)str.charAt(0))+","+Integer.toHexString((int)str.charAt(1))+"]");
//System.out.println(str.toCharArray()); //显示为特殊字符
System.out.println("字符串长度(码元): "+str.length()); //2 java统计字符串长度实际是计算char[]数组长度(码元总数),而不是字符(码点)个数
System.out.println("字符串字符(码点)个数: "+str.codePointCount(0,str.length())); //1
输出结果:
码点: 1d56b
utf-8编码的内存形式: 字节数量 4
utf-8编码的内存形式: 字节序列 [-16, -99, -107, -85]
utf-16编码的内存形式: 双字节(码元)数量 2
utf-16编码的内存形式: 双字节(码元)序列 [d835,dd6b]
字符串长度(码元): 2
字符串字符(码点)个数: 1
(2)BMP平面字符
String s = new String(Character.toChars(0x4f60));
System.out.println("码点: "+Integer.toHexString(s.codePointAt(0)));
System.out.println("utf-8编码的内存形式: 字节数量 "+s.getBytes().length); //3
System.out.println("utf-8编码的内存形式: 字节序列 "+Arrays.toString(s.getBytes())); //IDE设置使用 utf-8
System.out.println("utf-16编码的内存形式: 双字节(码元)数量 "+s.toCharArray().length); //1
System.out.println("utf-16编码的内存形式: 双字节(码元)序列 "+"["+Integer.toHexString((int)s.charAt(0))+"]");
System.out.println("字符串长度(码元): "+s.length()); //1 java统计字符串长度实际是计算char[]数组长度(码元总数),而不是字符(码点)个数
System.out.println("字符串字符(码点)个数: "+s.codePointCount(0,s.length())); //1
输出结果:
码点: 4f60
utf-8编码的内存形式: 字节数量 3
utf-8编码的内存形式: 字节序列 [-28, -67, -96]
utf-16编码的内存形式: 双字节(码元)数量 1
utf-16编码的内存形式: 双字节(码元)序列 [4f60]
字符串长度(码元): 1
字符串字符(码点)个数: 1
001. Java内存中的字符编码的更多相关文章
- javaEE中的字符编码问题
0 web.xml中注册的CharacterEncodingFilter <!-- 配置字符集过滤器 --> <filter> <filter-name>encod ...
- java中的字符编码方式
1. 问题由来 面试的时候被问到了各种编码方式的区别,结果一脸懵逼,这个地方集中学习一下. 2. 几种字符编码的方式 1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符 ...
- Java基础-二进制以及字符编码简介
Java基础-二进制以及字符编码简介 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 想必计算机毕业的小伙伴或是从事IT的技术人员都知道数据存储都是以二进制的数字存储到硬盘的.从事开 ...
- 浅析白盒审计中的字符编码及SQL注入
尽管现在呼吁所有的程序都使用unicode编码,所有的网站都使用utf-8编码,来一个统一的国际规范.但仍然有很多,包括国内及国外(特别是非英语国家)的一些cms,仍然使用着自己国家的一套编码,比如g ...
- APACHE2.4 指定目录中的字符编码
APACHE2.4 指定目录中的字符编码 xampp 的 apache2.4 默认字符编码是西文,中文字符显示乱码,在 httpd.conf 没有 AddDefaultCharset utf-8 这样 ...
- 面试题:java内存中的堆区和数据结构中的堆有什么区别
java内存中的堆是一个 链表, 数据结构中的堆:就是一个栈
- SpringBoot(八):SpringBoot中配置字符编码 Springboot中文乱码处理
SpringBoot中配置字符编码一共有两种方式 方式一: 使用传统的Spring提供的字符编码过滤器(和第二种比较,此方式复杂,由于时间原因这里先不介绍了,后续补上) 方式二(推荐使用) 在appl ...
- java中处理字符编码(网页与数据库)(转)
首先声明一下,此文章时从网上转载的.如下的某些方法是确实管用,但是从中发现了有一点不足,就是原文笔者没考虑使用不同Web Server时出现的情况,比如文章里我用红色字体画出来的部分代码在Tomcat ...
- Java 语言中一个字符占几个字节?
Java中理论说是一个字符(汉字 字母)占用两个字节. 但是在UTF-8的时候 new String("字").getBytes().length 返回的是3 表示3个字节 作者: ...
随机推荐
- Windows核心编程第二章,字符串的表示以及宽窄字符的转换
目录 Windows核心编程,字符串的表示以及宽窄字符的转换 1.字符集 1.1.双字节字符集DBCS 1.2 Unicode字符集 1.3 UTF-8编码 1.4 UTF - 32编码. 1.5 U ...
- DRUID连接池配置详情
DRUID介绍 DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0.DBCP.PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针 ...
- 设计模式 | 模板方法模式(template method)
定义: 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 结构:(书中图,侵删) 一个定义整体框架的父类 若干不同具体实现 ...
- 全球排名第一的开源ERP Odoo v12 最新一键安装体验版正式发布
引言 Odoo 12.0是目前全球Odoo社区最新推出的产品版本代号,该产品具有划时代的意义,增加了如互联网级的知识库网盘功能.工业互联网的IOT设备矩阵管控功能,全新的Python Sass前端引擎 ...
- C++11新特性之tie、tuple的应用
//tuplestd::tuple<int, int, int, int, QString> Thorface::getUserInfoToJudgeOpendoor(QString st ...
- 【死磕 Spring】----- IOC 之深入理解 Spring IoC
在一开始学习 Spring 的时候,我们就接触 IoC 了,作为 Spring 第一个最核心的概念,我们在解读它源码之前一定需要对其有深入的认识,本篇为[死磕 Spring]系列博客的第一篇博文,主要 ...
- Snipaste多截屏工具软件
Snipaste是一个简单的截图小工具,可以支持同时截取多张图片,添加标注等等,操作简单方便,解压即用 百度网盘链接: https://pan.baidu.com/s/1YC75DRoLzdeyli1 ...
- 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 二十五║初探SSR服务端渲染(个人博客二)
缘起 时间真快,现在已经是这个系列教程的下半部 Vue 第 12 篇了,昨天我也简单思考了下,可能明天再来一篇,Vue 就基本告一段落了,因为什么呢,这里给大家说个题外话,当时写博文的时候,只是想给大 ...
- 7.Flask文件上传
1.1.上传文件和访问上传的文件 upload_file_demo.py from flask import Flask,request,render_template import os from ...
- Spring Cloud实战的代码和视频位置
大家好,本博文的连接里包含了Spring Cloud实战的代码和视频位置. 代码下载连接: 视频下载连接: