字符编码

Java程序员们,请永远不要在MySQL中使用utf8,改用utf8mb4!

放肆的年华 提交于 2020-01-24 09:42:06
最近我遇到了一个bug,我试着通过Rails在以“utf8”编码的MariaDB中保存一个UTF-8字符串,然后出现了一个离奇的错误: Incorrect string value: ‘\xF0\x9F\x98\x83 <…’ for column ‘summary’ at row 1 我用的是UTF-8编码的客户端,服务器也是UTF-8编码的,数据库也是,就连要保存的这个字符串“ <…”也是合法的UTF-8。 问题的症结在于,MySQL的“utf8”实际上不是真正的UTF-8。 “utf8”只支持每个字符最多三个字节,而真正的UTF-8是每个字符最多四个字节。 MySQL一直没有修复这个bug,他们在2010年发布了一个叫作“utf8mb4”的字符集,绕过了这个问题。 当然,他们并没有对新的字符集广而告之。 MySQL的“utf8mb4”是真正的“UTF-8” MySQL的“utf8”是一种“专属的编码”,它能够编码的Unicode字符并不多。 所有在使用“utf8”的MySQL和MariaDB用户都应该改用“utf8mb4”,永远都不要再使用“utf8”。 那么什么是编码?什么是UTF-8? 我们都知道,计算机使用0和1来存储文本。比如字符“C”被存成“01000011”,那么计算机在显示这个字符时需要经过两个步骤: 计算机读取“01000011”,得到数字67

第十二篇 字符编码

做~自己de王妃 提交于 2020-01-24 04:12:04
第十二篇 字符编码 # 预备知识 由于计算机语言是一组高低电平,高电平代表1,低电平代表0,计算机中的所有信息都是以二进制代码的形式存在的,无论是文字、图片、声音,还是影像、游戏...... ASCII:美国信息交换标准码(American Standard Code for Information Interchange) 类似于摩斯电码,为了让人们能看懂这些二进制代码,美国人最先制定了一种编码规则——ASCII码,用于理解二进制代码到底代表的是哪些字符,ASCII码使用指定的7个二进制位组合,这些组合所能表示的128个整数用来代表大小写字母、0到9的数字、控制字符、通信专用字符、空格符、运算符号、标点符号等的编号,通过编号可以找到一一对应的字符,ASCII码通常会额外使用一个扩充的二进制位,虽然这个二进制位可能并不代表任何意思,但是可以方便以一个字节的方式存储每个字符 在美国计算机装的英文系统上的编码表可能是ASCII码也可能是EBCDIC码,而编码格式也一定是ASCII编码格式,才能在输出文本和打开文本时不出现乱码 GBK:汉字字符集国家标准编码 ASCII码只能满足英文在计算机上通信的需要,为了扩充ASCII编码,也为了满足其他语言的通信需要,各国也都制定了各自的属于本国语言的字符编码来方便在计算机上通信,例如我国的GBK 在GBK编码体系下,有些字符使用双字节组合来表示

mysql中utf8和utf8mb4区别

天大地大妈咪最大 提交于 2020-01-23 14:33:22
转自:http://ourmysql.com/archives/1402 MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。好在utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。当然,为了节省空间,一般情况下使用utf8也就够了。 二、内容描述 那上面说了既然utf8能够存下大部分中文汉字,那为什么还要使用utf8mb4呢? 原来mysql支持的 utf8 编码最大字符长度为 3 字节,如果遇到 4 字节的宽字符就会插入异常了。三个字节的 UTF-8 最大能编码的 Unicode 字符是 0xffff,也就是 Unicode 中的基本多文种平面(BMP)。也就是说,任何不在基本多文本平面的 Unicode字符,都无法使用 Mysql 的 utf8 字符集存储。包括 Emoji 表情(Emoji 是一种特殊的 Unicode 编码,常见于 ios 和 android 手机上),和很多不常用的汉字,以及任何新增的 Unicode 字符等等。 三、问题根源 最初的 UTF-8 格式使用一至六个字节,最大能编码 31 位字符。最新的 UTF-8 规范只使用一到四个字节,最大能编码21位,正好能够表示所有的 17个 Unicode 平面。 utf8 是 Mysql

编码的简单总结

