首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

一个3字节宽的UTF-8字符怎么可能只使用一个UTF-16代码单元呢?

一个3字节宽的UTF-8字符不可能只使用一个UTF-16代码单元。UTF-8和UTF-16是两种不同的字符编码方式,用于表示Unicode字符集中的字符。

UTF-8是一种变长编码方式,使用1到4个字节来表示一个Unicode字符。对于一个3字节宽的UTF-8字符,它的编码范围是U+0800到U+FFFF。UTF-8编码中,一个字符的第一个字节的高位会指示该字符的编码长度,而后续字节的高位都会标记为10。因此,一个3字节宽的UTF-8字符的编码形式为:1110xxxx 10xxxxxx 10xxxxxx。

UTF-16是一种定长编码方式,使用2个字节(16位)来表示一个Unicode字符。UTF-16编码中,对于Unicode字符集中的字符,如果其编码值小于等于U+FFFF,则使用一个UTF-16代码单元来表示;如果其编码值大于U+FFFF,则使用两个UTF-16代码单元来表示,这种情况下称为代理对(surrogate pair)。

因此,一个3字节宽的UTF-8字符无法只使用一个UTF-16代码单元来表示,因为UTF-16的编码范围无法覆盖到3字节宽的UTF-8字符的编码范围。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

字符编码的前世今生——一文读懂字符编码

UTF-16、UTF-32和UTF-8的区别 UTF-16 UTF-16是早期对Unicode码表的一个实现版本,一开始它规定用两个无符号字节也就是16位二进制来表示全部字符。...比如在有些工具里,我们只看到UTF-8,却没看到UTF-16,为什么呢?因为这会人家叫另一个名字UCS-2 现在来说说UTF-16的缺点吧,最大的一个缺点就是不兼容ASCII 码。...在C语言中,它就是所谓的宽字符,要想说清楚这些问题,非得拿C语言写代码举例子不可,此处省略…… 最后一点总结,UTF-16算是个历史遗留问题,只有一些很老旧的文档或软件工具会用这种编码,现在的一些新东西如果不考虑兼容以前的老系统...无论如何,在互联网时代,UTF-8都是一种非常优秀的解决方案,现代的新兴编程语言,也都默认使用UTF-8作为源代码文件的指定编码。如Golang、Dart、Python3等。...字符编码与编程 在早期,编程语言刚被发明的时候,几乎都是只支持ASCII码的,例如经典C语言,Python2等,因此在编写源码代码的时候,不能写中文注释,因为源代码是不支持这种非ASCII码字符的,这也是

2.1K40

