[問題] telnetlib文字編碼問題(python3)

看板Python作者 (Horse)時間9年前 (2016/06/14 09:26), 9年前編輯推噓5(5022)
留言27則, 7人參與, 最新討論串1/1
各位前備好 近日BS2要關站 想用python寫一個貼文機器 把備份下來的txt文檔貼到ptt2的個板上 但是在文字編碼上出了問題 以下是貼文部分的code 讀資料夾檔案 for dirPath, dirNames, fileNames in os.walk("./BS2/"): 讀檔 for file in fileNames: print (file) ctrl+p進入發文畫面 tn.write('\x10'.encode('ascii')) time.sleep(1) tn.write("\r\n".encode('big5')) time.sleep(1) 輸入文章標題 tn.write(file.encode('big5')) time.sleep(1) tn.write("\r\n".encode('big5')) time.sleep(1) 開啟備份txt檔並寫入 ftxt = open("./BS2/%s"%file,"r") lines = ftxt.readlines() for line in lines: tn.write(line.encode('big5')) <==主要問題在這列 tn.write("\r\n".encode('big5')) ftxt.close() 等同ctrl+x 文章存檔貼出 tn.write('\x18'.encode('ascii')) time.sleep(1) tn.write("s\r\n0\r\n\r\n".encode('big5') ) time.sleep(1) tn.write('\x0C'.encode('ascii')) time.sleep(1) 問題描述: 如果文章中有用到一些特殊字元(例如表格) big5就吃不進去(會找不到編碼然後程式停止報錯) 如果那邊編碼使用utf-8是不會停止後報錯 但是貼出來的文都變成亂碼 請問這種狀況有解法嗎? 謝謝! --

03/29 20:32,
小妹妹,妳想要成為魔法少女嗎?
03/29 20:32

03/29 20:32,
要成為魔法少女的第一步就是要先熟練地使用魔法棒
03/29 20:32

03/29 20:32,
大哥哥的這根魔法棒可以讓妳做練習喔
03/29 20:32

03/29 20:32,
只要搓一搓,神奇魔法棒就會變長
03/29 20:32

03/29 20:32,
再用力搓搓,魔法棒就會產生魔法藥水
03/29 20:32

03/29 20:32,
如果喝下魔法藥水,妳就能成為魔法少女了
03/29 20:32
-- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.92.63.147 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1465867582.A.70B.html

06/14 09:40, , 1F
錯誤訊息?
06/14 09:40, 1F
Traceback (most recent call last): File "py_bbs2.py", line 78, in <module> tn.write(line.encode('big5')) UnicodeEncodeError: 'big5' codec can't encode character '\u2554' in position 5: illegal multibyte sequence ※ 編輯: aa4live (140.92.63.147), 06/14/2016 09:52:12

06/14 09:58, , 2F
嗯,開檔時加上參數errors='ignore'捨棄那些字元吧
06/14 09:58, 2F

06/14 09:59, , 3F
要不然就要自己轉換
06/14 09:59, 3F
謝謝! 不知道可以這樣忽略XD 雖然文章會有缺漏一點 但是整體而言備份的效果有做到就好.... 感恩~

06/14 11:45, , 4F
可以試一下 "cp950" 而不是 "big5"。
06/14 11:45, 4F

06/14 11:46, , 5F
像「碁」這個字 cp950 可以轉,big5 不能轉
06/14 11:46, 5F

06/14 11:52, , 6F
你的這個字也可以用 cp950。 "\u2554".encode('cp950')
06/14 11:52, 6F
換成CP950後已沒有問題 之前問題主要出在表格的框線上Orz... 感謝~

06/14 12:50, , 7F
如果是 BBS 的話通常用 big5-hkscs 可以搞定
06/14 12:50, 7F

06/14 12:51, , 8F
其實關鍵是你的檔案本身是用什麼編碼存的...
06/14 12:51, 8F
生txt檔的程式是直接拿別人的來用 看不出是什麼編碼 不過我再windows的環境執行他應該會是預設的CP950(? 但是CP950能顯示日文感覺一整個怪 (wiki說CP950不含日文,是wiki沒更新還是根本就是我誤會?)

06/14 18:12, , 9F
CP950 確實不含日文, 我覺得你應該先確實知道它用的編碼
06/14 18:12, 9F

06/14 18:12, , 10F
最簡單的方法裝個 chardet 就可以試著偵測
06/14 18:12, 10F

06/14 20:25, , 11F
cp950 不含日文沒錯,你有灌 Unicode 補完計畫?
06/14 20:25, 11F

06/14 20:25, , 12F
有灌的話在 console 能顯示日文,但是是會有問題的日文
06/14 20:25, 12F

06/14 23:39, , 13F
UAO en/decoder https://is.gd/qdGYrI
06/14 23:39, 13F

06/14 23:40, , 14F
06/14 23:40, 14F
找了一個轉出來含日文的檔案用chardet來測試 結果是這樣 {'encoding': None, 'confidence': 0.0} win7記事本開起來也看不到日文 但是讀檔貼到PTT2個板上顯示是正常的 讀檔是用投兩位推文的方法 ftxt = open("./BS2/%s"%file,"r",encoding='cp950', errors='ignore') 為什麼讀成cp950之後貼到PTT2上面會正常rrrrrr 因為開檔的時候ignore了這些日文的編碼 可是直接貼到P2上他認的出來? 這樣想不知道對不對0.0 ※ 編輯: aa4live (140.92.63.147), 06/15/2016 09:43:02

06/15 09:45, , 15F
可以直接提供檔案嗎?
06/15 09:45, 15F
http://tinyurl.com/gpd9je3 測試用檔案在這 放在google硬碟上他預覽是正常能顯示的0.0

06/15 12:08, , 16F
這個檔案我用 Big 5 HKSCS 可以正常顯示
06/15 12:08, 16F

06/15 15:46, , 17F
請問為什麼你的檔案編碼是Big5-HKSCS?香港人?
06/15 15:46, 17F

06/15 16:26, , 18F
話說既然 tn.write 吃 bytes,直接把檔案讀成 bin 再餵給
06/15 16:26, 18F

06/15 16:27, , 19F
它就行了吧?
06/15 16:27, 19F
感謝點破盲點XD

06/16 00:10, , 20F
印象中 Big 5 HKSCS 與 Big5-UAO 有些關聯
06/16 00:10, 20F

06/16 00:17, , 21F
但是你說要轉貼到PTT2 用 eight0 的方法應該蠻不錯的
06/16 00:17, 21F

06/16 00:17, , 22F
不要嘗試去 encode 直接 byte 寫 byte 讀
06/16 00:17, 22F
真是一個突破盲點! 這樣就不用去管編碼問題了

06/16 01:06, , 23F
s860134: UAO 有一部分編碼是照抄 HKSCS 的, 包括假名
06/16 01:06, 23F

06/16 01:08, , 24F
而 HKSCS 那部分其實是照抄古早的倚天系統用的編碼表
06/16 01:08, 24F
再次感謝以上各位大大留言<(_ _)> ※ 編輯: aa4live (140.92.63.147), 06/16/2016 14:45:31

06/16 21:17, , 25F
請問,你不管編碼問題的作法,有成功轉貼到ptt2嗎?
06/16 21:17, 25F

06/17 00:09, , 26F
有成功喔!
06/17 00:09, 26F

06/17 02:43, , 27F
BBS 都是 BIG-UAO 編碼,telnet 本身就是吃 byte 輸入的
06/17 02:43, 27F
文章代碼(AID): #1NNrq-SB (Python)
文章代碼(AID): #1NNrq-SB (Python)