`

字符编码 - utf-8的中文是一个汉字占三个字节长度吗?

 
阅读更多
这是个好问题,可以当作一个笔试题。先从字符编码讲起。

1、美国人首先对其英文字符进行了编码,也就是最早的ascii码,用一个字节的低7位来表示英文的128个字符,高1位统一为0;

2、后来欧洲人发现尼玛你这128位哪够用,比如我高贵的法国人字母上面的还有注音符,这个怎么区分,得,把高1位编进来吧,这样欧洲普遍使用一个全字节进行编码,最多可表示256位。欧美人就是喜欢直来直去,字符少,编码用得位数少;

3、但是即使位数少,不同国家地区用不同的字符编码,虽然0--127表示的符号是一样的,但是128--255这一段的解释完全乱套了,即使2进制完全一样,表示的字符完全不一样,比如135在法语,希伯来语,俄语编码中完全是不同的符号;

4、更麻烦的是,尼玛这电脑高科技传到中国后,中国人发现我们有10万多个汉字,你们欧美这256字塞牙缝都不够。于是就发明了GB2312这些汉字编码,典型的用2个字节来表示绝大部分的常用汉字,最多可以表示65536个汉字字符,这样就不难理解有些汉字你在新华字典里查得到,但是电脑上如果不处理一下你是显示不出来的了吧。

5、这下各用各的字符集编码,这世界咋统一?俄国人发封email给中国人,两边字符集编码不同,尼玛显示都是乱码啊。为了统一,于是就发明了unicode,将世界上所有的符号都纳入其中,每一个符号都给予一个独一无二的编码,现在unicode可以容纳100多万个符号,每个符号的编码都不一样,这下可统一了,所有语言都可以互通,一个网页页面里可以同时显示各国文字。

6、然而,unicode虽然统一了全世界字符的二进制编码,但没有规定如何存储啊,亲。x86和amd体系结构的电脑小端序和大端序都分不清,别提计算机如何识别到底是unicode还是acsii了。如果Unicode统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是0,文本文件的大小会因此大出二三倍,这对于存储来说是极大的浪费。这样导致一个后果:出现了Unicode的多种存储方式。

7、互联网的兴起,网页上要显示各种字符,必须统一啊,亲。utf-8就是Unicode最重要的实现方式之一。另外还有utf-16、utf-32等。UTF-8不是固定字长编码的,而是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。这是种比较巧妙的设计,如果一个字节的第一位是0,则这个字节单独就是一个字符;如果第一位是1,则连续有多少个1,就表示当前字符占用多少个字节。

8、注意unicode的字符编码和utf-8的存储编码表示是不同的,例如"严"字的Unicode码是4E25,UTF-8编码是E4B8A5,这个7里面解释了的,UTF-8编码不仅考虑了编码,还考虑了存储,E4B8A5是在存储识别编码的基础上塞进了4E25。

9、UTF-8 使用一至四个字节为每个字符编码。128 个 ASCII 字符(Unicode 范围由 U+0000 至 U+007F)只需一个字节,带有变音符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文及马尔代夫语(Unicode 范围由 U+0080 至 U+07FF)需要二个字节,其他基本多文种平面(BMP)中的字符(CJK属于此类-Qieqie注)使用三个字节,其他 Unicode 辅助平面的字符使用四字节编码。 

10、最后,要回答你的问题,常规来看,中文汉字在utf-8中到底占几个字节,一般是3个字节,最常见的编码方式是1110xxxx 10xxxxxx 10xxxxxx。


from:
https://zhidao.baidu.com/question/1047887004693001899.html
分享到:
评论

相关推荐

    自动计算出多种编码字符串长度

    例如,一个汉字在UTF-8中通常占3个字节。 "CharCounter.exe"这个程序显然就是用来帮助用户计算上述三种编码方式下字符串的长度。通过这个工具,用户可以快速准确地获取ansi、unicode和utf8编码字符串的字节数,这...

    PHP程序设计-3期(KC016) 2.8.1字符串长度习题.doc

    但在UTF-8编码中,中文字符通常占用三个或四个字节,因此对于包含中文字符的字符串,`strlen()`返回的不是实际的字符个数。例如,题目中的第一题: ```php <?php $str = "Hello,China"; echo strlen($str); ?> ...

    utf8转换为gbk格式

    UTF-8的最大特点是其可变字节编码,一个字符可能由1到4个字节组成,根据字符的不同,字节开头的位数不同,这样设计使得UTF-8能够兼容ASCII编码,且在处理英文文本时效率较高。 GBK,全称“Great Chinese Character ...

    C++中英混合字符串截取

    在处理中文字符时,通常会用到UTF-8编码,这是一种变长的字符编码方式,一个汉字可能由1至4个字节组成。在UTF-8编码中,英文字符占1字节,而汉字占3或4字节。因此,截取字符串时,我们不能简单地按照字节数来截断,...

    网站编码详解(送给初级网站程序员)

    - **UTF-8**是一种可变长度的编码方式,对于ASCII字符集中的字符,UTF-8编码与ASCII编码完全相同。对于其他字符,UTF-8使用1至4个字节表示,具有很好的向后兼容性和国际化的支持能力。由于其高效性和广泛的兼容性,...

    C#判断字符编码的方法总结(六种方法)

    中文字符在Unicode编码中通常占两个字节,且第一个字节的高位不为0。因此,如果字节数组中存在高位非0的字节,可能存在中文字符。 6. **方法六:专用函数判断** 这个方法创建了一个专用函数,遍历字符串,检查每个...

    星霜文字代码查看器

    总之,"星霜文字代码查看器"是一个专注于字符编码查看和处理的小型实用工具,它涵盖了GBK、Unicode和UTF-8等重要编码格式,以及字符串长度计算和大小写转换等基础操作,是开发者和文本处理人员进行编码问题排查和...

    python学习笔记ing

    例如,`'中文'` 的长度为4(每个中文字符在UTF-8编码中占用3个字节,外加字符串本身占用的空间),而 `u'中文'` 的长度为2(每个字符在Unicode中占两个字节)。 #### 字符与数字的转换 - **`ord()` 和 `chr()` ...

    解决php截取中文出现乱码

    在这个例子中,`mb_substr()` 第一个参数是原始字符串 `$string`,第二个参数是从第0个位置开始截取,第三个参数是截取长度为2个字符,最后一个参数指定编码为 `"UTF-8"`。这种方法更为简洁明了,同时也避免了直接...

    php字符串截取.pdf

    - 使用`ord()`函数判断字符是否为中文(GB2312编码下中文的ASCII值范围),如果是,则跳过下一个字符,因为一个中文字符在GB2312中占两个字节。 **1.1.2 示例代码** ```php echo mysubstr('善良能够培养一个人的...

    jsp中页面间传汉字参数转码的方法.docx

    - 表单输入限制:限制用户在表单字段中输入的汉字数量,通常基于字符长度而非字节长度,因为一个汉字占两个字节。 - JS正则表达式提取汉字:编写正则表达式以提取字符串中的所有汉字,这对于文本分析或处理非常有用...

    三级嵌入式系统.doc

    嵌入式系统中常用的西文字符及其编码是 ASCII 字符集和 ASCII 码,即美国标准信息交换码,共有 128 个字符,一个字符占一个字节。我国目前广泛使用的汉字编码国家标准有 GB2312 和 GB18030。 GB18030 字符集与国际...

    php自定义中文字符串截取函数substr_for_gb2312及substr_for_utf8示例

    函数同样接收三个参数,但这里需要处理的问题是UTF-8编码的中文字符可能占用多个字节,因此不能简单地像GBK那样以字节为单位进行截取。函数通过循环遍历字符串,检查每个字符的字节大小,如果是多字节的字符(ASCII...

    截取字符串

    关于字符编码,中文字符通常使用UTF-8、GBK等多字节编码,一个汉字占用2或3个字节,而英文字符、数字和某些标点符号在这些编码下占1字节。因此,在截取时要注意字符长度与字节数的区别,以免出现乱码或截取不完全的...

    JS判断字符串长度的5个方法(区分中文和英文)

    中文汉字由两个字节表示,而英文字符通常只占一个字节。以下五个方法可以帮助你实现这个功能,确保无论中文还是英文,都能准确计算出字符串的实际长度。 **方法一**: 这个方法通过遍历字符串,检查每个字符的字符...

    mysql中如何判断当前是字符 mysql判断字段中有无汉字

    如果有汉字,由于每个汉字占三个字节,总长度将会比实际字符数大。 另一方面,`CHAR_LENGTH` 函数则是根据字符数来计算长度,无论单字节字符还是多字节字符,它都计为一个字符。因此,对于包含汉字的字符串,`CHAR_...

    Mysql varchar大小长度问题介绍

    在这个例子中,减去4是因为INT类型的c占4个字节,减去30 * 3是因为CHAR(30)占用90个字节(UTF-8编码下每个字符3字节),然后除以3(UTF-8编码每个字符3字节)。 如果VARCHAR字段的定义长度超过了上述限制,MySQL会...

    java 字符串截取的实例详解

    在 utf-8 编码下,一个汉字占三个字节,因此需要根据字节数组的长度截取子串。在 utf-8 编码下,字符串截取的实例代码如下所示: ```java private static String StringCutByUtf8(String str, int len) { byte[] bs...

    2020年《python程序设计》基础知识及程序设计598题EJ[含参考答案].pdf

    字符编码长度:GBK编码中,汉字占2个字节,英文字符占1个字节。'abc 你好'.encode('gbk') 有7个字节('abc' + '你好')。UTF-8编码中,汉字占3个字节,英文字符占1个字节。因此,'abc 你好'.encode() 占9个字节('...

Global site tag (gtag.js) - Google Analytics