2013-02-08 52 views
1

我從PHP轉換外部class到Python,它確實一些技巧等:二進制運算符在Python ...翻譯如果(C1> = 「 XC0」 &C1 <= 「 XDF」)

if ($c1 >= "\xc0" & $c1 <= "\xdf") 
[...] 
$cc1 = (chr(ord($c1)/64) | "\xc0"); 
[...] 
$cc2 = ($c1 & "\x3f") | "\x80"; 

其中$ C1,^ $ CC1,$ CC2是字符

,我只是意識到,我不能與Python中使用它是這樣,因爲字符的字符串,而不是複製性被視爲「字符的二進制表示「運營商&和|有道理...

請問,你會如何翻譯任何這些在Pythonic的方式?

>>> c1 = "a" 
>>> (c1 & "\x3f") | "\x80" 

Traceback (most recent call last): 
    File "<pyshell#202>", line 1, in <module> 
    (c1 & "\x3f") | "\x80" 
TypeError: unsupported operand type(s) for &: 'str' and 'str' 

編輯:實際上,似乎這個PHP類不工作,所以它也不適合我的需要。非常感謝您的幫助。

+0

第一個'&'沒有多大意義,甚至在PHP代碼。 – deceze 2013-02-08 16:26:38

+0

「forceUTF8」級別的前提是非常糟糕的。我希望你不要依賴它來代替*正確處理字符編碼*。在正常操作中,不需要這樣的代碼。 – deceze 2013-02-08 16:29:13

+1

其實我認爲目標是操縱字符的字節與面具,所以我認爲這是有道理的。我的問題不是「是否有意義」,我不是可以用「另一種方式」來完成「整個編碼修復事物」,而是「如何翻譯字符操作,例如提供給Python的三個示例。」我必須處理一些破損的編碼,所以我處於'異常'的情況,只是想先檢查這種方法,然後再依靠其他任何東西,並想從python中執行它... – user1340802 2013-02-08 16:32:02

回答

1

使用ord函數獲取該值,然後使用實際數字進行掩碼。

>>> c1 = "a" 
>>> (ord(c1) & 0x3f) | 0x80 
161 
>>> hex((ord(c1) & 0x3f) | 0x80) 
'0xa1' 
1

這是一個原始的UTF-8編碼功能。

c1.encode('utf-8') 

需要注意的是,除非你使用unicode小號本身(爲什麼不呢?),你需要從'latin-1'第一解碼。

1
Python 2.7.3 (default, Sep 26 2012, 21:51:14) 
>>> c1 = 'd' 
>>> # if ($c1 >= "\xc0" & $c1 <= "\xdf") 
... 
>>> ord(c1) >= 0xc0 and ord(c1) <= 0xdf 
False 
>>> # $cc1 = (chr(ord($c1)/64) | "\xc0"); 
... 
>>> chr(ord(c1)/64 | 0xc0) 
'\xc1' 
>>> # $cc2 = ($c1 & "\x3f") | "\x80"; 
... 
>>> ord(c1) & 0x3f | 0x80 
164 
>>>