0%

python string convert bytes

編碼

個人覺得這個問題和 2000 年的問題差不多,
就是以前的人為了省空間,然後沒有考慮清楚,所以留下來的爛攤子。
不過事情已經發生了我們也只能想我們該如何處理。
所以現在我們都是常常是用 utf-8 來處理我們處理的文字。
但是,就是有這個但是,就是有人會有不同的想法不同的想法不同的現實,所以我們的生活才會精彩無比。
只是不知道是被人精彩還是自己精彩。

其實現在的文字都是 unicode 的,在我小的時候還有 big5 等編碼,不過這個世界就是有很多不同的人。
而那些人是不使用 big5 的,當這兩個世界的人看到對方的編碼用自己的編碼方式看就全是亂碼啦。
例如gb2312的人用gb2312的方式看我們big5的文字,全部都是亂碼,反之已然。

不過在電腦裡看到的東西都是 bytes,而不是 unicode 也不是 big5。
所以我們就需要常常在 unicode 和 bytes 間轉換。

1
2
3
>>> teststr = 'http://tw.yahoo.com'
>>> type(teststr)
<type 'str'>

utf-8

在 python3 裡,我們可以看到 teststr_utf8_bytes 是 bytes。
不過在 python2 我們會看到不一樣的結果,他會是 str

1
2
3
>>> teststr_utf8_bytes = teststr.encode(encoding="utf-8")
>>> type(teststr_utf8_bytes)
<class 'bytes'>

decode

1
2
3
>>> teststr_string = teststr_utf8_bytes.decode()
>>> type(teststr_string)
<class 'str'>

亂碼

讓我們看看我們常常看到的混亂世界是什麼。

1
2
3
4
5
6
7
8
9
10
>>> str1 = '讓我們看看我們常常看到的混亂世界是什麼。'
>>> type(str1)
<class 'str'>
>>> str1_big5_bytes = str1.encode(encoding='big5')
>>> type(str1_big5_bytes)
<class 'bytes'>
>>> str2 = str1_big5_bytes.decode("gb2312")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'gb2312' codec can't decode byte 0xad in position 4: illegal multibyte sequence

python 和我們抱怨他無法正確處理。

總結

我們完成了unicode和bytes的遊戲了,希望大家會喜歡。