Java_字符编码(Unicode、UTF-8、UTF-16)

LINUX-DMA-子系统 目录 1. DMA子系统概述 1. DMA子系统概述 DMA 阅读详情

首先看一下下面的程序(测试英文和中文在Unicode、UTF-8、UTF-16这三种编码下,一个字符占几个字节)

[java]  view plain  copy
  1. System.out.println("a(Unicode)    :" + "a".getBytes("Unicode").length);  
  2. System.out.println("a(Unicode)    :" + "aa".getBytes("Unicode").length);  
  3. System.out.println("啊(Unicode)   :" + "啊".getBytes("Unicode").length);  
  4. System.out.println("啊啊(Unicode) :" + "啊啊".getBytes("Unicode").length);  
  5. System.out.println("");  
  6. System.out.println("a(UTF-8)    :" + "a".getBytes("UTF-8").length);  
  7. System.out.println("aa(UTF-8)   :" + "aa".getBytes("UTF-8").length);  
  8. System.out.println("啊(UTF-8)   :" + "啊".getBytes("UTF-8").length);  
  9. System.out.println("啊啊(UTF-8) :" + "啊啊".getBytes("UTF-8").length);  
  10. System.out.println("");  
  11. System.out.println("a(UTF-16)    :" + "a".getBytes("UTF-16").length);  
  12. System.out.println("aa(UTF-16)   :" + "aa".getBytes("UTF-16").length);  
  13. System.out.println("啊(UTF-16)   :" + "啊".getBytes("UTF-16").length);  
  14. System.out.println("啊啊(UTF-16) :" + "啊啊".getBytes("UTF-16").length);  

运行结果如下:

a(Unicode)      :4
a(Unicode)      :6
啊(Unicode)     :4
啊啊(Unicode) :6

a(UTF-8)      :1
aa(UTF-8)    :2
啊(UTF-8)     :3
啊啊(UTF-8) :6

a(UTF-16)      :4
aa(UTF-16)    :6
啊(UTF-16)     :4
啊啊(UTF-16) :6


可以看到UTF-8的情况:一个英文字符占一个字节,一个汉字占三个字节

但是Unicode和UTF-16的情况比较奇怪,不管是英文还是汉字,看不出占几个字节。其实正确的答案是:Unicode和UTF-16的编码下,不管是英文字符还是汉字字符,都占两个字节(至于上面结果中多出来的两个字节是用来表示字节顺序的默认字节)。至于为什么,继续往下看。


Unicode规范中推荐的标记字节顺序的方法是BOM。BOM不是“Bill Of Material”的BOM表,而是Byte Order Mark。

(Unicode是一种字符编码方法,不过它是由国际组织设计,可以容纳全世界所有语言文字的编码方案。Unicode的学名是"Universal Multiple-Octet Coded Character Set",简称为UCS。UCS可以看作是"Unicode Character Set"的缩写。)

在UCS编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。

这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。

在 Java 中直接使用Unicode 转码时会按照UTF-16LE 的方式拆分,并加上 BOM。 如果采用 UTF-16 拆分,在 Java 中默认采用带有 BOM 的 UTF-16BE 拆分。


再来看一个程序:

[java]  view plain  copy
  1. public class Test {  
  2.     private final static char[] HEX = "0123456789abcdef".toCharArray();  
  3.   
  4.     public static void main(String[] args) throws UnsupportedEncodingException {  
  5.          String str = "中国";  
  6.          String[] encoding = { "Unicode", "UnicodeBig", "UnicodeLittle", "UnicodeBigUnmarked",  
  7.          "UnicodeLittleUnmarked", "UTF-16", "UTF-16BE", "UTF-16LE" };  
  8.           
  9.          for (int i = 0; i < encoding.length; i++) {  
  10.          System.out  
  11.          .printf("%-22s %s%n", encoding[i], bytes2HexString(str.getBytes(encoding[i])));  
  12.          }  
  13.     }  
  14.   
  15.     public static String bytes2HexString(byte[] bys) {  
  16.         char[] chs = new char[bys.length * 2 + bys.length - 1];  
  17.         for (int i = 0, offset = 0; i < bys.length; i++) {  
  18.             if (i > 0) {  
  19.                 chs[offset++] = ' ';  
  20.             }  
  21.             chs[offset++] = HEX[bys[i] >> 4 & 0xf];  
  22.             chs[offset++] = HEX[bys[i] & 0xf];  
  23.         }  
  24.         return new String(chs);  
  25.     }  
  26. }  

