精华内容
下载资源
问答
  • 最近用到了etcd的一个kv.proto生成的...ASCII/Unicode 编码ASCII是一开始美国人自己玩电脑的时候用的,英文又比较少,所以ASCII整体设计特别简单,一个字节没用完就囊括了所有要用的字符。但是后来欧洲人和中国人也...

    最近用到了etcd的一个kv.proto生成的mvccpb.KeyValue结构体,里面的Value是[]byte类型的,可是用string()始终不能完美地打印在控制台上,因此顺便总结了一下字符编解码相关知识点。

    ASCII/Unicode 编码

    ASCII是一开始美国人自己玩电脑的时候用的,英文又比较少,所以ASCII整体设计特别简单,一个字节没用完就囊括了所有要用的字符。但是后来欧洲人和中国人也想玩计算机,这个ASCII实在不够用,于是又自己捣鼓起了ISO,GBK。因为欧洲人和中国人玩的时候,也要兼容ASCII(毕竟那些字符自己也用得上),所以前127号没变。但是128-256号的变化就大了,尤其是欧洲国家,同一个位置代表不同的字符,严重阻碍了交流。
    后来互联网出现,统一字符集是大势所趋,于是有人牵头弄了个Unicode,势必要囊括所有你能想得到的字符。Unicode提供的是一个映射表,字符-》Unicode Point。比如U+0639表示阿拉伯字母Ain,U+0041表示英语的大写字母A,U+4E25表示汉字严。这个相当于一个统一规范,大家都别争了,统一按这个标准来。

    Utf-8


    但是这个U+开头的代码,并没有实际规定计算机的存储格式。换句话说,Unicode提供的是抽象编码,不是计算机实际存储的格式。于是Utf-8就出现了。这是一种变字节(1-4)的编码格式,可以根据Unicode编码的位置,调整分配的字节数量。比如1,你不用分配4个字节,只用1个就够了。这种比较人性化,减少了文本的体积。
    Utf-8 计算的过程:
    1. 对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的。
    2. 对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。

    80c07dfb80624b3c12e66aec9254799f.png


    实际例子:
    严的 Unicode 是4E25(100111000100101),根据上表,可以发现4E25处在第三行的范围内(0000 0800 - 0000 FFFF),因此严的 UTF-8 编码需要三个字节,即格式是1110xxxx 10xxxxxx 10xxxxxx。然后,从严的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。这样就得到了,严的 UTF-8 编码是11100100 10111000 10100101,转换成十六进制就是E4B8A5。

    Go的字符串表示

    计算机语言中,字符串一般都是""或者''来表示。但是它们的底层存储却各不相同。Go底层默认存储字符串的格式是[]byte字符数组,而byte又是uint8的别名。
    举个例子,那个我始终打印不出来的[]byte,底层数组是这个样子。
    (Printf占位符为%v)

    []byte{255,0,0,0,20,109,97,115,116,101,114,58,49,54,48,48,48,238,184,44 ,12 ,55 ,147 ,137 ,251 ,80 ,66 ,85 ,70 ,10 ,24 ,10 ,12 ,49 ,48 ,46 ,57 ,49 ,46 ,52 ,52 ,46 ,49 ,50 ,50 ,16 ,148 ,125 ,24,211,141,170,170,182,46,16,0,24,3}
    


    你也可以用x来表示(调整Printf占位符为%#v)

    []byte{0xff, 0x0, 0x0, 0x0, 0x14, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x3a, 0x31, 0x36, 0x30, 0x30, 0x30, 0x1d, 0xfa, 0x16, 0x31, 0x5b, 0x7c, 0x3f, 0x4e, 0x50, 0x42, 0x55, 0x46, 0xa, 0x18, 0xa, 0xc, 0x31, 0x30, 0x2e, 0x39, 0x31, 0x2e, 0x34, 0x34, 0x2e, 0x31, 0x32, 0x32, 0x10, 0x94, 0x7d, 0x18, 0xb6, 0xcb, 0xa5, 0xb1, 0xb6, 0x2e, 0x10, 0x0, 0x18, 0x3}
    


    那么Go尝试把它打印成一个String的时候,就会按照之前说utf8的规则来解释这些字符(Go默认Utf8)。根据每个字符的二进制表示,来看是读一个字节还是2个,3个甚至4个字节,从而把这些字符翻译成对应的字符串。但是不幸的是,我依然没能破译,接下来可能要去源码里去读一下是怎么编码的。

    参考:

    http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html

    展开全文
  • 文章目录一、存储编码简介二、范围三、为何要增加utf8mb4编码 一、存储编码简介 GBK编码专门用来解决中文编码的,是双字节的。不论中英文都是双字节的。 UTF-8编码中,一个英文字符占用一个字节的存储空间,一...


    一、存储编码简介

    1. GBK编码专门用来解决中文编码的,是双字节的。不论中英文都是双字节的。

    2. UTF-8编码中,一个英文字符占用一个字节的存储空间,一个中文(含繁体)占用三个字节的存储空间。

    3. UTF-8mb4支持4个字节的存储,如emoji表情。

    4. ASCII编码中,一个英文字母(不分大小写)占用一个字节的空间,一个中文汉字占用两个字节的空间。一个二进制的数字序列,在计算机中作为一个数字单元存储时,一般为8位二进制数,换算为十进制。最小值0,最大值255。

    5. Unicode编码中,一个英文占用两个字节的存储空间,一个中文(含繁体)占用两个字节的存储空间。

    6. UTF-16编码中,一个英文字母字符或一个汉字字符存储都需要占用2个字节的存储空间(Unicode扩展区的一些汉字存储需要4个字节)。

    7. UTF-32编码中,世界上任何字符的存储都需要占用4个字节的存储空间。

    二、范围

    (1)、GBK包含全部中文字符;
    (2)、 UTF-8则包含全世界所有国家需要用到的字符。
    (3)、utf8mb4专门用来兼容四字节的unicode。utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。

    三、为何要增加utf8mb4编码

    MySQL在5.5.3版本以后增加了utf8mb4编码,其中mb4是most bytes 4的含义,用来兼容四个字节的Unicode(万国码)。utf8mb4是utf8的一个扩展。

    **那上面说了既然utf8能够存下大部分中文汉字,那为什么还要使用utf8mb4呢? **

    原来mysql支持的 utf8 编码最大字符长度为 3 字节,如果遇到 4 字节的宽字符就会插入异常了。三个字节的 UTF-8 最大能编码的 Unicode 字符是 0xffff,也就是 Unicode 中的基本多文种平面(BMP)。也就是说,任何不在基本多文本平面的 Unicode字符,都无法使用 Mysql 的 utf8 字符集存储。包括 Emoji 表情(Emoji 是一种特殊的 Unicode 编码,常见于 ios 和 android 手机上),和很多不常用的汉字,以及任何新增的 Unicode 字符等等。

    展开全文
  • UTF8编码

    2015-01-24 17:33:40
    UTF8编码:一个英文字母“a” 和 一个汉字 “好”,编码后占用的空间大小就不样了,前者是一个字节,后者是三个字节! UTF8编码的原理: 因为一个字母还有一些键盘上的符号加起来只用二进制七位就可以...
    Unicode的编码:一个英文字母 “a” 和 一个汉字 “,编码后都是占用的空间大小是一样的,都是两个字节!

    UTF8编码:一个英文字母“a” 和 一个汉字 “,编码后占用的空间大小就不样了,前者是一个字节,后者是三个字节!

    UTF8编码的原理:

    因为一个字母还有一些键盘上的符号加起来只用二进制七位就可以表示出来,而一个字节就是八位,所以UTF8就用一个字节来表式字母和一些键盘上的符号。然而当我们拿到被编码后的一个字节后怎么知道它的组成?它有可能是英文字母的一个字节,也有可能是汉字的三个字节中的一个字节!所以,UTF8是有标志位的!

      当要表示的内容是 7位 的时候就用一个字节:0*******   第一个0为标志位,剩下的空间正好可以表示ASCII 0127 的内容。

      当要表示的内容在 8 到 11 位的时候就用两个字节:110***** 10******   第一个字节的110和第二个字节的10为标志位。

      当要表示的内容在 12 到 16 位的时候就用三个字节:1110***** 10****** 10******   和上面一样,第一个字节的1110和第二、三个字节的10都是标志位,剩下的空间正好可以表示汉字。

      以此类推:
            四个字节:11110**** 10****** 10****** 10****** 
      五个字节:111110*** 10****** 10****** 10****** 10****** 
      六个字节:1111110** 10****** 10****** 10****** 10****** 10****** 
      .............................................
           ..............................................

    明白了没有?
    编码的方法是从低位到高位

    现在就让我们来看看实例吧!

     黄色为标志位
    其它着色为了显示其,编码后的位置

    Unicode十六进制

    Unicode二进制

    UTF8二进制

    UTF8十六进制

    UTF8字节数

    B

    00001011

    00001010

    B

    1

    9D

    00010011101

    11000010 10011101

    C2 9D

    2

    A89E

    10101000 10011110

    11101010 10100010 10011110

    EA A2 9E


    展开全文
  • 英文单词的统计可以直接用php原生的函数str_word_count来进行统计。但这个函数对于中文汉字显得无能为力,无法...汉字编码参考Unicode编码表和GB2312区位码、编码表与编码规则。对于GB2312编码的字符采用以下函数:...

    英文单词的统计可以直接用php原生的函数str_word_count来进行统计。但这个函数对于中文汉字显得无能为力,无法准确统计到汉字个数。

    解决办法是根据汉字的编码规则,自己来实现中文汉字数统计和中英文单词数统计。汉字编码参考Unicode编码表和GB2312区位码、编码表与编码规则。

    对于GB2312编码的字符采用以下函数:<?php

    define( "GB2312_CHINESE_PATTERN", "/[\xb0-\xfe][\xa0-\xfe]/" );

    define( "GB2312_SYMBOL_PATTERN", "/[\xa1-\xa3][\xa0-\xfe]/" );

    // count only chinese words

    function str_gb2312_chinese_word_count($str = ""){

    $str = preg_replace(GB2312_SYMBOL_PATTERN, "", $str);

    return preg_match_all(GB2312_CHINESE_PATTERN, $str, $arr);

    }

    // count both chinese and english

    function str_gb2312_mix_word_count($str = ""){

    $str = preg_replace(GB2312_SYMBOL_PATTERN, "", $str);

    return str_gb2312_chinese_word_count($str) + str_word_count(preg_replace(GB2312_CHINESE_PATTERN, "", $str));

    }

    ?>

    对于UTF-8编码的字符采用以下函数:

    define( "UTF8_CHINESE_PATTERN", "/[\x{4e00}-\x{9fff}\x{f900}-\x{faff}]/u" );

    define( "UTF8_SYMBOL_PATTERN", "/[\x{ff00}-\x{ffef}\x{2000}-\x{206F}]/u" );

    // count only chinese words

    function str_utf8_chinese_word_count($str = ""){

    $str = preg_replace(UTF8_SYMBOL_PATTERN, "", $str);

    return preg_match_all(UTF8_CHINESE_PATTERN, $str, $arr);

    }

    // count both chinese and english

    function str_utf8_mix_word_count($str = ""){

    $str = preg_replace(UTF8_SYMBOL_PATTERN, "", $str);

    return str_utf8_chinese_word_count($str) + str_word_count(preg_replace(UTF8_CHINESE_PATTERN, "", $str));

    }?>

    以上两种代码功能相同,只是根据不同的字符编码做了不同的实现,实际使用视页面编码对应选择。都有两个函数,一个只统计中文汉字数,另一个统计中英文单词数(中文汉字数+英文单词数),中英文符号都不计入数字统计。

    特别说明:如不先去除中文标点会导致统计出错,如GB2312编码下":‘"两个中文标点的字节表示为a3baa1ae,中间部分baa1正好对应GB2312编码地"骸"字,会被统计为一个中文汉字,导致计数错误。

    函数使用可参考以下测试页面:

    define( "GB2312_CHINESE_PATTERN", "/[\xb0-\xfe][\xa0-\xfe]/" );

    define( "GB2312_SYMBOL_PATTERN", "/[\xa1-\xa3][\xa0-\xfe]/" );

    // count only chinese words

    function str_gb2312_chinese_word_count($str = ""){

    $str = preg_replace(GB2312_SYMBOL_PATTERN, "", $str);

    return preg_match_all(GB2312_CHINESE_PATTERN, $str, $textrr);

    }

    // count both chinese and english

    function str_gb2312_mix_word_count($str = ""){

    $str = preg_replace(GB2312_SYMBOL_PATTERN, "", $str);

    return str_gb2312_chinese_word_count($str) + str_word_count(preg_replace(GB2312_CHINESE_PATTERN, "", $str));

    }

    define( "UTF8_CHINESE_PATTERN", "/[\x{4e00}-\x{9fff}\x{f900}-\x{faff}]/u" );

    define( "UTF8_SYMBOL_PATTERN", "/[\x{ff00}-\x{ffef}\x{2000}-\x{206F}]/u" );

    // count only chinese words

    function str_utf8_chinese_word_count($str = ""){

    $str = preg_replace(UTF8_SYMBOL_PATTERN, "", $str);

    return preg_match_all(UTF8_CHINESE_PATTERN, $str, $textrr);

    }

    // count both chinese and english

    function str_utf8_mix_word_count($str = ""){

    $str = preg_replace(UTF8_SYMBOL_PATTERN, "", $str);

    return str_utf8_chinese_word_count($str) + str_word_count(preg_replace(UTF8_CHINESE_PATTERN, "", $str));

    }

    // convert a string to hex-coding form

    function binhex($str) {

    $hex = "";

    $i = 0;

    do {

    $hex .= sprintf("%02x", ord($str{$i}));

    $i++;

    } while ($i < strlen($str));

    return $hex;

    }

    $text = $_REQUEST["text"] ? $_REQUEST["text"] : "";

    echo "Text: " . $text . "
    ";

    echo "Hex : " . ($text ? binhex($text) : "") . "
    ";

    // use one of the following two lines according to the page encoding

    echo "Word count: " . str_gb2312_mix_word_count($text);

    // echo "Word count: " . str_utf8_mix_word_count($text);

    ?>

    本博客所有文章如无特别注明均为原创。

    展开全文
  • 和该主题相关的类似或不同表达 FSO写UTF-8编码文件 FSO怎么才能生成utf-8编码的文件 FSO生成的文件默认是什么编码格式 如何转换成UTF-8编码 FSO生成静态网页的问题 ASP中用FSO生成文件代码如下 代码如下: function ...
  • 当我上第一节计算机课的时候,我的电脑老师跟我说,一个英文字符是1个字节,一个中文是2个字节。这么多年来,我对此一直坚信不移,相信很多人也是这么觉得的,但是,真实情况下是这么一回事么?要了解这个问题,我们...
  • ASCII码:只包含英文,数字,特殊符号的编码,一个...utf-8编码:最短用8位(bit)1字节(byte)表示,用8位(bit)表示 英文字符,用16位(bit)2字 节(byte)表示 欧洲语言字符,用24位(bit)3字节(byte)...
  • java编码表GBK、GB2312与UTF-8的区别

    千次阅读 2014-08-08 10:56:30
    GBK、GB2312与UTF-8的区别? UTF-8:Unicode Transformation Format-8bit,允许含BOM,但通常不含BOM。 是用以解决国际上字符的一种多字节编码,它对英文...UTF-8编码的文字可以在各国支持UTF8字符集的浏览器上
  • 2. 然后去判断一下每一个byte的前面几个bit, 看下面的, 1个byte的字符, 就是英文跟标点, 它的第1个bit是0; 3. 重点是3个bytes的字符, 就是汉字, 或者说CJK, 它的第1个byte的前面4个bit, 是1110, 那么我们可以...
  • 最早最通用的单字节编码系统,因为发明时间早,所以ASCII编码表的设计较为简单。 结构 ASCII表是单字节字符表,此表中一个(英文)字符用一个字节表示 在ASCII中从00000000(第0个)~00011111(第31个)前32被...
  • ASCII、Unicode和UTF-8编码的区别 ...UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6字节,英文字符是1个字节,汉字通常是3个字节,生僻字符是4-6个字节 常用编码介绍一览: 编码 作用...
  • 编码大小支持语言ASCII1个字节英文Unicode2个字节(生僻字4个)所有语言UTF-81-6个字节,英文字母1个字节,汉字3个字节,生僻字4-6个字节所有语言具体解释:最早只有127个字母被编码到计算机里,也就是大小写英文...
  • python 之 utf-8编码的秘密

    千次阅读 2015-08-21 16:40:59
    python3的默认编码方案是utf-8编码,看了些资料,来做总结。 要说utf-8,就要说说unicode,要说unicode,就要说ASCII,我们还是慢慢来。 1.ASCII  ASCII编码最初是由老美搞出来的,满足了英文在计算机中的的...
  • 最早只有127个字母被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母A的编码是65,小写字母z的编码是122。 但是要处理中文显然一个字节是不够的,至少需要两个字节...
  • Python Unicode、ASCII、UTF-8编码对比 对比 英文:Hello ------> 01011100111(ascii码对照) ​ 8位表示 2^8 = 256 万国码:Unicode ​ H------> 00111001 X 4 = 32 位 2^32 ​ 中------>… ha ...
  • 什么是Unicode?Unicode,中文又称万国码、国际码,是计算机科学领域里的一项业界标准。它对世界上大部分的文字系统进行了整理... 计算机是在美国发明的,理所当然的使用的是英文字母,构成英语的不过就是26个拉丁字...
  • 由于计算机是美国人发明的,因此,最早只有127个字符被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母A的编码是65,小写字母z的编码是122。但是要处理中文显然一...
  • C语言实现中文编码转换一、GBK、UNICODE、UTF8之间编码的关系二、UNICODE、UTF8之间转化实现三、UNICODE、GBK之间的转化四、编码对照五、完整代码 一、GBK、UNICODE、UTF8之间编码的关系 GBK:GBK全名为汉字内码...
  • 编码分类(英文) 起始 终止 起始 终止 (个) 0 127 0000 007F 128 C0控制符及基本拉丁文 C0 Control and Basic Latin 128 255 0080 00FF 128 C1控制符及拉丁文补充-1 C1 Control and Latin 1 Supplement ...
  • 创建数据的时候:如果是该字段是存放中文的话,则需要将“整理”设置为:“utf8_general_ci”, 如果该字段是存放英文或数字的话,默认就可以了。 相应的SQL语句,例如: CREATE TABLE `test` ( `id` INT NOT ...
  • 最早的计算机是由美国人发明的,最早的编码系统就是ASCII码,通过八位二进制(一个字节)表示128个字符abcAbc+- 等等。。。  问题来了:那么ASCII码只能表示英文字符和些特殊符号,那其他非英语国家...这套编码表...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 414
精华内容 165
关键字:

utf8英文编码表