Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 24, 2012 19:17:59

lobster
От:
Зарегистрирован: 2011-06-09
Сообщения: 82
Репутация: +  0  -
Профиль   Отправить e-mail  

упаковать в юникод

Всех приветствую!
Подскажите, как упаковать число в юникод, вот нашел код но он на перле:

$str =~ s/&#x([0-9A-F]+?);/pack("U", hex($1))/ge;
Пробовал крутить этот struct.pack и так и сяк, никак не выходит преобразовать к виду u'\u….'. А вообще мне нужно избавиться от эскейп символов(х).



Офлайн

#2 Дек. 25, 2012 01:21:03

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

упаковать в юникод

lobster
Подскажите, как упаковать число в юникод
приведи конкретный пример

>>> chr(0x20)
' '
>>> chr(0x1234)
'ሴ'
>>>
это для третьего питона

>>> def f(n):
...     return bytes(bytearray((n >> 8, n & 0xff)))
... 
>>> c = f(0xd0b0).decode('utf-8')
>>> print c
а
>>> c
u'\u0430'
>>>
для второго (может, получше что есть)



Отредактировано py.user.next (Дек. 25, 2012 02:01:43)

Офлайн

#3 Дек. 25, 2012 04:45:41

lobster
От:
Зарегистрирован: 2011-06-09
Сообщения: 82
Репутация: +  0  -
Профиль   Отправить e-mail  

упаковать в юникод

py.user.next
второй пример работает, только не понятно откуда ты взял 0xd0b0 если кириллическая “a” в юникодном представлении \u0430



Офлайн

#4 Дек. 25, 2012 05:20:13

lobster
От:
Зарегистрирован: 2011-06-09
Сообщения: 82
Репутация: +  0  -
Профиль   Отправить e-mail  

упаковать в юникод

А вот, все, дошло сделал при помощи unichr() теперь перловый скрипт можно переписать:

#-*- coding: utf-8 -*-
import re
def unic(match):
i = match.groups()[0]
return unichr(int(i, 16))

str = "порно"
p = re.compile(r"&#x([0-9A-F]+);")
result = p.sub(unic, str)
print result



Офлайн

#5 Дек. 25, 2012 08:59:52

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

упаковать в юникод

>>> import re
>>> 
>>> s = "порно"
>>> 
>>> lst = re.findall(r'[0-9a-f]+', s, re.I)
>>> us = u''.join(unichr(int(i, 16)) for i in lst)
>>> us
u'\u043f\u043e\u0440\u043d\u043e'
>>>



Офлайн

#6 Дек. 25, 2012 09:38:28

lobster
От:
Зарегистрирован: 2011-06-09
Сообщения: 82
Репутация: +  0  -
Профиль   Отправить e-mail  

упаковать в юникод

тоже вариант, py.user.next спасибо!



Офлайн

#7 Дек. 26, 2012 04:26:21

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

упаковать в юникод

короче, твой вариант лучше, потому что он может заменять несплошные последовательности ссылок

>>> import re
>>> 
>>> s = "abcпоdefрabcноdef"
>>> 
>>> us = re.sub(ur'&#x([0-9a-fA-F]+);',
...             lambda mo: unichr(int(mo.group(1), 16)),
...             unicode(s))
>>> us
u'abc\u043f\u043edef\u0440abc\u043d\u043edef'
>>>
я его сократил

>>> import re
>>> 
>>> s = "abcпоdefрabcноdef"
>>> 
>>> us = re.sub(r'&#x([0-9a-fA-F]+);',
...             lambda mo: unichr(int(mo.group(1), 16)),
...             s)
>>> us
u'abc\u043f\u043edef\u0440abc\u043d\u043edef'
>>>
так тоже работает, но непонятно, почему преобразуется к юникодовой строке (наверное, из-за юникодового значения у функции)



Отредактировано py.user.next (Дек. 26, 2012 04:52:51)

Офлайн

#8 Дек. 26, 2012 14:11:48

lobster
От:
Зарегистрирован: 2011-06-09
Сообщения: 82
Репутация: +  0  -
Профиль   Отправить e-mail  

упаковать в юникод

так тоже работает, но непонятно, почему преобразуется к юникодовой строке (наверное, из-за юникодового значения у функции)
Может потому что в третьем питоне все строки юникодные



Офлайн

#9 Дек. 27, 2012 03:03:16

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

упаковать в юникод

>>> import re
>>> 
>>> re.sub(u'.', 'r', u's')
u'r'
>>>
вот во втором питоне

>>> import re
>>> 
>>> re.sub('.', b'r', 's')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.3/re.py", line 170, in sub
    return _compile(pattern, flags).sub(repl, string, count)
TypeError: sequence item 0: expected str instance, bytes found
>>>
а вот в третьем

в третьем он не даёт перемешивать

только так
>>> import re
>>> 
>>> re.sub(b'.', b'r', b's')
b'r'
>>>

или так
>>> import re
>>> 
>>> re.sub('.', 'r', 's')
'r'
>>>



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version