热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mysqlunicode转汉字_unicode编码在Android中的应用

1unicode编码Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode是为了解决传统的字符编码方案的局限

1cb537f1e51cc0f6434d921bc8b4033d.png

1

unicode编码

Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布。

编码范围:0x0000-0x10FFFF。

此范围被分成了17个平面,其中,平面0(0x0000-0xffff)是基本多文种平面,包含了英文字母,阿拉伯数字,以及时间常用的各国语言。平面1(0x10000-0x1ffff)是多文种补充平面,包含了各国语言的补充以及emoji等。平面2(0x20000-0x2ffff)表意文字补充平面,此整个平面专为CJK即中日韩汉字编码设计。平面14(0xe0000-0xeffff)特别用途补充平面,此平面目前编码很少。平面15和平面16(0xf0000-10ffff)私人使用区,即自定义编码平面。其它平面基本上未编码。这个平面划分在维基百科上一目了然,下面附有链接地址。

平面0的专用区和代理区是未编码的具体如下:

专用区:0xE000-0xF8FF,6400个码位

专用区是留给自定义编码用的。

代理区:0xD800-0xDFFF,2048个码位

代理区是为utf-16编码方案用的,下面会具体讲到。

emoji:1F600-1F64F,2600-26FF,...

汉字:4e00-9FFF,扩展区A:3400-4DBF,扩展区B-F:20000-2EBEF

例如:汉字‘润'-0x6da6,emoji‘?’-0x1f606

2

unicode编码实现

UTF:Unicode Transformation Format,即Unicode字符集转换格式。Unicode有3种实现方式即:utf-8、 utf-16、utf-32

1、utf-8:

以8比特位为一个单位,一个字符的表示最少一个单位即一个字节,最大4个单位即4个字节。具体用几个单位需要看字符在unicode字符集里的码位,具体参考下表。

Unicode编码(十六进制)UTF-8 字节流(二进制)
000000-00007F0xxxxxxx
000080-0007FF110xxxxx 10xxxxxx
000800-00FFFF1110xxxx 10xxxxxx 10xxxxxx
010000-10FFFF11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
2、utf-16:

以16比特位为一个单位,一个字符的表示要么用一个单位即2个字节,要么用2个单位即4个字节。Unicode编码小于0x10000就用一个单位表示,0x10000-0x10ffff就用2个单位表示。

a.U<0x10000,utf-16就对应编码本身的无符号整数

b. U>&#61;0x10000,

7字口诀就是&#xff1a;一减&#xff0c;二转&#xff0c;三模板。

1).减&#xff1a;U&#39;&#61;U-0x10000

例:0x1f606-0x1000

2).转&#xff1a;把U&#39;转换为20位二进制&#xff0c;yyyy yyyy yyxx xxxx xxxx

3).模板&#xff1a;1101 10yy yyyy yyyy 1101 11xx xxxx xxxx

可以算一下&#xff0c;1101 10yy yyyy yyyy的取值范围1101 1000  0000 0000 - 1101 1011 1111 1111即D800-DBFF, 1101 11xx xxxx xxxx的取值范围1101 1100 0000 0000 - 1101 1111 1111 1111

即DC00-DFFF。所以&#xff0c;D800-DFFF即是unicode专为utf-16设计的代理区&#xff0c;其中&#xff0c;D800-DBFF是高代理区&#xff0c;DC00-DFFF是低代理区。代理区共2048个码位&#xff0c;unicode设计为保留区&#xff0c;没有具体编码&#xff0c;只为代理用。

我们在上面了解到平面15和平面16(0xf0000-0x10ffff)是私人使用区&#xff0c;我们把这个区间的编码使用上面公式可以算出&#xff0c;0xf0000-0x10000&#61;e0000即11100000000000000000‬&#xff0c;放入模板&#xff0c;1101 1011 1000 0000(DB80) 1101 1100 0000 0000(DC00)&#xff0c;0x10ffff-0x10000&#61;0xfffff,即11111111111111111111‬&#xff0c;放入模板,1101 1011 1111 1111(DBFF) 1101 1111 1111 1111(DFFF)。因为平面15和16专用区utf-16的高位代理实现范围是:DB80-DBFF&#xff0c;所以DB80-DBFF(D800-DBFF高位代理区的子区间)又称为高位专用代理区。