运行结果如下:

Unicode                fe ff 4e 2d 56 fd
UnicodeBig             fe ff 4e 2d 56 fd
UnicodeLittle          ff fe 2d 4e fd 56
UnicodeBigUnmarked     4e 2d 56 fd
UnicodeLittleUnmarked  2d 4e fd 56
UTF-16                 fe ff 4e 2d 56 fd
UTF-16BE               4e 2d 56 fd
UTF-16LE               2d 4e fd 56


可以看到几个不同的Unicode和UTF-16编码的字节顺序是不同的,有的是fe ff,有的是ff fe,有的没有。


总上所述:

Unicode和UTF-16:1个字符占2个字节(不管是哪国语言)

UTF-8:1个英文字符占1个字节,一个汉字(包括日文和韩文等)占3个字节

Java中的char默认采用Unicode编码,所以Java中char占2个字节

另外,顺便提一个知识点:1个字节(byte)占8位(bit)

原文链接:http://blog.youkuaiyun.com/tianjf0514/article/details/7854624

Memory SystemsCache, DRAM, Disk翻译学习DRAM部分(二) DRAM 的发展史 阅读详情

相关推荐

软件项目成本控制实战:从COCOMO模型到挣值分析的5个关键步骤

本文详细介绍了软件项目成本控制的5个关键步骤,从COCOMO模型估算到挣值分析预警,帮助中小型团队精准管理预算。通过简化COCOMO II的有机模式、动态建立成本基准、轻量化挣值分析等方法,项目经理可以有效应对预算超支和进度延误问题,提升项目成功率。

weixin_30733003的博客 227

Java中的字符编码(Unicode、UTF-8、UTF-16)的那些事儿

