Re: [問題] 有關utf-8字串的問題
※ 引述《kanako (我是香民)》之銘言:
: 假設我有一個檔案叫test.txt,內容只有一行字:
: 中文
: 然後我用如下的碼讀入(省略之前之後的各個動作)
: string = infile.readline().decode('utf-8')
: 這樣得到的變數跟以下我手動給初值有何不同?
: string = u'中文'
: 我用sunburnt把資料加入solr時兩者都可以加入
: 但只有後者得到的結果可以下中文關鍵字搜尋到
: 請問一下各位先進我應該如何修改呢?
: 謝謝
※ 引述《kanako (我是香民)》之銘言:
: 假設我有一個檔案叫test.txt,內容只有一行字:
: 中文
: 然後我用如下的碼讀入(省略之前之後的各個動作)
: string = infile.readline().decode('utf-8')
: 這樣得到的變數跟以下我手動給初值有何不同?
: string = u'中文'
: 我用sunburnt把資料加入solr時兩者都可以加入
: 但只有後者得到的結果可以下中文關鍵字搜尋到
: 請問一下各位先進我應該如何修改呢?
: 謝謝
先回答你的問題
理論上應該要是一樣的結果
但實際上在windows下使用會有一些問題 (我也只用過windows目前)
如果你也是用windows的話 可以參考一下我的心得(適用於python2.x)
我在初學有關字串問題時 被windows下美美的idle卡很大
因為正確的觀念在美美的idle上會產生錯誤的結果
後來才在版上爬到文 整個大悟
(如果需要unicode與str的觀念我再補 當做已經會了)
先提一下標準的 再提idle下怎麼是搞的
我們寫 u"中文" 即等於 "中文".decode("python預設的編碼 一般來說是cp950")
因為只要string裡有不在ascii編碼與跳脫字元(\開頭的那些)裡的"字"
python會自動以預設的編碼轉換來顯示
加上開頭的u python會自動把"中文"用cp950去解碼成unicode
這是一般的情況
若是只寫 "中文" (沒有u)
python將會自動用cp950轉換成 '\xa4\xa4\xa4\xe5' 的string(不是unicode)
u開頭是將這種特別的字轉成unicode方便的寫法 很方便
如果windows idle下沒有問題的話orz...
在windows的command line下(黑黑的底色那個)
使用 u"中文" 會得到一般正確的結果 u'\u4e2d\u6587'
而讀入的string若是utf8格式的 '\xe4\xb8\xad\xe6\x96\x87'
再decode("utf-8")之後也會正確得出 u'\u4e2d\u6587'
但是在windows 美美的idle下
u"中文" 卻得到 u'\xa4\xa4\xa4\xe5'
這是什麼東西呢(很顯然不是正確的 因為根本沒辨法encode回去)
原因是在idle下 u"中文" 並不等於 "中文".decode("cp950")
這是idle最怪的地方
由結果推論起來 在idle下的 u"中文"
僅是把 "中文"原始編碼下的值('\xa4\xa4\xa4\xe5')
轉成unicode
變成先轉換"中文"(非常奇怪的做法)之後 再結合u
相當於轉換 u"\xa4\xa4\xa4\xe5" 因為沒有不合法的字
就直接還是 u"\xa4\xa4\xa4\xe5" 奇怪的結果...
更奇怪的是idle還可以print的出來結果...在我的電腦上長這樣--> ¤¤¤å
在command line下print不出來才是合理的
因為無法編成cp950相對應的string
所以在idle下 請使用 "中文".decode("cp950") 這種方式來得到正確的unicode
另外在windows下的 文字文件 檔案中
若有輸入中文的話 存檔可以選擇ansi
但其實windows會幫你偷偷用系統預設的編碼存 一般是cp950
所以若讀檔時用utf8讀cp950是有問題的(通常會轉換失敗、報錯)
以上
有錯請指正 謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 180.176.140.46
推
10/29 00:38, , 1F
10/29 00:38, 1F
→
10/29 02:47, , 2F
10/29 02:47, 2F
→
10/30 00:23, , 3F
10/30 00:23, 3F
→
10/30 00:27, , 4F
10/30 00:27, 4F
→
10/30 00:28, , 5F
10/30 00:28, 5F
→
10/30 16:25, , 6F
10/30 16:25, 6F
→
10/31 00:08, , 7F
10/31 00:08, 7F
推
11/08 18:09, , 8F
11/08 18:09, 8F
→
11/08 18:10, , 9F
11/08 18:10, 9F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
Python 近期熱門文章
PTT數位生活區 即時熱門文章