相反&#xff0c;utf-16编码求unicode

a.判断&#xff1a;非代理区&#xff0c;此字符对应U<0x10000

b.代理区

1).模板:1101 10yy yyyy yy yy 1101 11xx xxxx xxxx

2).转:把yyyy yyyy yyxx xxxx xxxx转换为十六进制U&#39;

3).加:U&#61;U&#39;&#43;0x10000

3、utf-32

以32个比特位为一个单位&#xff0c;即4个字节。所有的unicode编码都可以直接表示了&#xff0c;而且码位远远用不完。实现很简单&#xff0c;但是由于大部分字符用两个字节足够&#xff0c;4个字节太浪费空间了&#xff0c;所以很少用。

4、utf-8和utf-16方案对比

1000汉字&#xff0c;1000英文对比

新建一个文本文件&#xff0c;随便输入1000个常见(4e00-9FFF)汉字&#xff0c;发现有3KB的大小。因为windows记事本默认用utf-8编码&#xff0c;而一个汉字用utf-8表示需要用3个字节&#xff0c;所以1000字就大约是3KB。我们文本另存为utf-16格式&#xff0c;发现大小变为了2KB。这因为utf-16表示汉字只需要2个字节&#xff0c;1000个汉字大约2KB。如果把1000汉字换成1000个英文字母或阿拉伯数字&#xff0c;结果你会发现&#xff0c;用utf-8格式只有1KB&#xff0c;而utf-16仍然是2KB。这是因为&#xff0c;对于1个英文字母或1个阿拉伯数字utf-8用一个单位即1个字节就可以表示了&#xff0c;而utf-16也至少要用一个单位就是2个字节。这个对比可以帮助我们直观的理解记忆utf-8和utf-16的区别。

也正因为全世界大部分常用字符码位还是在0x100-0xffff这个范围&#xff0c;所以最佳方案还是utf-16。Java char的设计就是一个很好的说明。java char 2个字节&#xff0c;默认编码方式utf-16。当然如果是纯英文和阿拉伯数字的程序选用utf-8编码也是可以理解的。

5、字节序

把文本文档另存为utf-16时发现&#xff0c;确切的格式是UTF-16LE或者UTF-16BE。

BE(Big Endian)大字节字节序、LE(Little Endian)小字节字节序

注意&#xff1a;字节的顺序&#xff0c;非比特位的顺序;单位内字节顺序&#xff0c;非全部字节顺序。仔细观察对比0x6da6和0x1f606这两个字符的utf-16和utf-32实现&#xff0c;下表例子&#xff0c;你会明白这句话意思。

Unicode编码UTF-16LEUTF-16BEUTF32-LEUTF32-BE
0x6da6a6 6d6d a6a6 6d 00 0000 00 6d a6
0x1f6063D D8 06 DED8 3D DE 0606 f6 01 0000 01 f6 06

utf-8一个单位一个字节&#xff0c;所以没有大小字节序的区分。

UTF编码Byte Order Mark (BOM)
UTF-8 without BOM
UTF-8 with BOMEF BB BF
UTF-16LEFF FE
UTF-16BEFE FF
UTF-32LEFF FE 00 00
UTF-32BE00 00 FE FF

注:FEFF-ZWNBSP&#xff1a;Zero-Width No-Break Space零宽不断行空白

微软在自己的UTF-8格式的文本文件之前加上了EF BB BF三个字节,

windows上面的notepad等程序就是根据这三个字节来确定一个文本文件是ASCII的还是UTF-8的,

然而这个只是微软暗自作的标记, 其它平台上不一定会对UTF-8文本文件做这样的标记。

微软的一些软件会做这种检测&#xff0c;但有些软件不做这种检测&#xff0c; 而把它当作正常字符处理。(传说中的乱码问题)

3

实战&#xff0c;判断字符串里是否包含emoji

1、需求

只要输入的内容包含空格、花椒表情、emoji表情或超过10个字符就不关联&#xff0c;否则字符个数变动就关联。

需求分解&#xff1a;输入的内容是否包含emoji

2、实现