首先看一下下面的程序(测试英文和中文在Unicode、UTF-8、UTF-16这三种编码下,一个字符占几个字节) System.out.println("a(Unicode) :" + "a".getBytes("Unicode").length); System.out.println("a(Unicode) :" + "aa".getBytes...

java开发指南博客 【转载】 589

极化码理论及算法研究6-SCL、CA-SCL及matlab仿真

极化码译码算法5——SCL/CA-SCL译码算法系列目录1、引言2、串行抵消列表(SCL)译码算法2.1、路径度量PM 系列目录 (如要找其他内容,欢迎访问我的主页寻找) #前言 #极化码概述 #极化码定义 #极化码编码 #极化码译码 #5G标准中极化码的编译码概述 #5G标准中极化码的编码 #5G标准中极化码的译码 #总结 1、引言 在上一节中,介绍了经典的SC译码算法的理论原理以及其matlab仿真代码,SC译码算法具有较低的译码复杂度,但是由于每个译码的比特信息都依赖于前面所有的比特信息的译码结果,得

1万+

编码转换 GBK UnicodeBigUnmarked GB18030 ASCII

  package com.zzc.aop; public class UnicodeTest { public static void main(String args[]) { UnicodeTest UT = new UnicodeTest(); UT.test1(); } public void test1() { String str = ...

zzc1684的博客 1768

VL53L1X vs VL53L0X:激光测距传感器选型指南与性能对比

本文深入对比了VL53L1X与VL53L0X两款激光测距传感器的核心差异。VL53L1X采用区域ToF原理,在抗环境光干扰、最大测距及多目标识别方面优势显著,尤其适合复杂光线与动态场景。文章结合机器人避障、无人机定高等实战场景,提供了清晰的选型决策树,帮助工程师根据测距需求、环境复杂度与系统成本做出最优选择。

weixin_29197699的博客 394

六自由度机械臂运动学分析及其轨迹规划

六自由度机械臂轨迹规划 通过对比三次多项式插值法与五次多项式插值法的效果,选取后者对机械臂进行轨迹规划,将运动学解导入Matlab Robotics Toolbox仿真,得到各关节角度、速度和加速度与时间关系曲线。 三次多项式插值法 三次多项式有4个待定系数,可同时对起始点和目标点的角度和角速度给出约束条件。 数学公式 MATLAB代码 五次多项式插值法 五次多项式有6个待定系数,可同时对起始点和...

两条眉毛 6万+

java 获取字符串unicode编码的三种方式

public static void main(String[] args) throws UnsupportedEncodingException { // 获取unicode码的几种方式 // 第一种 System.err.println("第一种-----toCodePoints"); String test = "a...

lovepeacee的博客 1万+

MCNP 减方差技巧(最全)

MCNP的减方差技巧,核心在于不显著增加计算时间的前提下,通过修改模拟过程来降低结果的统计误差。尤其适用于,这类问题中粒子很难到达探测器区域,直接模拟效率极低栅元重要性是常用的减方差技巧,该方法主要对计算模型的不同区域定义不同的重要性数值。当粒子从重要性低的区域废物重要性高的区域,产生更多粒子,增大统计量;当从重要性高的区域进入重要性低的区域,会进行,增快计算效率。n= 中子,N;光子,P;电子 Exi= 栅元i的重要性I=栅元总数项目IMP卡是必须的,除非使用了WWN卡如果粒子进入0。

chencheng1127的博客 926

字符串转Unicode额外2个字节的来源

论坛的讨论地址如下: http://topic.youkuaiyun.com/u/20081009/09/e899898c-591f-4985-ae88-5972475708fb.html 测试代码如下:    String s = "1";     byte[] arr = s.getBytes("UNICODE");     System.out.println(Arrays.to

zhch152的专栏 1449

YOLOv11改进 - 卷积Conv | SPD-Conv空间深度转换卷积优化空间信息编码,攻克小目标检测难题

本文介绍了一种名为SPD-Conv的新型CNN构建块及其在YOLOv11中的结合。传统CNN在处理低分辨率图像或小物体时,因使用步长卷积和池化层导致细粒度信息丢失、性能下降。SPD-Conv由空间到深度(SPD)层和非步长卷积(Conv)层组成,完全消除卷积步长和池化层,避免信息损失。SPD层重排特征图元素将空间信息转换到深度维度,非步长卷积层进一步处理特征图。我们将SPD-Conv集成进YOLOv11,实验证明其在低分辨率图像和小物体检测任务上显著优于现有模型。

魔改工程师的博客 1141

华为OD 面试手撕代码真题【判断链表是否有环】

华为OD 面试手撕代码真题【判断链表是否有环】

MISAYAONE的博客 7236

Java 中 char 和 Unicode、UTF-8、UTF-16、ASCII、GBK 的关系

关于这几种字符编码的关系,经过各种资料研究,总结如下图(请右键在新标签页打开查看或者下载后使用看图工具放大查看):1[0-127]A1-F7A1-A9XX7F4~6HEX由于只规定了表示符号的二进制代码,却没有规定如何存储这个二进制代码。所以如何存储有不同的实现。而就是针对的不同存储方式的具体实现。0-1271282340000~FFFF注意:很多资料和文章中将 UTF-8 和 UTF-16 都称为定长编码,但实际上它们是可变长编码的,例如一个中文汉字用 UTF-8 表示的话,就需要 3 个字节。

川峰的博客 2670

【大模型+知识图谱】大模型与知识图谱融合:技术演进、实践应用与未来挑战

大模型与知识图谱的融合不是简单拼接,而是认知智能的范式重构。当符号主义的精确性与连接主义的泛化能力深度交织,我们正站在通向可信AGI的关键路口。正如OpenKG技术委员会王昊奋教授所言:“2025年将是图模协同从技术探索走向规模落地的分水岭”。参考文献OpenKG 2024年度报告(同济大学王昊奋)大型语言模型与知识图谱协同研究综述(海豚实验室,2024)知识图谱与大模型结合方法概述(黄巍,2023)图模互补:知识图谱与大模型融合综述(优快云,2024)

知识靠谱的博客 1092

Java中一个汉字究竟占几个字节?

因为当时各个国家都像中国这样搞出一套自己的编码标准,结果互相之间谁也不懂谁的编码,谁也不支持别人的编码,连大陆和台湾这样只相隔了150海里,使用着同一种语言的兄弟地区,也分别采用了不同的 DBCS 编码方案——当时的中国人想让电脑显示汉字,就必须装上一个"汉字系统",专门用来处理汉字的显示、输入的问题,但是那个台湾的愚昧封建人士写的算命程序就必须加装另一套支持 BIG5 编码的什么"倚天汉字系统"才可以用,装错了字符系统,显示就会乱了套!但是,对于某些特殊的、不常用的字符,UTF-16会用四个字节来表示。

daydayup 2846

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

java字符编码总结

本文介绍了计算机字符集和字符编码的历史演进。以及java中使用utf-16作为编码的介绍

赶路人儿 7277

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

[转]编码字符集(Unicode、UCS)和字符集编码(UTF-8、UTF-16、UTF-32)以及surrogates、code point和code unit

今天看到一篇特别好的文章,转发一下。原链接:http://www.360doc.com/content/12/0420/13/9470897_205152817.shtml简单来说:Unicode和UCS都是编码字符集,而UTF-8、UTF-16、UTF-32指的是字符集编码,至于GB2312,GBK 指的既是编码字符集也是字符集编码。 所谓surrogates,是UTF-16在编码时采用的一种方案:补充字符使用两个char型变量来表示,这两个char型变量就组成了所谓的surrogate pair(在底层

treblez's blog 1188

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Java字符编码

基本概念 字符集 字符(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、 GB18030字符集、Unicode字符集等。计算机要准确的处理各种字符集文字,就需要进行字符编码,以便计算机能够...

ACMer_AK的博客 1508

详谈 Java 中的字符编码

详谈 Java 中的字符编码概述UnicodeCodePointLATIN 1UTF-16Code UnitUTF-8UTF-8 和 UTF-16 比较 概述 Java 语言内部使用的是 Unicode 字符集,存储一个字符时,支持 UTF-16 和 LATIN1 两种编码方式。但其实,Java 内部还实现了 ASCII、UTF-8 编码,可以很容易实现这些编码之间的相互转换。对于基本类型 cha...

jjy223404的博客 3084

unicode、utf区别

编码

h5_yan的博客 2120

ansi编码_Java 字符编码

点击上方蓝字关注我们!作者介绍王云静,Java 开发工程师,2018 年 7 月加入去哪儿网,目前在目的地 - 呼叫中心。曾获得过 ACM 亚洲区域赛铜牌。-----基本概念字符集字符(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集名称:...

weixin_39835792的博客 2872

unicode、utf-8、utf-16的理解 和 java的char类型所使用的编码

前言 说到编码,首先要搞清楚 unicode、utf-8、utf-16,至于其他的,可以暂时不管,搞懂这三个就可以无师自通了。 预备知识 对于计算机来说,任何字符其实都是一张图片,计算机把这个图片内容绘制在屏幕上,我们就能看到它了。 为了便于传输与编辑,人们事先在每个计算机上存好一套字符库,记录了每个字符的样子,其实就是字体文件。每个字符对应一个ID,这样计算机处理文字以及传输文字时,就能只处理这...

落叶秋风早的博客 1290
上一篇: Java内存泄漏发生的情况
下一篇: Android学习系列(4)--App自适应draw9patch不失真背景
hookfeng
博客等级 码龄12年 4粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值