= Tirador de Acentos = Atenção: a receita RemovedorDeAcentos possui uma solução bem mais simples. (e feita "do jeito certo" - esta aqui eu fiz quando estava aprendendo python e nem conhecia os objetos unicode (js)) Um pequeno fragmento de código que pode ser usado para remover acentos de strings. Exemplo: "Facção" vira "Faccao" O Código foi escrito para fazer isso em strings UTF-8, consideravelmente mais complexas do que as strings ISO-8859-1. Uma pequena alteração (para mais simples) se faz necessária para funcionar com strings ISO-8859-1. Uma vez que eu precisava também da funcionalidade de "verificação de imprimibilidade" de uma string, e o código seria muito parecido, abaixo as duas estão implementadas, com um "layer" de interface para cada funcionalidade. Disponibilizo o código aqui sob a LGPL. Não estou distribuindo junto o texto full da LGPL, mas o público alvo saberá acha-lo. Então, os que forem usar o código, o façam sabendo que "mesmo não tendo assinado nada, os termos declarados na LGPL são a única licença para uso deste código a que têm acesso, e sua violação implica em perda dos direitos de uso deste código". {{{ #!python #!/usr/local/bin/python # -*- coding: UTF-8 -*- #Arrancador de acentos #Copyright (2004) João S. O. Bueno #Permissao para uso e modificacao conforme a LGPL. #uso: check_alphanum (string) retorna verdadeiro se a string é imprimivivel #strip_diacriticals : troca todos os acentos pelos equivalentes nao acentuados. # e retorna a string alterada import copy conversion= { "á": "a", "é": "e", "í": "i", "ó": "o", "ú": "u", "à": "a", "è": "e", "ì": "i", "ò": "o", "ù": "u", "â": "a", "ê": "e", "î": "i", "ô": "o", "û": "u", "ã": "a", "õ": "o", "ñ": "n", "ç":"c", "Á": "A", "É": "E", "Í": "I", "Ó": "O", "Ú": "U", "À": "A", "È": "E", "Ì": "I", "Ò": "O", "Ù": "U", "Â": "A", "Ê": "E", "Î": "I", "Ô": "O", "Û": "U", "Ã": "A", "Õ": "O", "Ñ": "N", "Ç": "C", "Ü": "U", "û":"u", "Ä":"A", "ä":"a", "Ë":"E", "ë":"e", "Ï":"I", "ï":"i", "Ö":"O", "ö":"o", "ð":"?", "ß":"ss", "Å":"A","å":"a", "ø":"o", "Ø":"O", "Þ":"?" , "æ":"ae" } alphanum_ops_CHECK=0 alphanum_ops_FIX=1 def _alphanum_util (string, operation): """check if all characters are in printable range and valid in roman alphabet languages""" global alphanum_ops_CHECK, alphanum_ops_FIX global conversion ok=1 out_string="" skip=0 aux=len(string) for i in xrange(aux): if skip: skip-=1 continue char=string[i] num=ord(char) if num>=32 and num<=127: out_string+=char else: if num> 127 and i 0xc0 #that are part of the same utf-8 character if num >= 0xf0: skip=3 elif num >= 0xe0: skip-2 elif num>= 0xc0: skip=1 else: skip=0 if operation==alphanum_ops_CHECK: return ok else: return out_string def check_alphanum (string): """check if all characters are in printable range and valid in romam alphabet languages""" global alphanum_ops_CHECK, alphanum_ops_FIX return _alphanum_util (string, alphanum_ops_CHECK) def strip_diacriticals (string): """replace non ASCII characters for '?' ' or equiv. letter if it is an western european accented letter.""" global alphanum_ops_CHECK, alphanum_ops_FIX return _alphanum_util (string, alphanum_ops_FIX) }}} PS. Obviamente o código acima tem que ser gravado em UTF-8. Interessante, mas acho que existe um jeito mais prático usando o metodo translate do unicode. Funciona assim: {{{ #!python d = {192: u'A', 193: u'A', 194: u'A', 195: u'A', 196: u'A', 197: u'A', 199: u'C', 200: u'E', 201: u'E', 202: u'E', 203: u'E', 204: u'I', 205: u'I', 206: u'I', 207: u'I', 209: u'N', 210: u'O', 211: u'O', 212: u'O', 213: u'O', 214: u'O', 216: u'O', 217: u'U', 218: u'U', 219: u'U', 220: u'U', 221: u'Y', 224: u'a', 225: u'a', 226: u'a', 227: u'a', 228: u'a', 229: u'a', 231: u'c', 232: u'e', 233: u'e', 234: u'e', 235: u'e', 236: u'i', 237: u'i', 238: u'i', 239: u'i', 241: u'n', 242: u'o', 243: u'o', 244: u'o', 245: u'o', 246: u'o', 248: u'o', 249: u'u', 250: u'u', 251: u'u', 252: u'u', 253: u'y', 255: u'y'} s = unicode(string_com_acentos, 'iso-8859-1').translate(d) }}} Note que isso funciona para o charset iso-8859-1, mas deve funcionar para qualquer outro charset, na pior das hipoteses basta trocar os números por u´Á', u'À', e assim por diante, só usei números porque foi como consegui essa tabela e não estava com paciência de fazer do outro jeito. -- RafaelAlmeida ---- Usei um terceiro método para obter a "desacentuação" tanto a partir de UTF 8 quanto a partir de ISO 8859-1: {{{ #!python #!/usr/bin/env python # -*- coding: utf-8 -*- # Se você quiser "desacentuar" strings em ISO 8859-1, basta trocar a # linha acima por "coding: iso-8859-1" e salvar o código-fonte com o # encoding citado. _table = { "á" : "a", "à" : "a", "â" : "a", "ä" : "a", "ã" : "a", "å" : "a", "é" : "e", "è" : "e", "ê" : "e", "ë" : "e", "í" : "i", "ì" : "i", "î" : "i", "ï" : "i", "ó" : "o", "ò" : "o", "ô" : "o", "ö" : "o", "õ" : "o", "ø" : "o", "ú" : "u", "ù" : "u", "û" : "u", "ü" : "u", "ñ" : "n", "ç" : "c", "Á" : "A", "À" : "A", "Â" : "A", "Ä" : "A", "Ã" : "A", "Å" : "A", "É" : "E", "È" : "E", "Ê" : "E", "Ë" : "E", "Í" : "I", "Ì" : "I", "Î" : "I", "Ï" : "I", "Ó" : "O", "Ò" : "O", "Ô" : "O", "Ö" : "O", "Õ" : "O", "Ø" : "O", "Ú" : "U", "Ù" : "U", "Û" : "U", "Ü" : "U", "Ñ" : "N", "Ç" : "C", "ß" : "ss", "Þ" : "d" , "æ" : "ae" } def asciize(s): """ Converts a entire string to a ASCII only string. string The string to be converted. """ for original, plain in _table.items(): s = s.replace(original, plain) return s }}} Note que ele não faz a conversão em ambos os encodings a partir do mesmo código-fonte, mas exige algumas alterações. Entretatno, acho que são alterações mais localizadas que nos códigos anteriores, de modo que são mais fáceis de executar. -- AdamVictorNazarethBrandizzi ---- João S. O. Bueno