public static boolean containsEmoji(String str) {int len &#61; str.length();for (int i &#61; 0; i         int codePoint &#61; Character.codePointAt(str, i);if (isEmojiCharacterByWiki(codePoint)) {return true;
        }
    }return false;
}

/**
 * 是否是emoji编码
 * //Superscripts and Subscripts( 2070 - 209F )上标及下标
 * //Currency Symbols( 20A0 - 20CF )外汇符号
 * //Combining Diacritical Marks for Symbols( 20D0 - 20FF )
 * //Letterlike Symbols( 2100 - 214F )字母式符号 ℃ 、™
 * //Number Forms( 2150 - 218F )数字形式   ⅓ Ⅷ
 * //Arrows( 2190 - 21FF )箭头   →
 * //Mathematical Operators( 2200 - 22FF )数学操作符
 * //Miscellaneous Technical( 2300 - 23FF )零杂技术用符号
 * //Control Pictures( 2400 - 243F )控制图片
 * //Optical Character Recognition( 2440 - 245F )光学字符辨识
 * //Enclosed Alphanumerics( 2460 - 24FF )封闭式字母数字
 * //Box Drawing( 2500 - 257F )
 * //Box Elements( 2580 - 259F )
 * //Geometric Shapes( 21A0 - 21FF )几何图形
 * //Miscellaneous Symbols( 2600 - 26FF )杂项符号
 * //Dingbats ( 2700 - 27BF )装饰标志
 * //Miscellaneous Mathematical Symbols-A ( 27C0 - 27EF )杂项数学符号
 * //Supplemental Arrows-A ( 27F0 - 27FF )追加箭头
 * //Braille Patterns ( 2800 - 28FF )盲文点字模型
 * //Supplemental Arrows-B ( 2900 - 297F )追加箭头
 * //Miscellaneous Mathematical Symbols-B( 2980 - 29FF )杂项数学符号
 * //Supplemental Mathematical Operators( 2A00 - 2AFF )追加数学操作符
 * //Miscellaneous Symbols and Arrows( 2B00 - 2BFF )杂项符号和箭头
 * 


 * //CJK Symbols and Punctuation( 3000 - 30FF )CJK符号和标点
 * 


 * //Enclosed CJK Letters and Months( 3000 - 30FF )CJK封闭式字符和月份
 * 


 * // Mahjong Tiles( 1F000 - 1F02F )麻将牌
 * // Domino Tiles( 1F030 - 1F09F )多米诺骨牌
 * // Playing Cards( 1F0A0 - 1F0FF )扑克牌
 * //Enclosed Alphanumeric Supplement( 1F100 - 1F1FF )封闭式字母数字补充
 * //Enclosed Ideographic Supplement ( 1F200 - 1F2FF )封闭式表意文字补充
 * //Miscellaneous Symbols and Pictographs ( 1F300 - 1F5FF )其他符号和象形文字
 * //Emoticons ( 1F600 - 1F64F )
 * //Ornamental Dingbats ( 1F650 - 1F67F )
 * //Transport and map symbols ( 1F680 - 1F6FF )
 * //Alchemical Symbols ( 1F700 - 1F77F )炼金术的符号
 * //Geometric Shapes Extended ( 1F780 - 1F7FF )几何图形扩展
 * //Supplemental Arrows-C ( 1F800 - 1F8FF )追加箭头-C
 * //Supplemental Symbols and Pictographs ( 1F900 - 1F9FF )补充符号和象形文字
 * //Chess Symbols ( 1FA00 - 1FA6F )国际象棋的符号
 * https://en.wikibooks.org/wiki/Unicode/Character_reference
 *
 * &#64;param codePoint
 * &#64;return
 */

