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

出现额外字节的UTF-16编码

UTF-16编码是一种Unicode字符编码方式,它使用16位(2个字节)来表示每个字符。在UTF-16编码中,对于基本多语言平面(BMP)中的字符,使用一个16位编码表示;而对于超出BMP范围的字符,使用一对16位编码表示,这被称为代理对。

当使用UTF-16编码时,有时会出现额外字节的情况。这是因为UTF-16编码使用固定的16位长度来表示每个字符,而某些字符的Unicode码点超出了16位的范围。对于这些超出范围的字符,UTF-16编码需要使用代理对来表示。

代理对由一个高位代理(High Surrogate)和一个低位代理(Low Surrogate)组成,它们分别位于D800至DBFF和DC00至DFFF的范围内。通过组合高位代理和低位代理,可以表示超出BMP范围的字符。

额外字节的出现是因为在UTF-16编码中,每个字符都使用16位来表示,而代理对需要使用32位来表示。因此,当遇到代理对时,需要使用额外的16位来表示低位代理。

对于开发者来说,处理UTF-16编码时需要注意额外字节的存在。在字符串处理、编解码、存储和传输等方面,都需要正确处理代理对,以确保字符的完整性和正确性。

在腾讯云的产品中,与UTF-16编码相关的产品包括:

  1. 云服务器(CVM):提供虚拟化的云服务器实例,可用于部署和运行各种应用程序和服务。
    • 产品介绍链接:https://cloud.tencent.com/product/cvm
  • 云数据库MySQL版(TencentDB for MySQL):提供稳定可靠的MySQL数据库服务,支持存储和管理UTF-16编码的数据。
    • 产品介绍链接:https://cloud.tencent.com/product/cdb_mysql
  • 云存储(COS):提供安全可靠的对象存储服务,可用于存储和管理各种类型的文件和数据。
    • 产品介绍链接:https://cloud.tencent.com/product/cos

请注意,以上产品仅作为示例,实际使用时应根据具体需求选择适合的产品。

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

相关·内容

刨根究底字符编码之十四——UTF-16究竟是怎么编码

