1. 程式人生 > >徹底搞清楚unicode和utf8編碼

徹底搞清楚unicode和utf8編碼

徹底搞清楚unicode和utf8編碼

1、計算機只能處理數字(0和1),文字轉換為數字才能處理。計算機中8個bit作為一個位元組,所以一個位元組能表示最大的數字就是255

2、計算機是美國人發明的,所以一個位元組可以表示所有字元了,所以ASCII(一個位元組)編碼就成為美國人的標準編碼

3、但是ASCII處理中文明顯是不夠的,中文不止255個漢字,所以中國製定了GB2312編碼,用兩個位元組表示一個漢字。GB2312還把ASCII包含進去了。同理,日文,韓文等上百個國家為了解決這個問題就 都發展了一套位元組的編碼,標準就越來越多,如果出現多種語言混合顯示就一定會出現亂碼

4、於是,unicode出現了,將所有語言統一到一套編碼裡

5、看一下ASCII和unicode編碼:

    (1)字母A用ASCII編碼十進位制是65,二進位制是0100 0001

    (2)漢字“中”已經超過了ASCII編碼的範圍,用unicode編碼是2013,二進位制是01001110 00101101

    (3)A用unicode編碼只需要在前面補0,二進位制是00000000 0100 0001

6、亂碼問題解決了,但是如果內容全是英文,unicode編碼比ASCII需要多一倍的儲存空間,同時如果傳輸傳輸需要多一倍的傳輸。

7、所以出現了可變長的編碼"utf-8",把英文變長一個位元組,漢字3個位元組。特別生僻的變成4-6個位元組,如果傳輸大量的英文,utf8作用就很明顯了



windows:

    python2:

        >>> s = "abc"
        >>> su = u"abc"
        >>> s.encode("utf8")
        'abc'
        >>> su.encode("utf8")

        'abc'

        >>> s = "我用python"
        >>> su = u"我用python"
        >>> s.decode("gb2312").encode("utf-8")

        '\xe6\x88\x91\xe7\x94\xa8python'

        >>> su.encode("utf-8")

        '\xe6\x88\x91\xe7\x94\xa8python'

    python3:

        >>> s = "我用python"
        >>> s.encode("utf-8")
        b'\xe6\x88\x91\xe7\x94\xa8python'