Python 板


LINE

想讓 python2 跟 python3 的程式交換資料,但在 unicode 這部分遇到點麻煩 請問有沒有 codec 能符合下列條件? 1. 能將字元範圍從 \u0000 ~ \uFFFF 的 unicode 字串轉成 bytes 再轉回 unicode 且不會出錯或遺失資料 2. 在 python2 和 python3 下,同樣的 unicode 字串編碼後得到的 bytes 結果相同 3. 在 python2 和 python3 下,同樣的 bytes 解碼後得到的 unicode 結果相同 4. 速度快且編碼後的 bytes 體積小 舉例來說,u'\ud800\udc00' 這段字串因為不是合法的 unicode 編解碼上就會出現各種奇怪的問題,不曉得有沒有解? --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.46.145.28
1F:推 AstralBrain:只想得到utf32 體積會變兩倍大就是了XD 09/26 00:27
utf32 不行耶... python2 >>> u'\ud800\udc00'.encode('utf32') '\xff\xfe\x00\x00\x00\x00\x01\x00' python3 >>> u'\ud800\udc00'.encode('utf32') b'\xff\xfe\x00\x00\x00\xd8\x00\x00\x00\xdc\x00\x00'
2F:推 AstralBrain:咦 我的python 2.7.4和3.3.1都是出現下面那串 09/26 00:45
應該是字元寬度的關係,windows python2 預設 ucs2,python3 則是 ucs4
3F:推 AstralBrain:是說不合法字元出現未定義行為也不意外.. 09/26 00:49
4F:→ uranusjr:utf8 就可以了, 因為 Python 的 UTF-8 編碼無視保留區... 09/26 00:51
5F:→ uranusjr:我在 OS X 上的結果和原 po 一樣, 應該是某個版本 fix 過 09/26 00:55
6F:推 AstralBrain:我把u'\ud800\udc00'先encode('utf8')再decode回來 09/26 00:56
7F:→ AstralBrain:結果變成u'\U00010000' 09/26 00:57
所以很難搞...基本上那轉換結果也不能說錯,可是就會出現 s.encode('utf-8').decode('utf-8') != s 這種不直覺的東西
8F:→ uranusjr:喔我發現 3.3 的 utf8 把 surrogate 擋掉了, GG XD 09/26 00:58
9F:→ uranusjr:這樣看來是不可能了, 自己土炮一個轉換表吧 09/26 01:00
土炮有效能問題,自從用了 python,就再也沒再裝過 c++ 了 XD 目前是 utf-7 頂著用,他們似乎不認為 utf-7 編的是文字所以沒擋 surrogate 不過遇到像上面舉的那個例子一樣會爆炸 orz...
10F:推 AstralBrain:翻了文件發現有unicode_internal這怪東西可以用 09/26 01:12
11F:→ AstralBrain:試試看u'\ud800\udc00'.encode('unicode_internal') 09/26 01:12
這個一樣有可能會出現不直覺的結果 python3 >>> s = u'\ud800\udc00' >>> s.encode('unicode_internal') b'\x00\xd8\x00\xdc' >>> s.encode('unicode_internal').decode('unicode_internal') '\U00010000\x27' >>> s.encode('unicode_internal').decode('unicode_internal') == s False
12F:推 AstralBrain:又是OS的差異嗎orz 那我就沒辦法了XD 09/26 01:31
其實跟 OS 沒啥關係啦...
13F:→ uranusjr:其實我突然有個疑問, 你是要拿來幹什麼用... 09/26 10:49
14F:→ uranusjr:如果只是要存起來或傳輸的話, 直接把 Unicode string 09/26 10:50
15F:→ uranusjr:pickle 起來不行嗎? 09/26 10:50
是要拿來傳輸沒錯,想要在 python3 使用一些只有 python2 才有的 module pickle 在 python2 跟 python3 本來就不通用啊
16F:→ uranusjr:Python 官方文件有說 Python 3 可以用舊一點的 protocol 09/26 14:36
17F:→ uranusjr:來 pickle 就會相容了啊... 09/26 14:36
雖然官方文件那樣寫,但實際上並沒那麼美好 像是 datetime.datetime 這種內建物件就不相容 上面舉例的 u'\ud800\udc00' 這種不合法字串也不相容 我問這個問題就是要用在自己寫的 pickle 裡面的 XD
18F:→ uranusjr:原來如此, 這樣我真的沒招了 orz 09/26 18:04
19F:→ s860134:用json.dumps和json.loads 能符合要求嗎?? 09/27 19:16
很遺憾,還是不行耶...
20F:→ s860134:我還是不太懂 因為實際上我把 s=='\ud800\udc00' 是TRUE 09/28 09:09
在 python2 跟 python3 底下,這本來就都沒問題呀 >>> s = u'\ud800\udc00' >>> s == u'\ud800\udc00' True
21F:→ s860134:而且我在Python3上 他不准我用 u'\ud800\udc00' 09/28 09:10
不准是指?如果是指不能 encode,那是因為某些編碼(如 utf-8)有檔 surrogates ※ 編輯: os653 來自: 114.46.115.224 (09/28 19:15)
22F:→ uranusjr:Python 3.3 之前的 Python 3 版本無法使用 u'' literal 09/28 20:39
23F:→ uranusjr:他應該是在說這個 (見 PEP 414) 09/28 20:39







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BabyMother站內搜尋

TOP