如前文所述,为了让UTF-16能继续编码基本平面后面的增补平面中码点值,于是扩展了UTF-16编码方式。...在UTF-16编码方式中,引导代理后面应该是一个尾随代理,而尾随代理前面就应该是一个引导代理;不能出现一个引导代理后面是一个非代理普通UTF-16码元情况,也不能出现一个引导代理后面还是一个引导代理情况...UTF-16文本(字符串)最后一个码元不能是引导代理,不允许出现一个尾随代理前面是一个尾随代理情况,也不允许出现一个尾随代理前面是一个非代理普通UTF-16码元情况;UTF-16文本(字符串...但许多早期编码方式就不是自同步,比如大多数字节编码标准如GBK、Big5等,必须从头开始分析文本才能确定不同字符码元边界;也不具有非传递性,局部字符数据被破坏,很可能传递到整个文件,导致整个文件无法正确显示...因此,虽然编程时同时考虑文本中可能出现不同存储长度字符(BMP有效字符是单16位编码,即单码元编码;增补字符是双16位编码,即双码元编码)并相应做出不同处理,会比单纯只考虑16位编码在性能上要逊色一些

91140

MySQL中字节编码、长度、值关系 原

0.一个汉字占多少字节编码有关:          UTF-8:一个汉字=3个字节             GBK:一个汉字=2个字节  1.varchar(n),char(n)表示n个字符...取值范围为-128~127,占用1个字节(-27次方到27次方-1) short取值范围为-32768~32767,占用2个字节(-215次方到215次方-1) int取值范围为(-2147483648...~2147483647),占用4个字节(-231次方到231次方-1) long取值范围为(-9223372036854774808~9223372036854774807),占用8个字节(-2...浮点型数据是不能完全精确,所以有的时候在计算时候可能会在小数点最后几位出现浮动,这是正常。...byte型; boolean t = true; boolean f = false; char型(文本型) 用于存放字符数据类型,占用2个字节,采用unicode编码,它前128字节编码与ASCII

2.3K30

JSON 序列化中转义和 Unicode 编码

,百分号是一个关键字符,这样可以避免在打日志或者其他设计格式化操作时出现错误。...但是在某些情况下,当对端采用不是 UTF-8,或者是对端采用不是网络字节序时(比如对方是技术底下/落后、但却话语权强大客户/合作商/集成商),这个时候,大家统一采用 ASCII 编码,就能够避免这些问题了...通过这种方式,编码和传输 Unicode 字符。在 ASCII 为主数据传输中,这种编码方式比较稳妥,并且不会额外增加过多数据量。...当然对于 Unicode 字符比较多情况下(比如大量中文),这就需要程序员考虑一下额外带来网络花销了。...大于 65535 字符要怎么表示呢?首先,绝对不是简单地采用 \uXXXXX,这会导致编码错误。 针对大于 65535 字符,JSON 采用UTF-16 编码

9.6K51

2020-2-22-Unicode代理对(utf-16

比如如果中文和日文不同文字使用了同一个编码值进行表示,那么一篇中文软件/操作系统中创作文章,到了日文软件/操作系统中显示就会出现乱码。...而且,由于我们常用字符大部分只需要2个字节就能表示。所以这些额外空间在大部分情况下,都是白白“浪费”了。...他选择了 D800-DBFF编码范围作为前两个字节utf-16高半区),DC00-DFFF作为后两个字节utf-16低半区),组成一个四个字节表示字符。...当软件解析到Unicode连续4个字节前两个是utf-16高半区,后两个是utf-16低半区,他就会把它识别为一个字符。如果配对失败,或者顺序颠倒则不显示。...在可见未来都不会出现不够使用情况。 而且代理对区间编码不能单独映射字符,因此不会产生识别错误。

1.4K30

万字长文讲解编码知识,看这文就够了!

这里额外总结一下这四个兼容性关系是GB18030兼容GBK,GBK兼容GB2312,GB2312兼容ASCII。所谓兼容,你可以简单理解为子集、不冲突关系。...例如GB2312编码文件中可以出现ASCII字符,GBK编码文件中可以出现GB2312和ASCII字符,GB18030编码文件可以出现GBK、GB2312、ASCII字符。...,出现标准不同。...UTF-16和UTF-32也就是如今Unicode编码标准之二,他们区别就是UTF-16是变长编码,大部分是2字节和少部分4字节,UTF-32是定长编码,表示任何字符都用 4 字节 (4)UTF-8...在这种情况下,一些非英语欧洲语言编写软件和文档很可能出现乱码。而将代码页设置为相应语言中文处理又会出现问题,这一情况无法避免。

1.7K30

Android Native 开发之 NewString 与 NewStringUtf 解析

utf-8 编码最大特点就是变长编码,它使用 1~4 个字节来表示一个符号,根据符号不同动态变换字节长度; ucs-2 编码最大特点就是定长编码,它规定统一使用 2 个字节来表示一个符号; utf...,如果高两位字节不为空就组合成一个四字节 utf-16 编码字符并返回。...,high 对应是高位字节,(data[offset++] & 0xff) 则为低位字节,所以我们可以得出结论,String 对象通过这种情况下创建同样是 utf-16 编码。...我一个推测是:可能老版本 Android 系统使用是 ucs-2 编码,并没有对 BMP 之外平面集做处理,所以也不存在 4 字节 utf-8,在扩展为 utf-16 编码之后,自然而然就需要额外对... utf-8 编码为 F0A0B296,在线查询网站:Unicode和UTF编码转换),在 Android 4.3 上通过 env->NewStringUTF 方式转换之后会出现崩溃,在 Android

5.4K100

关于字符编码

##关于字符编码内容涉及:UTF-8编码UTF-16编码你好UTF8编码:E4 BD A0 E5 A5 BD计算UTF-16编码得到:UTF16编码: 4F 60https://home.unicode.org...后来又出现了4字节编码,即UCS-4UCS在计算机中存储格式叫做UTF(Unicode Transformation Format)UCS-2最直接存储格式就是UTF-16了。...由于UCS-2没有定义FFFE, 因此规定只要出现FFFE就是UTF-16LE,出现FEFF就是UTF-16BEUTF-32就简单了,它用四个字节表示字符,这样就可以完全表示UCS-4,而无需像UTF-...,多数在ASCII范围内,不管使用UTF-16还是UTF-32都会造成很大浪费因此,又提出了用1~4个字节来表示UTF-8,方式如下可见,ASCII字符(0000-007F)只使用一个字节,避免了空间浪费...另外,从表中可以看出,从首字节取值范围就可以知道编码字节数,这样大大简化了算法话说,制定标准这伙儿人呀,智商实在是高待补充UTF-32编码纸上得来终觉浅, 绝知此事要躬行。

6710

Unicode入门介绍和学习总结

