У некоторых должны быть книги C++, которые помогут Вам избежать общих ловушек C++:
Эффективный C++
Более эффективный C++
Эффективный STL
Эффективная книга STL объясняет вектор проблемы bools:)
К сожалению encodings.aliases.aliases.keys ()
НЕ является подходящим ответом.
псевдонимы
(как и следовало ожидать) содержат несколько случаев где разные ключи отображаются в одно и то же значение, например 1252
и windows_1252
оба отображаются в cp1252
. Вы можете сэкономить время, если вместо aliases.keys ()
вы используете set (aliases.values ())
.
НО ЕСТЬ ХУЖЕ ПРОБЛЕМА: псевдонимы
не содержит кодеков, у которых нет псевдонимов (например, cp856, cp874, cp875, cp737 и koi8_u).
>>> from encodings.aliases import aliases
>>> def find(q):
... return [(k,v) for k, v in aliases.items() if q in k or q in v]
...
>>> find('1252') # multiple aliases
[('1252', 'cp1252'), ('windows_1252', 'cp1252')]
>>> find('856') # no codepage 856 in aliases
[]
>>> find('koi8') # no koi8_u in aliases
[('cskoi8r', 'koi8_r')]
>>> 'x'.decode('cp856') # but cp856 is a valid codec
u'x'
>>> 'x'.decode('koi8_u') # but koi8_u is a valid codec
u'x'
>>>
Также стоит отметить, что, несмотря на то, что вы получаете полный список кодеков, может быть хорошей идеей игнорировать кодеки, которые не связаны с наборами символов кодирования / декодирования, но выполняют некоторые другие преобразования, например zlib
, quopri
и base64
.
Это подводит нас к вопросу, ПОЧЕМУ вы хотите «попробовать кодировать байты во множестве различных кодировок». Если мы это узнаем, мы сможем направить вас в правильном направлении.
Для начала, это неоднозначно. Один кодирует байты в юникод, а другой кодирует юникод в байты. Что вы хотите сделать?
Чего вы действительно пытаетесь достичь: вы пытаетесь определить, какой кодек использовать для декодирования некоторых входящих байтов, и планируете ли это сделать со всеми возможными кодеками? [примечание: latin1 декодирует что угодно] Вы пытаетесь определить язык какого-либо текста в Юникоде, пытаясь закодировать его всеми возможными кодеками? [примечание: utf8 кодирует что угодно].
Это подводит нас к вопросу, ПОЧЕМУ вы хотите «попробовать кодировать байты во множество различных кодировок». Если мы это узнаем, мы сможем направить вас в правильном направлении.
Для начала, это неоднозначно. Один кодирует байты в юникод, а другой кодирует юникод в байты. Что вы хотите сделать?
Чего вы действительно пытаетесь достичь: вы пытаетесь определить, какой кодек использовать для декодирования некоторых входящих байтов, и планируете ли это сделать со всеми возможными кодеками? [примечание: latin1 декодирует что угодно] Вы пытаетесь определить язык какого-либо текста в Юникоде, пытаясь закодировать его всеми возможными кодеками? [примечание: utf8 кодирует что угодно].
Это подводит нас к вопросу, ПОЧЕМУ вы хотите «попробовать кодировать байты во множество различных кодировок». Если мы это узнаем, мы сможем направить вас в правильном направлении.
Для начала, это неоднозначно. Один кодирует байты в юникод, а другой кодирует юникод в байты. Что вы хотите сделать?
Чего вы на самом деле пытаетесь достичь: вы пытаетесь определить, какой кодек использовать для декодирования некоторых входящих байтов, и планируете ли это сделать со всеми возможными кодеками? [примечание: latin1 декодирует что угодно] Вы пытаетесь определить язык какого-либо текста в Юникоде, пытаясь закодировать его всеми возможными кодеками? [примечание: utf8 кодирует что угодно].
Для начала, это неоднозначно. Один кодирует байты в юникод, а другой кодирует юникод в байты. Что вы хотите сделать?
Чего вы действительно пытаетесь достичь: вы пытаетесь определить, какой кодек использовать для декодирования некоторых входящих байтов, и планируете ли это сделать со всеми возможными кодеками? [примечание: latin1 декодирует что угодно] Вы пытаетесь определить язык какого-либо текста в Юникоде, пытаясь закодировать его всеми возможными кодеками? [примечание: utf8 кодирует что угодно].
Для начала, это неоднозначно. Один кодирует байты в юникод, а другой кодирует юникод в байты. Что вы хотите сделать?
Чего вы на самом деле пытаетесь достичь: вы пытаетесь определить, какой кодек использовать для декодирования некоторых входящих байтов, и планируете ли это сделать со всеми возможными кодеками? [примечание: latin1 декодирует что угодно] Вы пытаетесь определить язык какого-либо текста в Юникоде, пытаясь закодировать его всеми возможными кодеками? [примечание: utf8 кодирует что угодно].
latin1 декодирует что угодно] Вы пытаетесь определить язык какого-нибудь текста в Юникоде, пытаясь закодировать его всеми возможными кодеками? [примечание: utf8 кодирует что угодно]. latin1 декодирует что угодно] Вы пытаетесь определить язык какого-нибудь текста в Юникоде, пытаясь закодировать его всеми возможными кодеками? [примечание: utf8 кодирует что угодно]. Я сомневаюсь, что в модуле кодеков есть такой метод / функциональность, но если вы видите encoding / __ init __. Py
, функция поиска выполняет поиск в папке модулей кодировок, так что вы можете сделать то же самое, например
Вероятно, вы можете сделать это:
from encodings.aliases import aliases
print aliases.keys()
Вы можете использовать метод для перечисления всех модулей в пакете кодировок
.
import pkgutil
import encodings
false_positives = set(["aliases"])
found = set(name for imp, name, ispkg in pkgutil.iter_modules(encodings.__path__) if not ispkg)
found.difference_update(false_positives)
print found
Возможно, вам стоит попробовать использовать библиотеку Universal Encoding Detector (chardet) вместо того, чтобы реализовывать ее самостоятельно.
>>> import chardet
>>> s = '\xe2\x98\x83' # ☃
>>> chardet.detect(s)
{'confidence': 0.505, 'encoding': 'utf-8'}