Html编码(&#数字型)与解码小结 - 针对Puny Code(中文域名)的解码处理

算法思路     依次遍历URL(假设URL保存在wchar_t宽字符数组中,使用wchar_t宽字符存储Unicode编码集),遇到特定格式&#,取出其中的数字32321,然后将其强制转换成wchar_t...Unicode和UTF-8,UTF-16 [Unicode]为表达任意语言的任意字符而设计。它使用4字节的数字来表达每个字母、符号,或者表意文字(ideograph)。...每个数字代表唯一的至少在某种语言中使用的符号。Unicode是字符集,UTF-32/ UTF-16/ UTF-8是三种字符编码方案。...需要注意的是,Unicode 只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。...UTF-16将0–65535范围内的字符编码成2个字节。 [UTF-8]一种针对Unicode的可变长度字符编码,UTF-8使用一至四个字节为每个字符编码。

2.8K30
  • 字符编码技术专题(五):前端必读的计算机字符编码知识入门

    但是这里有个比较严重的问题: 1)不同码位的字符使用不同的字符长度,但计算机无法知道到底是按照 2 个还是 4 个字符解析; 2)即便只使用英文字符前一个字节也必须是 0,严重浪费了空间。...其中 BMP 的字符直接使用 Unicode 码点对应即可,比如“兔”的码点 U+5154,UTF-16 编码就是 0x5154。 可是 BMP 外,要如何使用 4 个字节表示呢?...而 length 统计的是代码单元而非真正的字符数量,因此按照 UCS-2 的编码方式,每个字符由 2 个字节构成,即两个 2 字节组成字符的 length = 1。...3)字符编码形式(CEF, Character Encoding Form):从代码点到特定宽度(比如32-bit整数)的代码单元序列的映射。...这一层级理解为 UTF-8、UTF-16、UTF-32 的编码过程。 4)字符编码方案(CES, Character Encoding Scheme):从代码单元序列到字节序列的映射。

    37640

    UNICODE,GBK,UTF-8

    但这些标记是基于什么标准呢? 问题二: 最近在网上看到一个ConvertUTF.c,实现了UTF-32、UTF-16和UTF-8这三种编码方式的相互转换。...但是由于GB18030有一部分4字节编码,而Windows的代码页只支持单字节和双字节编码,所以这个code page是无法真正使用的。...但UCS-2只是一个编码方案,UTF-16却要用于实际的传输,所以就不得不考虑字节序的问题。 5、UTF的字节序和BOM UTF-8以字节为编码单元,没有字节序的问题。...UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。例如“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。...Windows中有缺省代码页的概念,即缺省用什么编码来解释字符。例如Windows的记事本打开了一个文本文件,里面的内容是字节流:BA、BA、D7、D6。Windows应该去怎么解释它呢?

    2.6K20

    UNICODE,GBK,UTF-8区别

    但这些标记是基于什么标准呢? 问题二: 最近在网上看到一个ConvertUTF.c,实现了UTF-32、UTF-16和UTF-8这三种编码方式的相互转换。...但是由于GB18030有一部分4字节编码,而Windows的代码页只支持单字节和双字节编码,所以这个code page是无法真正使用的。...但UCS-2只是一个编码方案,UTF-16却要用于实际的传输,所以就不得不考虑字节序的问题。 5、UTF的字节序和BOM UTF-8以字节为编码单元,没有字节序的问题。...UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。例如“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。...Windows中有缺省代码页的概念,即缺省用什么编码来解释字符。例如Windows的记事本打开了一个文本文件,里面的内容是字节流:BA、BA、D7、D6。Windows应该去怎么解释它呢?

    3.1K21

    使你的CC++代码支持Unicode

    因为基于字符的显示和打印(与此不同的是,GUI是基于像素的)使用列数,而不是字节数或者字符个数。在字符串指针相关的计算中使用GetNext格式,因为一个字符可能包含多于一个Unicode字符单元。...比如,限制到20字节,将字符串转化为大写形式就可能导致字符串变长并且超过限制。 将接受或者返回单字符参数的函数替换为使用字符串的版本。 (在一些语言中) 对于单个字符的操作可能导致返回多个代码点。...文件 I/O, 数据库, 传输协议等因素   考虑是否需要读写文件、数据库中的 UTF-8 或者 UTF-16 字符,以及是否进行数据交换。考虑 UTF-16 格式文件中的字节序。...所以BOM可以作为放置于文件(或者一 个字符串)的起始作为字节序的指示器。对UTF-16编码而言,如果第一个字符的值是FE FF 那么文本和读取文本的机器有相同的字节序。...下列列表并没有列举所有的有ANSI和宽字符两个版本的API,只列举了与字符和字符串处理相关的一些。如果需要 查看与代码页和地区相关的API请查看WinNLS.h头文件。

    86900

    使你的CC++代码支持Unicode

    因为基于字符的显示和打印(与此不同的是,GUI是基于像素的)使用列数,而不是字节数或者字符个数。在字符串指针相关的计算中使用GetNext格式,因为一个字符可能包含多于一个Unicode字符单元。...比如,限制到20字节,将字符串转化为大写形式就可能导致字符串变长并且超过限制。 将接受或者返回单字符参数的函数替换为使用字符串的版本。 (在一些语言中) 对于单个字符的操作可能导致返回多个代码点。...文件 I/O, 数据库, 传输协议等因素   考虑是否需要读写文件、数据库中的 UTF-8 或者 UTF-16 字符,以及是否进行数据交换。考虑 UTF-16 格式文件中的字节序。...所以BOM可以作为放置于文件(或者一 个字符串)的起始作为字节序的指示器。对UTF-16编码而言,如果第一个字符的值是FE FF 那么文本和读取文本的机器有相同的字节序。...下列列表并没有列举所有的有ANSI和宽字符两个版本的API,只列举了与字符和字符串处理相关的一些。如果需要 查看与代码页和地区相关的API请查看WinNLS.h头文件。

    93630

    Eclipse 中 Syntax error on token Invalid Character, delete this token 的解决

    3、什么是BOM呢?   BOM的全称是:Byte Order Mark(字节顺序标记)。UTF-8以字节为编码单元,没有字节序的问题。...UTF-16以两个字节为编码单元,在解析一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。例如:收到一个“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。...4、UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF。...解决方法如下:   1)使用UE或者其他文本工具,将有问题的java文件另存为UTF-8,无BOM编码的格式,替换原来的java文件。   ...2)使用eclipse自建的文件编码,尽量不要从其他地方拷贝代码,手写要复制的代码。

    2K10

    Unicode编码

    但这些标记是基于什么标准呢? 问题二:   最近在网上看到一个ConvertUTF.c,实现了UTF-32、UTF-16和UTF-8这三种编码方式的相互转换。...现在的PC平台必须支持GB18030,对嵌入式产品暂不作要求。所以手机、MP3一般只支持GB2312。   ...对于不小于0x10000的UCS码,定义了一个算法。不过由于实际使用的UCS2,或者UCS4的BMP必然小于0x10000,所以就目前而言,可以认为UTF-16和UCS-2基本相同。...但UCS-2只是一个编码方案,UTF-16却要用于实际的传输,所以就不得不考虑字节序的问题。 5、UTF的字节序和BOM   UTF-8以字节为编码单元,没有字节序的问题。...UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。例如收到一个“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。

    1.4K10

    Java的String类中提到的代码点,代码单元到底是什么?

    计算机采用八比特一个字节,一个字节最大整数是255,还要表示中文一个字也是不够的,至少需要两个字节,为了统一所有的文字编码,unicode为每种语言中的每个字符设定了统一并且唯一的二进制编码,通常用两个字节表示一个字符...UTF-8就是以字节为单位对unicode进行编码,对不同范围的字符使用不同长度的编码。...字节形式通常称作 UCS-2,在Java中,char类型用UTF-16编码描述一个代码单元,但unicode大于0x10000的部分如何用char表示呢,比如一些emoji:java的char类型占两个字节...程序是如何将\uD83D\uDE03解析成一个字符的呢。...codePointAtImpl方法判断当前char是高代理项代码单元,下一个是低代理项代码单元,则这两个char是一个codepoint。

    51420

    字符编码

    计算机这时候只支持英语,其他语言不能够在计算机存储和显示。 在该阶段,单字节字符串使用一个字节存放一个字符(SBCS,Single Byte Character System)。...目前计算机一般使用 2 个字节(16 位)来存放一个序号(DBCS,Double Byte Character System),因此,这种方式存放的字符也被称作宽字节字符。...因为目前为止Unicode-16规范没有指定FFFF以上的字符,所以UTF-8最多是使用3个字节来表示一个字符。但理论上来说,UTF-8最多需要用6字节表示一个字符。  UTF-8兼容ASCII。...但UCS-2只是一个编码方案,UTF-16却要用于实际的传输,所以就不得不考虑字节序的问题。 UTF-16不兼容ASCII。...6.1 UTF的字节序和BOM 6.1.1 字节序 UTF-8以字节为编码单元,没有字节序的问题。UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。

    2.1K40

    UTF-8 为什么会比 UTF-16 浪费?

    假设我们只判断首位的 1,这显然是不行的,没有办法区分,所以我们可以用 10或者 11开头的字符来表示 2字节,但是 3字节又该以什么开头?或者可以用 10开头表示 2字节,用 11开头表示 3字节?...所以这也就是这一张表的来历: ? UTF-8和UTF-16 那么 UTF-8的 8是从哪儿来的呢?它的意思就是说我们以 2的 8次方为一个字节,为一个最小单元。...那么如果我们以 2的 16次方为一个最小单元,这就变成了 UTF-16,它的规则和 UTF-8相同,唯一不同的是它最小也要用 16个 2进制位表示一个字符,而 16个 2进制位直接可以表示 65536种字符...UTF-16来存储英文的话,会造成浪费,因为英文在 UTF-8里只占 1字节,而在 UTF-16里要占 2字节,但是如果我们用 UTF-16来存储中文的话,不但不浪费,反而还节省了呢!...因为我们的中文在 UTF-8里要占用 3字节,而在 UTF-16里只占用 2字节,节省了 33%之多呢! 觉得本文对你有帮助?请分享给更多人。

    99350

    刨根究底字符编码之十——Unicode字符集的编码方式以及码点、码元

    由于Unicode字符集非常大,有些字符的编号(码点值)需要两个或两个以上字节来表示,而要对这样的编号进行编码,也必须使用两个或两个以上字节。...计算机怎么知道三个字节表示的是一个字符,而不是分别表示三个字符呢?...GBK字符集使用区位码的方式为每个字符编号,首先定义一个94×94的矩阵,行称为“区”,列称为“位”,然后将所有国标汉字放入矩阵当中,这样每个汉字就可以用唯一的“区位”码来标识了。...在计算机存储和网络传输时,码点值(即字符编号)被映射到一个或多个码元(Code Unit代码单元、编码单元)。...因此,采用单字节码元进行编码的UTF-8编码,虽然ASCII字符为单字节编码,但非ASCII字符是多字节编码的,但却不存在字节序问题,这是跟同样为多字节编码、但采用多字节码元的UTF-16、UTF-32

    1.9K30

    python encode和decode函数说明

    ('utf-8')#如果以utf-8的编码对str进行解码得到的结果,将无法还原原来的unicode类型 如上面代码,str\str1\str2均为字符串类型(str),给字符串操作带来较大的复杂性。...好消息来了,对,那就是python3,在新版本的python3中,取消了unicode类型,代替它的是使用unicode字符的字符串类型(str),字符串类型(str)成为基础类型如下所示,而编码后的变为了字节类型...但这些标记是基于什么标准呢? 问题二: 最近在网上看到一个ConvertUTF.c,实现了UTF- 32、UTF-16和UTF-8这三种编码方式的相互转换。...但UCS-2只是一个编码方案,UTF-16却要用于实际的传输,所以就不得不考虑字节序的问题。 5、UTF的字节序和BOM UTF -8以字节为编码单元,没有字节序的问题。...UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。例如收 到一个“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。

    1.4K30

    一个 Java 字符串到底有多少个字符?

    Java会使用操作系统的编码格式得到字节数组,在我的MacOS中,默认使用UTF-8作为字符编码(locale命令可以查看操作系统的编码),所以在我的机器运行,String.getBytes()会返回UTF...结果字符串的长度是4, UTF-8编码8个字节,字符数组的长度是4 生僻的中文字:我们设置了两个中文字,其中一个是生僻的中文字。...结果字符串的长度是3, UTF-8编码7个字节,字符数组的长度是3 看起来字符串的字符数和我们预期的有点不一样,我们的字符串只有两个unicode字符, 可是输出结果有时候是2,有时候是3, 有时候是4...Code Unit:代码单元,是指一个已编码的文本中具有最短的比特组合的单元。对于 UTF-8 来说,代码单元是 8 比特长;对于 UTF-16 来说,代码单元是 16 比特长。...换一种说法就是 UTF-8 的是以一个字节为最小单位的,UTF-16 是以两个字节为最小单位的。

    1.3K11

    一个Java字符串中到底有多少个字符?

    ,Java会使用操作系统的编码格式得到字节数组,在我的MacOS中,默认使用UTF-8作为字符编码(locale命令可以查看操作系统的编码),所以在我的机器运行,String.getBytes()会返回...结果字符串的长度是4, UTF-8编码8个字节,字符数组的长度是4 生僻的中文字:我们设置了两个中文字,其中一个是生僻的中文字。...结果字符串的长度是3, UTF-8编码7个字节,字符数组的长度是3 看起来字符串的字符数和我们预期的有点不一样,我们的字符串只有两个unicode字符, 可是输出结果有时候是2,有时候是3, 有时候是4...Code Unit:代码单元,是指一个已编码的文本中具有最短的比特组合的单元。对于 UTF-8 来说,代码单元是 8 比特长;对于 UTF-16 来说,代码单元是 16 比特长。...换一种说法就是 UTF-8 的是以一个字节为最小单位的,UTF-16 是以两个字节为最小单位的。

    1.4K10

    Unicode入门介绍和学习总结

    # Unicode的实现方式 UTF-8 使用一至四个字节为每个字符编码 UTF-16 使用二或四个字节为每个字符编码 UTF-32 使用四个字节为每个字符编码 举个例子:Unicode规定了一个中文字符...UTF-8使用可变长度字节来储存 Unicode字符,例如ASCII字母继续使用1字节储存,重音文字、希腊字母或西里尔字母等使用2字节来储存,而常用的汉字就要使用3字节。...UTF-16 你可能遇到的另一个编码是 UTF-16,它使用 16-bit 字,每个字符被存储为 1 个或 2 个字节=16bit.和 UTF-8 一样,我们可以用二进制前缀的形式表示 UTF-16 的编码规则...UTF-16 也被微软 WIN32 API 使用;尽管 Win32 同时支持 8-bit 和 16-bit 字符串,但是 8-bit 版本仍然莫名其妙地不支持 UTF-8——只支持使用旧编码的代码,像...Unicode 在这个问题上没有说明,虽然它确实鼓励一个惯例,即把 U+FEFF 零宽无间断间隔[8]这个字符放到 UTF-16 文件开头作为字节序标识[9],来消除字节序问题。

    1.1K10

    Windows 编程中的字符编码

    经常在写代码的时候需要处理宽字符,ASCII 字符,在代码中看到 wchar、char 等等。一般都是处理一个方法的时候发现需要的是某字符串,然后这边有什么字符串,之后查一个转换方法。...,其实就是把每个字符作为一个具体数字 。对于 Unicode 标准,存在多种编码,例如:UTF-8 编码,UTF-16 编码等等。...UTF-8 以下引用《核心编程》原文: UTF-8 将一些字符编码为 1 个字节(可以说就是那些 ASCII 字符),一些字符编码为 2 个字节,一些字符编码为 3 个字节,一些字符编码为 4 个字节...所以这中间会有一个分配内存的过程,显然会有一个效率上的问题。所以其实现在写代码,非常推荐统一使用宽字符版本。 另外除了 Windows API 之外,C 运行库,也有类似的操作。...这里边就会有一个不一致。要考虑编码转换问题。 最后 至此编程中需要的编码,大致了解清楚了。Windows 编程中,除非有特殊需要,否则一律使用宽字符是最好的选择。编码则选择 UTF-16 编码。

    99340

    从Java String实例来理解ANSI、Unicode、BMP、UTF等编码概念

    为了方便下面的描述,先交代一下代码单元(Code Unit)的概念,某种编码的基本组成单位就叫代码单元,比如UTF-8的代码单元为1个字节,UTF-16的代码单元为2个字节,不好解释,但是很好理解。...这个做法导致了一些麻烦,如果所有字符都在BMP范围内还没事,若有BMP外的字符,就不再是一个代码单元对应一个字符了,length方法返回的是代码单元的个数,而不是字符的个数,charAt方法返回的自然也是一个代码单元而不是一个字符...(注意别用Windows的记事本,因为它会在UTF-8文件最前面加入一个3字节的BOM头,而很多程序都不兼容这一点) 然后在Windows中使用默认参数编译该文件(系统区域设置为简体中文,即默认使用...编译的时候我们没有指定encoding参数,所以编译器会默认以GBK方式去解码,对UTF-8和GBK有点了解的应该会知道,一般一个中文字符使用UTF-8编码需要3个字节,而GBK只需要2个字节,这就能解释为什么字符数的奇偶性会影响结果...,因为如果2个字符,UTF-8编码占6个字节,以GBK方式来解码恰好能解码为3个字符,而如果是1个字符,就会多出一个无法映射的字节,就是图中问号的地方。

    1.6K10

    基础数据类型之Unicode编码简介

    一个字符对应的实际的值,我们称之为代码点 code point 那么一个码点实际的值怎么存储呢?...可能需要1个,可能需要2个,甚至可能需要3个或者4个字节来表示 对于计算机来说,面对着一堆字节,他们知道到底哪个或者哪几个是一个字符呢? 听起来可能有点迷惑,不是知道具体的值了么?...20位,然后再加上0x010000  这就是这个字符的码点 可以看得出来,对于基本平面中的字符,使用2个字节长度,16位表示,这被称之为一个代码单元 对于除了基本平面外的辅助平面,使用4个字节长度来表示...,也就是两个代码单元 之前我们提到过,Unicode中的一个字符的值,被称之为一个码点 显然,一个码点,可能被一个代码单元存储,也可能被两个连续的代码单元存储 UTF-32 UTF...UTF-8 UTF-8 是目前互联网上使用最广泛的一种 Unicode 编码方式,可变长 使用 1 - 4 个字节表示一个字符,根据字符的不同变换长度   规则可以把编码分解成两部分,head和bodyhead

    99020
    领券