# Unicode实现方式 UTF-8 使用一至四个字节为每个字符编码 UTF-16 使用二或四个字节为每个字符编码 UTF-32 使用四个字节为每个字符编码 举个例子:Unicode规定了一个中文字符...当你处理大量文本时候,使用 32 位整数存储 Unicode 会占用大量额外存储、内存、带宽等。 最常见是你会看到 Unicode 文本被编码为UTF-8 或 UTF-16。...ASCII 字节不会出现在非 ASCII 编码点中,所以搜索以 NULL 结尾或分隔符结尾字符串是可以。 使扩展遗留 ASCII 程序和 API 来处理 UTF-8 字符变得简单。...UTF-16 你可能遇到另一个编码UTF-16,它使用 16-bit 字,每个字符被存储为 1 个或 2 个字节=16bit.和 UTF-8 一样,我们可以用二进制前缀形式表示 UTF-16 编码规则...相反,动态组合系统可以让你构造你想要任何字符,通过以一个基础编码点(字母)开始然后附加额外编码点,被称作”组合标识”,来指定变音符。

1.6K10

Unicode入门介绍和学习总结

# Unicode实现方式 UTF-8 使用一至四个字节为每个字符编码 UTF-16 使用二或四个字节为每个字符编码 UTF-32 使用四个字节为每个字符编码 举个例子:Unicode规定了一个中文字符...当你处理大量文本时候,使用 32 位整数存储 Unicode 会占用大量额外存储、内存、带宽等。 最常见是你会看到 Unicode 文本被编码为UTF-8 或 UTF-16。...ASCII 字节不会出现在非 ASCII 编码点中,所以搜索以 NULL 结尾或分隔符结尾字符串是可以。 使扩展遗留 ASCII 程序和 API 来处理 UTF-8 字符变得简单。...UTF-16 你可能遇到另一个编码UTF-16,它使用 16-bit 字,每个字符被存储为 1 个或 2 个字节=16bit.和 UTF-8 一样,我们可以用二进制前缀形式表示 UTF-16 编码规则...相反,动态组合系统可以让你构造你想要任何字符,通过以一个基础编码点(字母)开始然后附加额外编码点,被称作”组合标识”,来指定变音符。

1.1K10

万字长文总结JAVA几种常见编码格式和乱码原因分析

UTF-16 用两个字节来表示 Unicode 转化格式,这个是定长表示方法,不论什么字符都可以用两个字节表示,两个字节是 16 个 bit,所以叫 UTF-16。...用 UTF-16 编码将 char 数组放大了一倍,单字节范围内字符,在高位补 0 变成两个字节,中文字符也变成两个字节。从 UTF-16 编码规则来看,仅仅将字符高位和地位进行拆分变成两个字节。...UTF-16 虽然编码效率很高,但是对单字节范围内字符也放大了一倍,这无形也浪费了存储空间,另外 UTF-16 采用顺序编码,不能对单个字符编码值进行校验,如果中间一个字符码值损坏,后面的所有码值都将受影响...UTF-16 与 UTF-8 都是处理 Unicode 编码,它们编码规则不太相同,相对来说 UTF-16 编码效率最高,字符到字节相互转换更简单,进行字符串操作也更好。...虽然最终能取得正确汉字,但是还是不建议用这种不正常方式取得参数值,因为这中间增加了一次额外编码与解码,这种情况出现乱码时因为 Tomcat 配置文件中 useBodyEncodingForURI

95520

文字与编码奥秘(下)

那么4个字节码元就可能存在字节问题,例如 000003A9 变换字节序之后可能就变成了: 03A90000 ,这时解码就会出现问题。...UTF-16 UTF-16编码方式是变长字节,可以看到有的码点只需要2个字节,有的码点需要4个字节。...这种方式下码元是2字节,每个码点可能由1个码元组成,也可能由2个码元组成,但是不管由几个码元组成,也都会出现字节问题。...UTF-16BE====>A A--encode with UTF-16,decode with UTF-16LE====>�䄀 可以看到,用一种编码方式编码出来结果,用另一种编码方式去解码,就会出现乱码情况...甚至用相同编码方式,解码时指定字节序不同也会出现乱码情况。 实用工具介绍 我们在处理自定义协议,或者抓包到一段报文时,常常需要进行协议解析,而这时通常需要进行字符解码。

1.3K50

一篇文章帮你解决中文乱码问题---JavaWeb中文编码问题全面解析

