好,那接下來我們來介紹一下這個 python 處理中文的一些做法,那
python 事實上有相當不錯的一個中文的這個資源,
那這個在早期的話呢,這個處理中文一向是一個很頭痛的一個問題,
那所以有各式各樣的這個美美嘎嘎,那現在的話 這個 python
第三版,尤其是 python 的第三版 的話呢,這個中文處理我覺得是相當的不錯,所以
我們來介紹一下這個一些這個中文的一些,先從中文的這個
處理的一些歷史說起,那我想就是說之前也有提到
就是說呢這個電腦,我們現代的這個電腦是美國人商業化
非常成功的一個科技產品,那 在那個年代,1960
年的時候呢,就是大概一開始電腦都只能處理英文, 剛好是拼音文字也比較方便,它內部的編碼是
ASCII 的這個編碼,之前我們稍微介紹了一下, 那但是呢,ASCII
編碼它事實上有一個蠻大的缺點,那這個缺點就是說它最多只能處理 255
種的這個字元, 那我們前面有說就是,它前面一半都是控制字元,只有後半部是可以
讓你這個存放看得見的,比如說 abcd 這種東西,
那這個很明顯是不夠的,比如說中文常用字有三千字以上, 對不對?depends
on 你怎麼定義什麼叫常用字,可能還更多,那還有日文跟韓文啊,那日文跟韓文
也是有很多很多的這個字在裡面,那
那怎麼辦呢?那所以就是說呢,一個簡單的做法就是說呢 早期的這個
ASCII 碼它是用一個 character,就是 8 個 bit,8
個 0 跟 1 組成的, 那如果說你把這個東西擴大一倍,就是成兩個 character,就是
16 個 bits,所以 總共可以有 2 的 16 次方減
1 那麼多個位置 組合,可以存放不同的字元,那大概是足夠的,
大概是足夠的,所以這也是早期的做法,早期的做法的確是這個樣子。
那所以這種做法叫做 double bytes, 就是說你是用兩個 bytes
來存放一個字元, 那在早期的時候,就是說呢,一開始這個資訊
電腦這個東西開始進入這個亞洲的市場,那台灣當然是
也是很熱衷於這個東西,對不對? 那時候呢台灣跟香港都是使用這個繁體中文嘛,那繁體中文它
那時候是並沒有一個統一的編碼,所以各家 就是說這些軟體廠商各家自己做,做一套,那
那時候早期的話因為大陸在鐵幕裡面基本上他們是沒有在這個
整個資訊化的潮流裡面,所以我們就先撇開它不談,那日本也有漢字, 那這個所以在 1983
年的時候,就是說呢 有一個單位叫做資訊工業策進會,那它就是出來整合這個
各家的這種不同的中文的編碼,那當然整合是對大家都有好處,因為你一旦整合之後呢,
不同的軟體之間就可以互相流通了,這個軟體產生的這個檔案另外一個軟體就可以
讀啊,這是很基本的事情,對不對?但是你如果編碼不一樣的話,這個事情就變得很困難,
或者是說,比如說我如果是一個做軟體的,我這個 我做了這套軟體,我如果要在不同的這個
不同的這個中文的體系下面執行的話,我就要做不同的
修改,那也是很麻煩,那如果你有統一的編碼的話,那就會很方便,對不對?所以這個東西是對
事實上是對大家都好的,對大家都好的,所以那時候就是有人出來
整合,那時候市場上有五大軟體廠商,那這五大軟體廠商呢 就是共同制定了一個這個統一的一個編碼的方式,
那因為它是五個人,五家廠商整合起來的,所以就叫做 big-5,大五碼。
那這個大五碼整合成功之後,
大家這個整個軟體就變得更好推,更好推,大家互相可以獲利嘛,
互相可以這個互相整合,那所以大五碼就變成是中文世界的 一開始的時候的業界標準,一開始的時候的業界標準,就是說呢
大五碼事實上存在在中文的軟體世界里面很長一段時間, 那這個大五碼就是用所謂的
two bytes 就是兩個 bytes,就是 16 個 0 跟 1
組合的這種做法, 那時候就是說台灣跟香港基本上都是用大五碼,這是
從八零年代之後,一直到最近,最近這個有新的編碼 起來之後才取代掉大五碼,那大陸就是早期是用所謂的
GB2312 的這種編碼。
那 事實上,這個是我們剛剛講的是八零年代發生在 台灣跟香港的事情,但是事實上這個
ASCII 沒辦法處理這個,這個,只能處理英文這件事情事實上
不止在亞洲地區有問題,它事實上在全世界各地都有問題,因為像歐洲的話它字母也不是只有 26
個啊, 對不對?不同的語言它事實上字母的數目也不大一樣,長相也不大一樣,對不對?所以你硬是-
要這樣套 也不是個辦法,所以就是說呢,這個後來就有人就是想要來
處理這個事情,因為這是全世界性的問題,必須要有一套新的更好的統一的標準, 所以這時候就有一個組織叫做
unicode,那這個組織呢 就是想要來這個處理這個事情,所以它就是要來
發展一個全世界統一的編碼,它的想法就是要把全世界所有的文字都納入一個統一的編碼體- 系裡面,
那這當然是一件很好的事情, 那所以他們就開始做,他們從 1992
年左右就是開始把一些 比如說中日韓的這些字體啊全部都收錄進去,對不對?那這個東西呢就是
慢慢地就是大家也都能接受了, 那整個這個大部分的作業系統,現在其實都是支援
unicode,那比如說你現在我們會用到的 Windows 啊, Linux 啊,Mac
啊,Android 啊,IPhone 啊,這裡面其實都是 unicode,所以事實上現在大家有一個整合的一個標準。
那 unicode 它裡面事實上有各種不同的編碼,常見的大概有兩種,一種叫做
utf-8, 還有一種叫做 utf-16,那 utf-8
的意思就是說呢它的這個編碼 的這個每個字的長度可能是一個 byte,兩個
byte,或三個 byte, 那它的想法就是說最常用的字是一個比較短的,一個
byte,比較不常用的是兩個 byte, 然後呢最不常用的是三個 byte,它的想法是這樣。
那 utf-16 的話呢就是說呢,這是一個 byte 或兩個 byte,
基本上目前除了微軟的 Windows 之外,大家都是用
utf-8,那只有微軟是用 utf-16, 所以就是有些時候你會發現在
Windows 上面用起來怪怪的,有些時候 Windows 的行為有點奇怪,那是因為它們的這個
編碼跟別人不大一樣,雖然都是 unicode,那撇開這個不談,那這個
基本上如果是給你選的話,你自己寫程式的話, 我的建議是你用
utf-8,不要去用 utf-16 啊,什麼
mongodb,什麼 big 5,不要,現在這年頭不要用 big 5,就是用 utf-8。
那 python
本身就是 它內部就是 unicode,內部就是 unicode,而且它就是直接就是
依照 unicode 標準下去實作的,所以就是說呢
python 在處理中文的部分呢,事實上是相當不錯的,
那所以就是說呢, 它的
python,你要在 python 裡面使用中文的做法,
其實大概有幾個步驟啦,第一個步驟就是說呢,你在寫程式的時候呢, 你必須要在第一行或者第二行
放進這個東西,就是它是個 #
然後呢像這個樣子,它這邊會有個 coding,告訴你 utf-8,前面這個符號
就是底線,星號,底線,對不對?coding: utf8 -*-
這個東西呢就是告訴你的 python 的 interpreter,就是說呢你這個程式呢
使用的是 utf-8 編碼,那這個是有些時候呢
如果你是在 linux 或者其它環境的話,第一行放的是你的 python 的位置,python 直譯器的位置,
那這時候你這個,你可以把編碼的資訊放在第二行,放在第一行或第二行都可以正確執行,這- 是沒有問題的。
那 這個另外呢,如果說你用的是
notepad++ 的話呢, 還有一個你必須要非常注意的事情,就是說
你的 notepad++ 是不是使用預設 utf-8
編碼,那 請你在往下走之前先去 check 一下,你把這個 video
暫停,然後 回去 check 一下你的這個 notepad++ 的設定,在
settings preference 然後呢,選這個 new document。
然後呢,你看一下,如果你是在 Windows 裡面的話,你應該是選 Windows,對不對?
這邊你要選 UTF-8,然後要勾這個 Apply to opened ANSI files。
好,如果是這樣子的話呢,你後面的東西就可以正確執行,如果不是的話,你有可能後面沒有- 辦法正確執行。
好,那原因是什麼?那原因是如果你不做這個事情的話 你如果把這一行,把這幾行的這個
code 你把它 paste 你的這個 lopet ++ 裡面,然後設置
.py 然後你要執行它的話呢,你有可能會看到類似這樣的信息,它說呢
UTF-8 codec cannot decode 什麼什麼什麼東西的。
那這個基本上,這個是最後的症狀,那原因就是因為 你的這個,你雖然這邊告訴它是
UTF-8 的編碼,但是 你的檔案本身不是 UTF-8 編碼,好。
所以這兩個東西要 match 才可以。
就是說你宣稱你是用 UTF-8 編碼,但是你的檔案本身也要是 UTF-8 編碼,這東西才會 work。
好,你不能掛羊頭賣狗肉,掛羊頭賣狗肉不會 work。
那這個要注意這個事情最簡單的做法就是是你把預設的編碼 直接把它改成 UTF-8,就不會有問題了。
那如果不是,你如果不想這樣做的話,你自己的堅持,你不想這樣做,那也可以,好。
那但是就是說,你必須要就是自己要確認一下,就去 file encoding 這邊
然後把這個檔案 covert 成 UTF-8,這樣你就會 work 了。
那如果你檔案不是 UTF-8 編碼的話,自己做一下這個處理,好。
然後把這個編碼弄成適當的編碼,那這時候你去執行機會看到中文測試四個字,就表示說- 你的這個
你的環境是對的。
那這個東西是在做中文處理要特別小心的一個 地方,特別小心的一個地方,那剩下的大概就是
是就是其他的部分其實都跟這個英文的 這個文字沒什麼太大的區別,好。
那所以呢,我們前面呢,你會看到說前面有這個 message 等於這個
一個小寫的 u 然後引號中文測試,那這是怎麼回事?
那這個前面加上 u 表示說這是一個 Unicode 的字串,那
然後請 Python 用 Unicode 的方式去處理它,你說,欸 Python 不是內建就是 Unicode
嘛,我之前寫中文的時候怎麼沒有做這個事情? 那這東西事實上是有一些歷史的。
就是說 因為早期在 Python 2 版的時候呢,它的這個 Unicode 的資源沒有那麼好。
所以呢,你如果是它預設它是假設你是比如說是類似像它是 ASCII
的編碼之類的,所以你必須要做一些這個特殊的這個過程、 特殊的處理才有辦法
去處理中文,但是 Python 3 之後呢,它這些東西都幫你處理掉了。
你不加 u 也是可以的,加 u 跟不加 u 都可以,都會 work。
所以我們後面就不會再加 u 了,所以就是說呢,這也是 Python 3
版跟 Python 2 版的 對我們來說啦,對亞洲區域的
人來說哦,我覺得一個很大的好處,就是它對這個 Unicode
或者對中文,亞洲語言的資源,算是比較完善,相對比較完善。
那所以你如果需要處理中文的話,建議你就不要用 Python 2 版就直接用 3 版。
那現在用 3 版的人越來越多了,早期就是說還有一些考慮就是說就是
3 版用的人 不是那麼多,但是現在看起來,就是 3 版使用的大概 人數也相當多了,而且這是未來的趨勢嘛。
而且你要處理中文的話呢 你用 2 版你會頭痛,3 版就比較不會那麼頭痛,所以建議你還是用 3 版吧。
那我們來看一下這個例子哦,就是說呢比如說你如果有一個 message 前面加
u 寫中文測試,然後 print 這個 message,問它說這個長度是多少?
然後呢,跟不加 u,message 2 是沒有加 u 的,好,然後呢,看看這有沒有差別。
結果事實上是一模一樣的,長度都是 4,你說這個長度是 4,當然長度是 4 啦,因為這中文是有 4 個字嘛。
中文測試四個字,對不對,四個字。
那但是就是說早期 好,在 Python 2 版的時候,你如果不加 u 的話,你問它長度是多少,它會告訴你
是 4 乘以 3 等於 12,為什麼呢?因為它是一個 這個字它是 3 個 byte 之類的。
那現在都處理掉這個問題了,它回答長度是四是比較合理的,因為就是對我們來說是 4
個 字母嘛,四個中文字嘛。
當然長度是 4。
那 所以這大概是一些這個說明,好 一些說明。
那我們現在就是,我們這個課程就是使用我們 3 版的,所以就是中文上面應該沒什麼問題。