Java的字符集和编码

Java技术栈/面试题合集(10)-Nginx篇-part2 通常,当Nginx收到一个请求时,它会根据请求中的Host头来匹配server块。如果没有任何server块匹配这个Host,Nginx会默认使用第一个定义的server块来处理请求。这可能不是用户想要的,希望阻止那些未定义Host的请求,比如防止恶意请求或者垃圾流量。利用 default_server 机制和 444 状态码配置。配置默认服务器块通过定义 default_server 的监听端口,捕获所有未匹配任何 server_name 的请求配置示例server { 阅读详情

本来以为自己对Java的字符集和编码有一定了解,不过昨天和shiweidong同学讨论了几个问题,还真把我问住了。所以抽空搜索和整理了一下,有什么问题请大家指正。

首先是一些基本概念和术语

字符集(character set)

顾名思义,字符集就是字符的集合。比如26个英文字母的集合,比如Ascii字符集,另外所有汉字的集合也是字符集【当然谁也不能说把包含所有汉字了,只能说包含常见汉字】

编码字符集(coded character set)

我们知道,计算机内部所有数据都是二进制的表示,一般机器最小处理单元是8个位一个字节。计算机根本不知道A是什么,所以需要一种方法把字符集映射成整数,这也可以

说是一种编码方法,所以叫做编码字符集。最常用的Ascii把A编码成0x41(十进制为65),把编码了英文的52个字母和数组以及一些标点符号等等。

Ascii码字符集总共包括128个字符,用7位就能编码下来,但这显然不能满足英语之外的很多语言。对于非英语国家,尤其是亚洲很多国家,语言的字符数量成千上万,

所以各自定义了自己的一些编码字符集,比如中国最早是国家标准GB2312,定义了常见的汉字,但是微软觉得不够,所以在windows的操作系统下扩展了GB2312,定义

了GBK,它完全反向兼容GB2312(也就是说原来GB2312的字符的编码在GBK中保持不变),在Windows平台取得了广泛应用,后来又出了一个国家标准GB18030。增加了更多

的汉字,不过这些估计都是康熙词典都不定能找到的字,所以一般GBK就够用了。

当然,中国定义自己的编码字符集,全世界所有国家也有定义自己的字符集,而且他们编码时都不会考虑别人的字符集,那么就出现了很多问题,比如同样一个字符在不同编码中

是不同的,有些编码字符集很大,有的很小,但只能表示少量的字符。一般都包含ascii,但是可能GBK就没法表示希伯来语了(我没验证过,我只是举个例子)。

所以需要一个国际组织来一桶浆糊,Unicode于是诞生了。

字符编码方法(character encoding schema)

上面的编码字符集只是定义了一种映射方式,比如把A映射成65,但是怎么在计算机里表示65呢,当然可以用定长或者变长的方式来表示,比如可以用32位表示目前所以的Unicode字符,

但是这样也很浪费,而且一般的程序只会用到少部分字符,比如中文的程序,一般不会用到希伯来语吧。所以有了各种变长的表示方式。

GBK是变长的表示方式,英文字母一个字节,汉字两个字节。

Unicode 字符集和UTF-8,UTF-16,UTF-32编码

首先需要明确,Unicode 是一个编码字符集,它试图把全世界所有的字符都包含在内。UTF-8,UTF-16,UTF-32是编码方式。

GBK既是编码字符集,同时也是编码方法。

UTF-8 是一种变长编码方法,基本单元是一个字节。U+0000 - U+007F(0-127)用一个字节表示,U+0080-U+07FF用两个字节表示,...

具体编码方法可以参考wikipedia的词条。这种编码完全兼容Ascii。它的优点是:对英文很好,非常紧凑。但是对于非英文语言,大部分字符都超个一个字节(一般2个字节),那么解码

时每次都要判断第一个位是0还是1,这样还是挺麻烦的,也不高效。

UTF-16 也是变长编码,基本单元是两个字节,一般的字符用2个字节,也有一些需要4个字节。它的优点是对某些非英语国家有利,缺点是英文挺浪费。

UTF-32 是定长编码,所以字符都用32位4个字节表示,这确实很浪费,那它的优点是:因为是定长,所以可以随机定位到一个字符。比如有一串字符,我想定位到第3个,那么(3-1)*4就是

开始位置,如果是变长的编码,那么你的一个一个顺序遍历才行。

中文:UTF-8 3个字节;UTF-16 4个字节。所以非常遗憾,中文常见的Unicode字符范围是U+4E00 and U+9FFF,用UTF-8就3个字节了。

所以从节约空间的角度来说,中文使用GBK能节省大约33%的空间,如果是海量数据的话,这个量是非常大的。据说百度的引擎就是GBK编码的。不过在JVM里,

所有的字符都是UTF-16的【具体细节还有些需要说明的,参考下文】这还是挺浪费的。

JVM里的表示

Java里字符的原生类型是char,可以理解为一个16位的无符号整数【不要和c/c+的char混淆,c/c+的char等价于java的byte,此外java没有unsigned整数】

因为Unicode字符集在不断变化(主要是增加),最早的Unicode字符集小于65536个字符,用16位就可以表示下来。所以Java语言定义的char是个16位的数,使用UTF-16表示,

但是后来Unicode标准发生变化,出现了24位的字符,这就给Java带来了问题。下面是相关的几个术语。

code points

不知道怎么翻译,就用英文吧。

Code points就是一个编码字符集可以使用的整数。一个编码字符集定义了合法的code points的范围,但是不需要用完【也就是说中间有空洞】Unicode合法的code points是U+0000 - U+10FFFF,这有21位,最大表示大于2百万个字符。Unicode 4.0定义了96,382个。

Code Unit

编码基本单元,UTF8是字节,UTF16是两个字节。所以UTF8的字符可能占用1,2,3个字节;而UTF16要么2个字节,要么4个字节。

增补字符(Supplementary characters)

早期版本的Unicode定义了65536个字符,原来可以用16位U+0000 - U+FFFF表示,这些字符集也叫Basic Multilingual Plane (BMP)。

而那些新增加的就叫增补字符啦。

surrogate ranges

U+D800- U+DFFF之间的code point

UTF-16使用一个Code Unit来编码U+0000 - U+FFFF之间的code points,这之间的U+D800- U+DFFF code points是非法的字符,留给增补字符使用。

一个增补字符使用2个16位的code unit表示,它会把增补字符编码成两部分,第一部分的范围落在U+D800 - U+DBFF,第二部分落在U+DC00 to U+DFFF。

这样我看到一个16位的数字,根据它是否落在U+D800 to U+DFFF之间就可以判断它是一个16位的字符还是32位的字符。

Character和String类

    所以Character里出现的同一个方法有的会有两类参数,一类是char,一类是int。
    如果一个方法只接受一个char做为参数,那么这个方法是不支持增补字符的。他们把U+D800- U+DFFF这段字符当成未定义的字符。比如
         Character.isLetter('\uD840')将返回false,即使它是某个增补字符的一部分。
    如果一个方法使用int做为参数,则支持所有的Unicode字符,包括增补字符。比如 Character.isLetter(0x2F81A)将返回true

    String.length()的返回值,就不一定代表String中有多少个字符了,如果增补字符存在的话。
    而 Sring的codePointCount()方法,返回该String中的code point数量,也就是正确的字符数量。
    int codePointAt(int index)方法返回第index个code point的unicode编码。
    int codePointBefor(int index)方法返回第index前一个code point的unicode编码

参考文献

[1]    java.sun.com/javase/technologies/core/basic/intl/faq.jsp#text-representationBasic Multilingual Plane (BMP)

[2]    http://docs.oracle.com/javase/6/docs/api/java/lang/Character.html

[3]    http://www.unicode.org/

[4]    http://hi.baidu.com/zhaojianlinbj/blog/item/d9b87bd1d9aaa789a1ec9c34.html

[5]    http://stackoverflow.com/questions/2281646/whats-the-difference-between-encoding-and-charset

[6]    http://stackoverflow.com/questions/2533097/java-unicode-encoding

[7]    http://stackoverflow.com/questions/496321/utf8-utf16-and-utf32

[8]    http://www.unicode.org/faq/han_cjk.html

[9]    http://stackoverflow.com/questions/1366068/whats-the-complete-range-for-chinese-characters-in-unicode

[10] http://www.iteye.com/topic/558050

[11] http://stackoverflow.com/questions/3678752/are-all-kanji-characters-utf8-3-byte-long

[12] http://java.sun.com/developer/technicalArticles/Intl/Supplementary/


信号完整性之串扰 1.前言 串扰(Crosstalk)是指信号线之间由互感、互容而引起的耦合,由于这种耦合的存在,当某一信号线发生电平翻转时,在附近的信号线上将感应到一定程度的噪声。 2. 电路设计中抑制串扰的方法 2.1 控制高速信号线之间的间距和平行走线的长度 多个高速信号长距离平行走线时,其间距应遵循3W原则,如下图所示: 3W原则指两相邻信号线的中心间距不少于信号线宽度的3倍,当满足3W原则时,信号线之间... 阅读详情

相关推荐

从零到一:如何用YOLOv8和PyQt5打造一个高效的路面坑洞检测系统

本文详细介绍了如何利用YOLOv8和PyQt5开发一个高效的路面坑洞检测系统。从环境配置、数据采集标注到模型训练优化,再到PyQt5界面开发与系统集成,提供了完整的实战指南。该系统结合深度学习技术,显著提升了道路检测的准确性和效率,适用于各类道路维护场景。

weixin_29047919的博客 308

用 nacos 当注册中心,打包成 jar 运行时出错 YAMLException: java.nio.charset.MalformedInputException: Input length =1

[main] ERROR [c.a.cloud.nacos.client.NacosPropertySourceBuilder] NacosPropertySourceBuilder.java:105 - parse data from Nacos error,dataId 详细 2021-07-20 10:55:01,844 [main] ERROR [c.a.cloud.nacos.client.NacosPropertySourceBuilder] NacosPropertySourceBuilder

一颗小白羊 1774

Unity中USD场景导入与工业级协作实战指南

USD(Universal Scene Description)是一种面向复杂三维场景的结构化数据模型,其核心在于分层描述、变体管理与非破坏性组合,本质是支持多团队并行协作的场景协议。它不同于传统模型格式,强调运行时可编辑性与版本可控性,技术价值体现在跨软件资产一致性、零拷贝动态叠加及内存中实时合成。典型应用场景包括建筑BIM实时漫游、汽车多配置仿真、影视级灯光材质协同等工业管线。在Unity中,USD已深度集成于URP/HDRP管线,通过原生USD Importer、Runtime与Exporter三组件

weixin_32073537的博客 301

java运行jar文件时指定编码

java -Dfile.encoding=utf-8 -jar XXX.jar 转载于:https://www.cnblogs.com/DirWang/p/11205955.html

5212

「免费开源」从 OCR 识别到结构化输出:合同文本高效比对的完整解决方案!

本文将系统拆解这一解决方案的技术逻辑、实施步骤与落地价值,为企业合同管理数字化转型提供实操指南。字段提取:自动识别并提取预设的关键字段(如 “甲方”“乙方”“合同金额”“履约期限” 等),若遇到模糊表述(如 “付款时间为合同签订后 30 个工作日内”),系统可自动解析为 “履约期限:合同签订日 + 30 工作日”;预设结构化字段:根据合同类型(如采购合同、服务合同、租赁合同),定义需提取的关键字段(如 “甲方名称”“乙方名称”“合同金额”“有效期起 / 止日期”“履约地点”“违约金比例” 等);

qxsz_yyh的博客 835

用 ADT 连接 SAP S/4HANA Public Cloud 开发租户的完整落地指南

摘要:在SAP S/4HANA公有云中进行ABAP开发时,必须使用Development Tenant(客户端080)而非Customizing Tenant(客户端100)连接ADT工具。开发用户需具备SAP_BR_DEVELOPER角色且写权限不受限,开发对象应创建在结构包的子包中。连接前需确认正确的ABAP服务URL(通常为Launchpad URL去掉"/ui"),并通过运行控制台程序验证全链路功能。典型开发场景如通过BAdI实现业务校验时,需遵循Clean Core原则在指定包

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 337

结合Java详谈字符编码和字符集

字符编码和字符集是两个基础性的概念,很多开发人员对其都并不陌生,但是很少有人能将其讲得很准确。当应用出现乱码时,如何分析和定位原因,很多人仍是一头雾水。这篇文章,将从字符编码和字符集的相关概念开始讲解,然后结合Java进行实例分析。 字符编码和字符集的概念 字符集(character set)是一个系统支持的所有抽象字符的集合。字符(character)就是各种文字和符号,包括国家文字、标点符...

拈花的专栏 3万+

【系统安全】Windows内核权限提升漏洞(CVE-2024-30088)

CVE-2024-30088是Windows内核提权漏洞,由越南安全研究员@Bùi Quang Hiếu详细分析。漏洞发生在AuthzBasepCopyoutInternalSecurityAttributes函数中,该函数在复制SecurityAttributesList时会使用用户提供的指针,在校验及复制期间存在时间差,导致存在TOCTOU漏洞。

李同學AI安全 1325

java -jar 指定字符集、端口、debug

java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n -jar demo.jar 远程debug端口8000 java -Dfile.encoding=utf-8 -jar XXX.jar 指定字符集 java -jar springboot jar --server.port=8181 指定端口 java -jar springboot jar --spring.profiles.active=dev 指.

weixin_41830501的博客 3122

Claude Code 实战 从零教你用 Claude Code 干活

Claude Code 实用指南:AI 编程助手的核心功能与使用技巧 Claude Code 是 Anthropic 推出的智能编程助手,可直接在本地环境中执行操作,相比传统 AI 对话工具具有显著优势:能直接读取项目文件、自动执行修改、记忆项目规则,并支持连接外部服务。本文详解其安装配置、三大核心场景(资料搜索、网页抓取、文章撰写)及进阶功能(Skills、MCP协议、斜杠命令)。特别提供了工作模式切换、CLAUDE.md配置文件等实用技巧,并附常见问题解决方案,帮助用户高效利用这一"坐在身边的

2401_84052244的博客 7454

PyTorch深度学习实战(3)——使用PyTorch构建神经网络

PyTorch 是一个用于构建深度神经网络的库,具有灵活性和可扩展性,可以轻松自定义模型。在本节中,我们将使用 PyTorch 库构建神经网络,利用张量对象操作和梯度值计算更新网络权重,并利用 Sequential 类简化网络构建过程,最后还介绍了如何使用 save、load 方法保存和加载模型,以节省模型训练时间。

盼小辉丶的博客 8万+

java中的字符集使用什么编码_java中的字符集和编码

前言上次对计算机中的“字符集”和“编码”分别进行了总结,并指出二者之间的区别,不要搞混了,不清楚的再回到上一章看一下。今天再总结下java中是如何使用字符集(主要是Unicode字符集,其他常用字符集都只有一种编码规则),以及是如何使用utf-8、utf-16、utf-32对Unicode字符集进行编码的。java中的char类型java中的char类型占用两个字节、用于定义字符,这些字符只覆盖了...

weixin_33181210的博客 1220

SAP ABAP CDS View 里的日期函数

摘要:本文系统介绍了ABAP CDS日期函数在企业级应用中的关键作用,包括账龄计算、合同续期等业务场景。重点解析了DATS_IS_VALID、DATS_DAYS_BETWEEN等核心函数的语义和使用边界,特别强调on_error四种异常处理策略的选择逻辑。针对系统日期获取,对比了经典CDS的参数注入和View Entity会话变量两种方式。文章还提供了完整可运行的示例代码(包含CDS视图和ABAP程序),帮助开发者快速验证不同版本下的函数行为差异,确保在实际项目中正确应用这些日期处理函数。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 378

Java:字符集、用java代码完成编码和解码

Java:字符集、用java代码完成编码和解码

听海边涛声 999

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

java字符集编码和解码,Java字符集和编解码

Java字符集和编解码-----------------------android培训,java培训,期待与您交流---------------------------import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.nio.charset.*;...

weixin_39638464的博客 181

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

java字符集和字符编码集

Java系统内的字符以双字节存储,采用unicode(utf-16之一)编码。(估计jdk后续版本的java字符编码可能提升为4字节,这样可彻底解决东方国家字库问题。)Utf-8是一种标准存储编码格式,用utf-8编码后的字节流具有非常好的纠错和兼容能力。用utf-8编码(encode)unicode码时不会有信息损失。当然用utf-8解码(decode)utf-8编码的字节流,生成unicode

sky 3173

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Java字符集和字符编码研究

一、字符集和字符编码方式计算机只懂得0/1两种信号,而人类所使用的符号却无法尽数。要让计算机能够表示大千世界的符号,就一定要为每个符号指定一个唯一的整数。而这一套符号与整数的对应集合,就是我们经常谈论的字符集。而且,每一个字符所对应的整数用多少个计算机字节表示,也就涉及到了字符编码方式的问题。我们用比较规范的语言来定义这两个概念:(1) 字符集:抽象字符集合和整数集合之间的映射关系。US-ASCII、ISO 8859-1、JIS X 0201 和与 ISO 10646-1 都是字符集示例。 (2) 字字符编

First java的专栏 1106

Java中编码和解码和字符集乱码问题

1,在java的IO编程中常常会遇到字符串和字节数组转换乱码问题 2,出现乱码的原因可能是编码不统一。 3,乱码原因还有可能是字符集长度不统一。 首先来看编码,编码就是字符串转换为字节数组。 编码中用到String类的getBytes方法,这个方法能够将字符串转换位字节数组。 上面这一段呢是String类中的getBytes方法,可以看到它返回StringCoding.enc...

weixin_41589170的博客 554

字符集的编码和解码(java)

运行发现UTF-8中中文汉字占用3个字节,字母占用了1个字节,GBK中中文汉字占用2个字节,字母占用了1个字节,在s1编码中使用GBK,但是解码中使用UTF-8,会发现解码出现乱码的情况,所以编码和解码要使用一致的格式进行。通过下面的代码,我们可以发现在进行bytes编码时和解码时默认都是按照平台的编码方式和解码方式进行的,但是我们也可以控制编码和解码方式,假如编码和解码方式不一样,会发现出现乱码错误。

qq_53452521的博客 867

【java】Java编码字符集与字符集编码入门(二) 编码字符集和字符集编码的区别...

        需要再一次强调的是,无论历史上的UCS还是现如今的Unicode,两者指的都是编码字符集,而不是字符集编码。花费一点时间来理解好这件事,然后你会发现对所有网页的,系统的,编码标准之间的来回转换等等繁杂事务都会思路清晰,手到擒来。       抽象意义上的编码字符集     一个抽象字符集其实就是指字符的集合,例如所有的英文字母是一个抽象字符集,所有的汉字是...

你是我的信仰 296

java的字符集和数据库的字符集_java编码字符集及jdbc连接数据库指定字符集

java中String的编码格式为unicode,如果要将中文插入mysql,则表中字符列的编码属性应该设为utf-8.create table seugs(number int(11) default NULL,name nchar(10) default NULL,sex nchar(4) default NULL,home nchar(100) default NULL,college nc...

weixin_30678145的博客 505

Java字符编码和字符集

计算机中储存的信息都是用二进制数表示的,而我们在屏幕上看到的数字、英文、标点符号、汉字等字符是二进制数转换之后的结果。按照某种规则,将字符存储到计算机中,称为编码。反之,将存储在计算机中的二进制数按照某种规则解析显示出来,称为解码。编码:字符(人能看懂的文字) ---> 字节(计算机能看懂的二进制数据)解码:字节(计算机能看懂的二进制数据) ---> 字符(人能看懂的文字)提示:以下是本篇文章正文内容,下面案例可供参考。

Leighteen 1525

Java 学习之路(十一)- 字符集编码和字符串

目录什么是字符集和编码什么是字符集(Charset)什么是编码(Encoding)编码和字符集介绍常用的字符集简介Java 中的字符集ASCII码和转义符(escape character)如何输出特殊字符转义符语法和常用的转义符字符串的“加法”将变量穿插在字符串中输出字符串不是 Java 中的基本数据类型 什么是字符集和编码 什么是字符集(Charset) 字符集就是字符的集合。一般会包含一种语言的字符.比如 GBK ,是包含所有常用汉字字符的字符集。ASCII 是包含英文字符的字符集。 字符就是 Ja

Kevinblant的博客 217

深入了解java中的编码和字符集

参考资料: Java中的字符集编码入门 java编译器编码和JVM编码问题?Unicode是一个字符集,就好像一个字典一样,收录了全世界的文字啥的,英文是charset;ascii、gbk、utf-8、utf-16叫字符集编码,英文是encoding,例如utf-8和utf-16编码是Unicode字符集的实现,规定了字符在计算机中的具体编码规则,也就是二进制到底是什么样的,在计算机中的意思是,

joenqc的博客 3032

java中的字符集和编码

前言 上次对计算机中的“字符集”和“编码”分别进行了总结,并指出二者之间的区别,不要搞混了,不清楚的再回到上一章看一下。今天再总结下java中是如何使用字符集(主要是Unicode字符集,其他常用字符集都只有一种编码规则),以及是如何使用utf-8、utf-16、utf-32对Unicode字符集进行编码的。 java中的char类型 java中的char类型占用...

dengwan3818的博客 432

字符编码和字符集(学习Java第24天)

目录 一.字符编码 二.字符集 三.String类中编码和解码的方法 一.字符编码 计算机中储存的信息都是用二进制数表示的,而我们在屏幕上看到的数字、英文、标点符号、汉字等字符是二进制数转换之后的结果。按照某种规则,将字符存储到计算机中,称为编码 。反之,将存储在计算机中的二进制数按照某种规则解析显示出来,称为解码 。比如说,按照A规则存储,同样按照A规则解析,那么就能显示正确的文本f符号。反之,按照A规则存储,再按照B规则解析,就会导致乱码现象。 编码: 字符转换为字节。 解码:字节转.

weixin_42279465的博客 132
上一篇: lucene和solr学习交流wiki
下一篇: Linux的swappiness的配置
fancyerII
博客等级 码龄23年 48粉丝 164原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值