强烈建议不要使用操作系统默认编码,因为这样你应用程序编码格式就和运行环境绑定起来了,在跨环境是很可能出现乱码。 内存操作中乱码 内存中进行字符到字节转换也很常见。...按照ISO-8859-1编码 ? ISO-8859-1是单字节编码,中文“君山”被转化成值是3fbyte,3f也就是“?”字符。所以经常会出现中文变成“?”...用utf-16编码将char数组放大了一倍,单字节范围内字符在高位补0变成两个字节,中文字符也变两个字节编码效率非常高,规则很简单。 按照utf-8编码 ?...utf-16编码效率最高,字符到字节相互转换更简单,进行字符操作也更好,它适合本地磁盘和内存之间使用,可以进行字符和字节中间快速切换,java内存编码就采用utf-16编码; 但是UTF-16不适合网络之间传输...Java Web中涉及编解码 URL编解码 浏览器编码URL将非ASCII字符按照某种编码格式编码成16进制数字后在每个16进制表示字节前加上“%”,所以就出现了如下情况: http://tanqingbo.com

4.7K40

Java编码ASCII、GB2312、GBK、Unicode、UTF-8、UTF-16 编码方式详解

最早最通用字节编码系统,因为发明时间早,所以ASCII编码设计较为简单。...而unicode出现直接一次性扫清了所有障碍,原因很简单:unicode编码表中包含了世界上所有国家所有字符和符号编码。...6 UTF-16 UTF-16不是简单把UTF-8范围扩大了一倍,UTF-16和UTF-8是彻底不同两种编码概念。...结构 在绝大多数情况下,UTF-16中一个字符固定使用两个字节编码,一个字符两个字节UTF-16编码概念。 在极少数情况下也会出现三个字节表示一个字符情况。...UTF-16容错情况比UTF-8好,因为UTF-16稳定使用两个字节编码,如果数据错误不会连代其他数据被读错,而UTF-8是变长编码,可能导致后面的字符全部错误。

2.1K10

使用8位字节编码格式将字节流安全转换成String

我们常用编码格式有ASCII,Unicode,UTF-8,GB2312等,如何在这些编码之间安全转换呢?...通常,邮件内容都会经过Base64编码,在邮件接收端,需要对其解码,得到字节流,再进一步解码为正确字符串,如 Base64.cs文件中: public static class Base64     ...,在英文环境或许没有问题,但如果发信方用编码格式跟你不一样,这样就会出问题,比如对方是UTF-8编码,而自己默认编码是GB2312。...另外一种情况就是对于Base64编码二进制数据,比如邮件中图片等,原代码方式更是成问题,我们Encoding.Default 编码会破坏原始二进制字节信息,但这些信息又想作为字符串在系统中使用...二进制字节都是8位编码,只有采用8位编码格式方案才可以完整保留二进制数据。

96170

刨根究底字符编码之十一——UTF-8编码方式与字节序标记

