2013-02-08 51 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 
>>>