被刻印的时光 ゝ 提交于 2020-01-23 01:06:29
说明 下面对于各种编码分类并不完全对,仅仅为了便于比较总结记忆 编码的前缀也不是严格非要那样,为了在碰到时,或许可以一眼看出这是哪种编码 对于编码方式没有详细解释,只是简短的大概说明,关于编码具体过程,网上有很多资料 utf编码有大小端的问题 https://blog.csdn.net/byf0521hlyp/article/details/80365045 base家族 https://blog.csdn.net/lili13897741554/article/details/82177472 字符及网络上常用编码 编码 目的 前缀或特点 编码形式 常见或特殊记忆 url编码 对ascii中的一些可打印字符进行编码 前缀% 以%为前缀,其后是字符的两16进制的ascii码 %20空格 %00空字节 %25百分号 +也代表url的空格 html编码 为在html文档中安全的使用某些字符 &或&#或&#x 后跟字符10进制的ascii码,&#x为前缀,后跟字符的16进制的ascii码 "为&quot或&#34或&#x22 >为&gt <为&lt 16进制编码 对二进制数据进行16进制编码 base64 对二进制数据进行编码,用来将非ASCII字符的数据转换成ASCII字符 末尾经常出现= 大写字母A~Z,小写字母a~z,数字0~9以及"+","/"及用来填充的= base32

字符集与编码--Java string.length 与 char 类型

拥有回忆 提交于 2020-01-22 22:22:02
这篇博客用于记录学习字符编码过程中得到的结论,不做过多的理论讲述。 参考资料: 字符集与编码(五) 1. char 类型 在Java中,char类型存放一个用UTF-16编码代码单元(16位)表示的字符,用于表示单个字符,通常用来表示字符常量。例如:'A'是编码为65所对应的字符常量。 与"A"不同,"A"是一个包含字符A的字符串。Unicode代码点可以表示为十六进制值,其范围从\u0000到\uFFFF。例如:\u2122表示注册符号,\u03C0表示希腊字母π。 Java 中的 char 使用了 16 位,它可以放一个英文字符,一个中文字符,因为这些字符都在 BMP 中,如果一个字符来自增补平面,那么它将无法放入 char 中。 2. 增补字符的转义表示 另外我们可以以转义的代理对的方式表示增补字符,这样可以避免字库方面的问题。 当然了,任何字符都可以用转义的方式表示,而不仅仅限于增补字符。如果你没有安装输入法,可以简单使用 \u4F60 来表示“你”这个字符。 注:如果担心传输中出现乱码,可使用转义的表示,这时只含有 ASCII 字符,不过这种表示法效率很低。比如我们要用“\, u, 4, F, 6, 0”整整 6 个 ASCII 字符才能表示“你”这个汉字,也即要用 6 字节才能表示。而直接表示的话,用 GBK 只要两字节,而用 UTF-8 也不过是三字节。 例如 U

字符集与编码--Java class文件的编码方式

