Простое кодирование URL ASCII с помощью Python - PullRequest
1 голос
/ 25 июня 2010

посмотрите на это:

import urllib
print urllib.urlencode(dict(bla='Ã'))

вывод

bla=%C3%BC

то, что я хочу, просто, я хочу вывод в ascii вместо utf-8, поэтому мне нужен вывод:

bla=%C3

если я попытаюсь:

urllib.urlencode(dict(bla='Ã'.decode('iso-8859-1')))

не работает (все мои файлы Python в кодировке utf-8):

'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

В производстве ввод поступает в кодировке.

Ответы [ 6 ]

3 голосов
/ 25 июня 2010

Взгляните на транслитерацию юникода в python :

from unidecode import unidecode
print unidecode(u"\u5317\u4EB0")

# That prints: Bei Jing

В вашем случае:

bla='Ã'
print unidecode(bla)
'A'

Это сторонняя библиотека, которую можно легко установить с помощью:

$ git clone http://code.zemanta.com/tsolc/git/unidecode
$ cd unidecode
$ python setup.py install
2 голосов
/ 25 июня 2010

довольно хорошо работает асификация вот так:

import unicodedata
unicodedata.normalize('NFKD', 'Ã'.decode('UTF-8')).encode('ascii', 'ignore')
2 голосов
/ 25 июня 2010

Я хочу вывод в ascii вместо utf-8

Это не ASCII, в котором нет символов, отображенных выше 0x80. Вы говорите о ISO-8859-1 или, возможно, кодовой странице 1252 (кодировка Windows на ее основе).

'Ã'.decode('iso-8859-1')

Ну, это зависит от того, какую кодировку вы использовали для сохранения символа Ã в источнике, не так ли? Похоже, ваш текстовый редактор сохранил его как UTF-8. (Это хорошо, потому что кодировки, специфичные для локали, такие как ISO-8859-1, должны уходить как можно скорее.)

Скажите Python, что исходный файл, который вы сохранили, находится в UTF-8 согласно PEP 263 :

# coding=utf-8

urllib.quote(u'Ã'.encode('iso-8859-1'))    # -> %C3

Или, если вы не хотите этого делать, используйте обратную косую черту:

urllib.quote(u'\u00C3'.encode('iso-8859-1'))    # -> %C3

Хотя в любом случае современное веб-приложение должно использовать для ввода UTF-8, а не ISO-8859-1 / cp1252.

1 голос
/ 25 июня 2010

Если вы на самом деле используете UTF-8, и вы хотите использовать iso-8859-1 в качестве выхода (не ASCII), то вам нужно:

'ñ'.decode('utf-8').encode('iso-8859-1')
0 голосов
/ 04 июня 2015

Пакет unihandecode is

US-ASCII транслитерация текста в Юникоде.
улучшенная версия Unidecode Python, то есть Python-порт модуля Text :: Unidecode Perl от Sean M. Burke.

pip install Unihandecode

затем в python

import unihandecode
print(unihandecode.unidecode(u'Ã'))

отпечатки A.

0 голосов
/ 25 июня 2010

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

.encode('iso-8859-1') 

на

.decode('iso-8859-1')

, вернувшись к .encode ('iso-8859-1'), и он работает.

...