private static boolean isEmojiCharacterByWiki(int codePoint) {return ((codePoint >&#61; 0X2070) && (codePoint <&#61; 0X2BFF)) ||
            ((codePoint >&#61; 0X3000) && (codePoint <&#61; 0X30FF)) ||
            ((codePoint >&#61; 0X3200) && (codePoint <&#61; 0X32FF)) ||
            ((codePoint >&#61; 0x1F000) && (codePoint <&#61; 0x1FA6F));
}

参考&#xff1a;

1.When the specification for the Java language was created, the Unicode standard was accepted and the char primitive was defined as a 16-bit data type, with characters in the hexadecimal range from 0x0000 to 0xFFFF.

Java语言标准创建的时候&#xff0c;就采纳了Unicode标准&#xff0c;char原始类型被定义为16-bit数据类型&#xff0c;能存储的字符范围用16进制表示是从0x0000到0xffff。

https://docs.oracle.com/javase/tutorial/i18n/text/unicode.html

2.The native character encoding of the Java programming language is UTF-16.

https://docs.oracle.com/javase/8/docs/api/java/nio/charset/Charset.html

3.维基百科对unicode编码的编排

https://zh.wikibooks.org/wiki/Unicode/%E5%AD%97%E7%AC%A6%E5%8F%82%E8%80%83/1F000-1FFFF

4.emoji编码分类

https://apps.timwhitlock.info/emoji/tables/unicode

往期精彩回顾


Etcd集群的介绍和选主应用

360技术中台招聘啦&#xff01;&#xff01;

实习招聘|360云平台火热招聘中


0526aaa3cce1537599a82cea670728e0.png5ffc3af3d5f9ba1a481d9a5990edfe76.png

360技术公众号

技术干货|一手资讯|精彩活动

扫码关注我们



推荐阅读
  • 转自:http:www.phpweblog.netfuyongjiearchive200903116374.html一直对字符的各种编码方式懵懵懂懂,什 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 【Windows】实现微信双开或多开的方法及步骤详解
    本文介绍了在Windows系统下实现微信双开或多开的方法,通过安装微信电脑版、复制微信程序启动路径、修改文本文件为bat文件等步骤,实现同时登录两个或多个微信的效果。相比于使用虚拟机的方法,本方法更简单易行,适用于任何电脑,并且不会消耗过多系统资源。详细步骤和原理解释请参考本文内容。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • Vagrant虚拟化工具的安装和使用教程
    本文介绍了Vagrant虚拟化工具的安装和使用教程。首先介绍了安装virtualBox和Vagrant的步骤。然后详细说明了Vagrant的安装和使用方法,包括如何检查安装是否成功。最后介绍了下载虚拟机镜像的步骤,以及Vagrant镜像网站的相关信息。 ... [详细]
  • 本文讨论了如何使用GStreamer来删除H264格式视频文件中的中间部分,而不需要进行重编码。作者提出了使用gst_element_seek(...)函数来实现这个目标的思路,并提到遇到了一个解决不了的BUG。文章还列举了8个解决方案,希望能够得到更好的思路。 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • 本博文基于《Amalgamationofproteinsequence,structureandtextualinformationforimprovingprote ... [详细]
  • 关于如何快速定义自己的数据集,可以参考我的前一篇文章PyTorch中快速加载自定义数据(入门)_晨曦473的博客-CSDN博客刚开始学习P ... [详细]
  • c语言 怎么访问64位地址_C语言调动硬件的原理是什么?
    大家都知道我们可以使用C语言写一段程序来控制硬件工作,但你知道其工作原理吗?1c语言在实际运行中,都是以汇编指令的方式运行的,由编译器把C ... [详细]
  • LINUX运行谷歌TTS,中文TTS 的简单实现(基于linux)之 语音库的实现
    语音库保存着常用汉字的发音(多音的汉字只记录其一种发音,这也是本系统的一个缺陷,需要以后完善),所以先要得到一汉字集,这个汉 ... [详细]
  • 文件上传漏洞利用介绍
    目录文件上传漏洞利用介绍1.绕过js验证2.绕过MIME-TYPE验证3.绕过基于黑名单验证基于文件后缀名验证介绍基于文件后缀名验证方式的分类基于黑名单验证代码分析利 ... [详细]
  • 本文讨论了在dva中引入antd组件table时没有显示样式的问题。提供了.roadhogrc文件的配置,包括环境和import的设置。同时介绍了extraBabelPlugins和transform-runtime的使用方法,并解释了libraryName和css的含义。 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
  • 本文整理了常用的CSS属性及用法,包括背景属性、边框属性、尺寸属性、可伸缩框属性、字体属性和文本属性等,方便开发者查阅和使用。 ... [详细]
author-avatar
上海传安光通科技有限公司_839
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有