Что надежный путь состоит в том, чтобы преобразовать некоторую строку (utf-8 или иначе) к простой строке ASCII в Python

Что касается эффективности во время выполнения, другие ответили лучше, чем я. Если у вас всегда будет то же число уравнений, что и для переменных, мне нравится правило Крамера , поскольку его легко реализовать. Просто напишите функцию для вычисления определителя матрицы (или используйте уже написанную, я уверен, что вы можете найти ее там) и разделите определители двух матриц.

5
задан S.Lott 24 November 2009 в 20:18
поделиться

4 ответа

Если вам нужна строка ASCII, которая однозначно представляет то, что у вас есть, без потери информации , ответ прост:

Не возитесь с кодировкой / decode используйте функцию repr () (Python 2.X) или функцию ascii () (Python 3.x).

9
ответ дан 18 December 2019 в 07:55
поделиться

Вы говорите «кодировка различается». Я предполагаю, что под «этим» вы подразумеваете «строку» Python 2.x, которая на самом деле представляет собой последовательность байтов.

Ответ на первую часть: если вы не знаете кодировку этой закодированной строки, тогда нет , с ним вообще невозможно сделать что-либо значимое *. Если вы знаете кодировку, то первым шагом будет преобразование вашей str в unicode :

encoded_string = i_have_no_control()
the_encoding = 'utf-8' # for the sake of example
text = unicode(encoded_string, the_encoding)

Затем вы можете перекодировать свой объект Unicode как ASCII, если хотите.

ascii_garbage = text.encode('ascii', 'replace')

* Существуют эвристические методы для угадывания кодировок, но они медленные и ненадежные. Вот одна отличная попытка на Python .

5
ответ дан 18 December 2019 в 07:55
поделиться

Если все, что вам нужно, это сохранить ASCII-совместимые символы и выбросить остальные, то в большинстве кодировок это сводится к удалению всех символов, имеющих старший бит set - т.е. символы со значением больше 127. Это работает, потому что почти все наборы символов являются расширениями 7-битного ASCII.

Если это обычная строка (т.е. не unicode ]), вам необходимо декодировать его в произвольном наборе символов (например, iso-8859-1 , потому что он принимает любые байтовые значения), а затем закодировать в ascii, используя ignore или replace вариант для ошибок:

>>> orig = '1ä2äö3öü4ü'
>>> orig.decode('iso-8859-1').encode('ascii', 'ignore')
'1234'
>>> orig.decode('iso-8859-1').encode('ascii', 'replace')
'1??2????3????4??'

Шаг декодирования необходим, потому что вам нужна строка unicode для использования кодирования. Если у вас уже есть строка Unicode, это проще:

>>> orig = u'1ä2äö3öü4ü'
>>> orig.encode('ascii', 'ignore')
'1234'
>>> orig.encode('ascii', 'replace')
'1??2????3????4??'
1
ответ дан 18 December 2019 в 07:55
поделиться

I ' d попытаться нормализовать строку, а затем закодировать ее. Что насчет:

import unicodedata
s = u"éèêàùçÇ"
print unicodedata.normalize('NFKD',s).encode('ascii','ignore')

Это работает, только если у вас в качестве входных данных используется юникод. Поэтому вы должны знать, что можно кодировать и декодировать выходные данные функции. Если вы этого не сделаете, есть эвристики обнаружения кодирования, но для коротких строк они ненадежны.

Конечно, вам может повезти , и выходные данные функции зависят от различных неизвестных кодировок, но с использованием ascii в качестве базы кода они будут выделять одинаковое значение для байтов от 0 до 127 (например, utf-8).

В этом случае вы можете просто избавиться от ненужных символов, отфильтровав их с помощью OrderedSets :

import string.printable # asccii chars
print "".join(OrderedSet(string.printable) & OrderedSet(s))

Или, если вам нужны пробелы:

print("".join(((char if char in  string.printable else " ") for char in s )))

"translate" может помочь вам сделать то же самое.

Единственный способ узнать, так ли повезло тебе, - это попробовать ... Иногда,

3
ответ дан 18 December 2019 в 07:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: