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编码存在

 
utf-16 BMP平面(代理区U+0000至U+FFFF除外)的码点,以1个码元(16比特即2字节)编码;SMP平面的码点以2个码元(32比特)编码
因此Java内存中char类型变量只能表示BMP平面的一个字符,表示SMP平面的字符使用String对象。 

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内存中的字符编码的更多相关文章

  1. javaEE中的字符编码问题

    0 web.xml中注册的CharacterEncodingFilter <!-- 配置字符集过滤器 --> <filter> <filter-name>encod ...

  2. java中的字符编码方式

    1. 问题由来 面试的时候被问到了各种编码方式的区别,结果一脸懵逼,这个地方集中学习一下. 2. 几种字符编码的方式 1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符 ...

  3. Java基础-二进制以及字符编码简介

    Java基础-二进制以及字符编码简介 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 想必计算机毕业的小伙伴或是从事IT的技术人员都知道数据存储都是以二进制的数字存储到硬盘的.从事开 ...

  4. 浅析白盒审计中的字符编码及SQL注入

    尽管现在呼吁所有的程序都使用unicode编码,所有的网站都使用utf-8编码,来一个统一的国际规范.但仍然有很多,包括国内及国外(特别是非英语国家)的一些cms,仍然使用着自己国家的一套编码,比如g ...

  5. APACHE2.4 指定目录中的字符编码

    APACHE2.4 指定目录中的字符编码 xampp 的 apache2.4 默认字符编码是西文,中文字符显示乱码,在 httpd.conf 没有 AddDefaultCharset utf-8 这样 ...

  6. 面试题:java内存中的堆区和数据结构中的堆有什么区别

    java内存中的堆是一个  链表, 数据结构中的堆:就是一个栈

  7. SpringBoot(八):SpringBoot中配置字符编码 Springboot中文乱码处理

    SpringBoot中配置字符编码一共有两种方式 方式一: 使用传统的Spring提供的字符编码过滤器(和第二种比较,此方式复杂,由于时间原因这里先不介绍了,后续补上) 方式二(推荐使用) 在appl ...

  8. java中处理字符编码(网页与数据库)(转)

    首先声明一下,此文章时从网上转载的.如下的某些方法是确实管用,但是从中发现了有一点不足,就是原文笔者没考虑使用不同Web Server时出现的情况,比如文章里我用红色字体画出来的部分代码在Tomcat ...

  9. Java 语言中一个字符占几个字节?

    Java中理论说是一个字符(汉字 字母)占用两个字节. 但是在UTF-8的时候 new String("字").getBytes().length 返回的是3 表示3个字节 作者: ...

随机推荐

  1. RabbitMQ和Kafka到底怎么选(二)?

    前言 前一篇文章<RabbitMQ和Kafka到底怎么选?>,我们在吞吐量方面比较了Kafka和RabbitMQ,知道了Kafka的吞吐量要高于RabbitMQ.本文从可靠性方面继续探讨两 ...

  2. 从壹开始前后端分离【 .NETCore2.1 +Vue 2 +AOP+DI】框架之一 || 前言

    缘起 作为一个.Net攻城狮已经4年有余了,一直不温不火,正好近来项目不是很忙,闲得无聊,搞一搞新技术,一方面是打发无聊的时间,一方面也是督促自己该学习辣!身边的大神都转行的转行,加薪的加薪,本人比较 ...

  3. 10 年三线小城 IT 开发的感悟

    一贯都是写技术博客,从来没写过感悟类文章,因为文笔不好.今天看到了大飞的一篇文章,<技术人,请不要封闭自己>,真的感触太深了. 一 先说说我自己,我并非科班出身,大学毕业后一直没找到好的工 ...

  4. Android 项目中用得最多最火的第三方框架可能都在这里了

    分类 二级分类 框架名称 简介 Star 数 最近更新 UI 刷新 SmartRefreshLayout 智能下拉刷新框架 14k 18天 UI 刷新 Android-PullToRefresh 比较 ...

  5. emacs 高亮

    用途:让某个单词高亮显示 1,安装 m-x 回车,输入list-packages 在列表中找到highlight-symbol后,鼠标点击它,再点击安装 2,在.emacs中配置 ;;高亮 (requ ...

  6. getopt与getopt_long

    如何通过命令行,为程序传入参数,可以使用函数getopt与getopt_long. 函数的声明如下: #include <unistd.h> int getopt(int argc, ch ...

  7. Windows下建立FTP服务器站点

    环境 操作系统版本:Win7旗舰版64位系统 1.安装FTP组件 打开或关闭Windows功能,打开过程可能会比较慢,大概3.4分钟: 安装FTP组件.勾选Internet信息服务下的FTP服务器.F ...

  8. 最简单的Nginx讲解--HTTP服务器、正向代理、反向代理、负载均衡

    1. Nginx 1.1 Nginx简介 Nginx是俄罗斯人开发,开源的,免费的. Nginx功能: 1) nginx作为http服务器:类似apache,tomcat,遵循http协议. a) 访 ...

  9. vi/vim 添加或删除多行注释

    进入vi/vim编辑器,按CTRL+V进入可视化模式(VISUAL BLOCK)    移动光标上移或者下移,选中多行的开头,如下图所示   选择完毕后,按大写的的I键,此时下方会提示进入“inser ...

  10. 使用 docker-compose 快速安装Jenkins

    本文分享在 docker 环境中,使用 docker-compose.yml 快速安装 Jenkins,以及使用主机中的 docker 打包推送镜像到阿里云 博客园的第100篇文章达成,2019的第一 ...