╄→гoц情女王★ 提交于 2020-01-22 22:20:21
1 public static void main(String[] args) throws UnsupportedEncodingException { 2 /** 3 * 1. char 和 String 在内存中保存都使用Java内码,也即UTF-16 4 * 2. char 在class文件中使用UTF-16表示 5 * 3. String在class文件中使用UTF-8表示 6 * 4. 序列化和Class文件中用"modified UTF-8",不是UTF-8。参考https://docs.oracle.com/javase/7/docs/api/java/io/DataInput.html#modified-utf-8 7 * 8 * 5. 问题:内存存储的是UTF-16编码的字节,那么String.getBytes("UTF-8")应该是从UTF-16到UTF-8的转换过程 9 * 解答:String.getBytes()是一个用于将String的内码转换为指定的外码的方法(问题中UTF-8就是指定的外码)。 10 * 无参数版使用平台的默认编码作为外码,有参数版使用参数指定的编码作为外码。 11 * 将String的内容用外码编码好,结果放在一个新byte[]返回。 12 * 13 * 14 * @date 2020/1/17 15 * @return 16 *

URL中文编码与文本中文编码的关系

為{幸葍}努か 提交于 2020-01-22 15:19:58
写在前面: 系统环境:Windows 10 软件环境:360急速浏览器11.0,内核版本69(基于Chromium) URL在浏览器中编码 在使用爬虫过程中,我们常常要对URL地址进行处理:在发包时对字符串进行编码;在接收数据时,对参数进行解码。由于现在常见的浏览器已经都对URL中的字符进行了解码,因此在使用浏览器时,地址栏中已经做到了正常中文字符 通过浏览器的调试工具,能够查看到在网络上编码传输的地址 由此可以发现: 中文字符 编码字符 除 %E9%99%A4 夕 %E5%A4%95 正常显示的中文字符,编码后转换为一串由 %+字母/数字 的字符串,在这个字符串中的 百分号(%) 是浏览器作为字符边界的一个标志, 字符/数字 的组合是UTF-8格式下的汉字对应的编码。 Unicode字符集与UTF-8编码规则 在查找对应码表之前,需要先明确一下,Unicode与UTF-8这个两个常见名词的关系。 Unicode:统一码、万国码。是计算机科学领域里的一项业界标准, 包括字符集、编码方案等 。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了 统一并且唯一 的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。 UTF-8:是针对Unicode的一种 可变长度字符编码 。它可以用来表示Unicode标准中的任何字符

字符乱码之字符集和字符编码

戏子无情 提交于 2020-01-22 10:52:52
最近经常会碰到上传客户提供的历史数据上传时csv文件用Excel打开时会有乱码问题,虽然知道知道是字符编码不一致导致的,但其中诸多细节却知之甚少,今日特来理理。 1.为什么会有字符乱码问题?如何解决字符乱码问题 计算机中存储的信息都是二进制数表示的,但是世界上有各种不同的语言文字,所以我们需要 一些规则 将各种字符转换成二进制后存储在计算机中 即编码,以及如果将存储在计算机中的二进制数解析出来即解码。就如破译电报密码一样如果密码本是错误的,那么密码也是错误。会有字符乱码问题就是因为解码方式是不对的,要解决乱码问题一定要知道字符编码是什么 扫盲知识点: 字符集(Charset):是一个系统支持的所有抽象字符的集合,字符是各种文字和符号的总称,包括各种国家文字,标点符号,图形符号,数字 字库表:它存储了编码规范中的所有字符,计算机通过计算机就是根据二进制数从字库表中找到字符然后显示给用户滴,相当于一个存储字符的数据库 字符集和字库表一一对应,相互转换,这是电脑识别字符的关键 字符编码(Charater Encoding):是一套法则,使字符集中的自然语言字符(字符集)转换成计算集可以接受的数字代码。 字符解码:二进制数从字库表中找到字符然后显示给用户 字符集和字符编码的关系: 字符集其实是一套编码规范中的子概念,为了显示字符,世界组织就制定了编码规范

mysql中utf8和utf8mb4区别

两盒软妹~` 提交于 2020-01-22 07:56:32
MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。好在utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。当然,为了节省空间,一般情况下使用utf8也就够了。 二、内容描述 那上面说了既然utf8能够存下大部分中文汉字,那为什么还要使用utf8mb4呢? 原来mysql支持的 utf8 编码最大字符长度为 3 字节,如果遇到 4 字节的宽字符就会插入异常了。三个字节的 UTF-8 最大能编码的 Unicode 字符是 0xffff,也就是 Unicode 中的基本多文种平面(BMP)。也就是说,任何不在基本多文本平面的 Unicode字符,都无法使用 Mysql 的 utf8 字符集存储。包括 Emoji 表情(Emoji 是一种特殊的 Unicode 编码,常见于 ios 和 android 手机上),和很多不常用的汉字,以及任何新增的 Unicode 字符等等。 三、问题根源 最初的 UTF-8 格式使用一至六个字节,最大能编码 31 位字符。最新的 UTF-8 规范只使用一到四个字节,最大能编码21位,正好能够表示所有的 17个 Unicode 平面。 utf8 是 Mysql 中的一种字符集,只支持最长三个字节的 UTF-8字符,也就是 Unicode

MarialDB 建库设置中文字符

对着背影说爱祢 提交于 2020-01-22 03:30:40
CREATE DATABASE newdatabasename CHARACTER SET = utf8 COLLATE = utf8_general_ci; show variables like "character_set_%" #查看默认编码 set character_set_database=utf8; #修改编码 show variables like "collation_%"; #查看连接编码 #修改连接层编码 SET NAMES 'utf8'; /* 它相当于下面的三句指令: SET character_set_client = utf8; SET character_set_results = utf8; SET character_set_connection = utf8; ALTER database databasename character set utf8; #修改数据库编码 来源: CSDN 作者: sharkandshark 链接: https://blog.csdn.net/sharkandshark/article/details/104060674