由于UTF-16对于ASCII字符也必须使用两个字节(因为是16位码元)进行编码,存储和处理效率相对低下,并且由于ASCII字符经过UTF-16编码后得到两个字节,高字节始终是0x00,很多C语言函数都将此字节视为字符串末尾从而导致无法正确解析文本...并且,0x00~0x7F不会出现在UTF-8编码非ASCII字符字节与非首字节任意一个字节中(非ASCII字符UTF-8编码为由多个单字节码元所组成码元序列),这样就保证了与早已应用广泛且已成为工业标准...UTF-8同其他字节码元编码方式相比具有以下优点: a)  UTF-8编码空间足够大,未来Unicode新标准收录更多字符,UTF-8也能适应,因此不会再出现UTF-16那样尴尬。...最初,字符U+FEFF如果出现字节开头,则用来标识该字节字节序——是高位在前还是低位在前;如果它出现字节中间,则表达为该字符原义——零宽度不中断空格(ZERO WIDTH NO-BREAK...从Unicode 3.2开始,U+FEFF只能出现字节开头,且只能用于标识字节序,就如它别名——字节序标记——所表示意思一样;除此以外用法已被舍弃。

1.4K30

架构师必须掌握各种编码:ASCII、ISO-8859-1、GB2312...

GB2312覆盖了汉字大部分使用率,但不能处理像古汉语等特殊罕用字,所以后来出现了像GBK、GB18030这种编码。...GBK是向下兼容GB2312编码,也就是说GB2312编码汉字可以用GBK正常解码不会出现乱码,但用GBK编码汉字用GB2312解码就不一定了。...UTF-16 UTF-16是UNICODE具体实现,16即16位,UTF-16即是这个来由,定义了UNICODE字符在计算机中存储方式,UTF-16同样使用了两个字节来表示任何字符,这样使得操作字符串非常高效...UTF-16适合在磁盘与内存之间使用,字符和字节相互转换会更加简单和高效,但不适合在网络上传输,因为网络传输可能会损坏字节流。...UTF-8 虽然UTF-16很高效,但也是UNICODE最大坏处,使得所有单字节字符一定要占两个字节,存储空间放大了一倍,这明显消耗了资源,不符合现在互联网高速发展现状。

2K70

“DNS隧道”盗号木马分析

: 首先,是将一个固定字符串“aaaaaa”与你QQ号和密码这三组字符串,以制表符(’\t’)相连,拼成一个新字符串,并将其转为UTF-16编码 ?...然后,将上面的拼出字符串字符数(非字节数,实际上由于是UTF-16编码,字符数是字节1/2),保存为大端WORD形式 ?...接着,再将之前得到账号信息字符串取Hex字符串后再次进行UTF-16编码…… 我自己说着都乱……举个例子,字符’a',也就是’\x61′,UTF-16编码后就是’\x61\x00′,取Hex字符串就变成了...同时,前面获取到字符数也做同样处理,并拼到上面这个字符串前面,如下: ? 最后,以16字符为一批进行循环加密,并将加密后数据转成UTF-16编码Hex字符串,最终结果如下: ?...一个DNS查询而已,没有额外非法数据,只是查询了一个不存在域名,伪装够深了吧! 百密一疏 但其实,通过Wireshark抓包还是可以看到一个很讽刺事实——这个数据包依然是畸形

1.2K100

深入分析 Java 中中文编码问题

UTF-16 用两个字节来表示 Unicode 转化格式,这个是定长表示方法,不论什么字符都可以用两个字节表示,两个字节是 16 个 bit,所以叫 UTF-16。...用 UTF-16 编码将 char 数组放大了一倍,单字节范围内字符,在高位补 0 变成两个字节,中文字符也变成两个字节。从 UTF-16 编码规则来看,仅仅将字符高位和地位进行拆分变成两个字节。...UTF-16 虽然编码效率很高,但是对单字节范围内字符也放大了一倍,这无形也浪费了存储空间,另外 UTF-16 采用顺序编码,不能对单个字符编码值进行校验,如果中间一个字符码值损坏,后面的所有码值都将受影响...UTF-16 与 UTF-8 都是处理 Unicode 编码,它们编码规则不太相同,相对来说 UTF-16 编码效率最高,字符到字节相互转换更简单,进行字符串操作也更好。...虽然最终能取得正确汉字,但是还是不建议用这种不正常方式取得参数值,因为这中间增加了一次额外编码与解码,这种情况出现乱码时因为 Tomcat 配置文件中 useBodyEncodingForURI

1.4K20

精述字符编码

每个国家或地区都有自己一套编码方案,于是当信息在国际间间流是就会出现乱码问题,好比世界上每个国家都有自己语言,相互交流时就会出现障碍。...Unicode和UCS虽然对全球字符编码码值相同,ISO/IEC 10646标准,就像ISO/IEC 8859标准一样,只不过是一个简单字符集表,但Unicode标准,额外定义了许多与字符有关语义符号学...但是与UTF-8区别主要有UTF-16最短编码长度是2个字节,UTF-8最短是1个字节,还有就是UTF-8不存在字节问题,UTF-16存在字节问题。...UTF-16比起UTF-8,好处在于大部分字符都以固定长度字节(2字节)存储,但UTF-16却无法兼容于ASCII编码,因UTF-8兼容 ASCII,能适应许多 C 库中 ‘\0’结尾惯例,没有字节序问题...单字节编码如ASCII是不存在编码字节序问题,每一个字节代表一个字符,但是对于Unicode多字节字符编码,如UTF-16和UTF-32,就会存在字节问题。

1.4K32

今天一次把 Unicode 和 UTF-8 说清楚

1.2 什么是字符集 字符集(Character Set) 是多个字符与字符编码组成系统,由于历史原因,曾经发展出多种字符集,例如: 字符集一多起来,就容易出现兼容问题:即同一个字符在不同字符集上对应不同字符编码...要想正确解析一个字符编码,就需要先知道它使用字符编码集,否则用错误字符集解读,就会出现乱码。想象一下,你发送一个在女朋友手机上看到是另一个 emoji,是一件多么可怕事情。...先说 UTF-16 编码规则: 规则 1: 基本平面的码点(编号范围在 U+0000 ~ U+FFFF)使用 2 个字节表示。...这种方式会导致辅助平面编码每 2 个字节取值范围都与基本平面的取值范围重复,因此,解码程序在解析一段 UTF-16 编码字符流时,就无法区分这 2 个字节是属于基本平面字符,还是属于辅助平面字符。...为了解决这个问题,必须实现前缀无歧义编码(PFC 编码,类似的还有哈弗曼编码)。UTF-16 方案是将用于基本平面字符编码取值范围与辅助平面字符编码取值范围错开,使得两者不会出现歧义(冲突)。

84720
领券