associação pythonbrasil[11] django zope/plone planet Início Logado como (Entrar)

Diferenças para "TiradorDeAcentos"

Diferenças entre as versões de 3 e 12 (9 versões de distância)
Revisão 3e 2004-04-12 19:49:20
Tamanho: 3958
Comentário:
Revisão 12e 2008-08-11 01:31:57
Tamanho: 6977
Comentário: Link para RemovedorDeAcentos
Deleções são marcadas assim. Adições são marcadas assim.
Linha 2: Linha 2:

Atenção: a receita RemovedorDeAcentos possui uma solução bem mais simples.
Linha 5: Linha 7:
O Código foi escirto para fazer isso em strings UTF-8, consideravelemente mais complexas do que as strings ISO-8859-1. O Código foi escrito para fazer isso em strings UTF-8, consideravelmente mais complexas do que as strings ISO-8859-1.
Linha 7: Linha 9:
Uma pequena alteração (para mais simples) se faz necessária para funcionar com strings ISO-8859-1 Uma pequena alteração (para mais simples) se faz necessária para funcionar com strings ISO-8859-1.
Linha 9: Linha 11:
Uma vez que eu precisava também da funcionalidade de "verficaçã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. 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.
Linha 14: Linha 16:
#!python
Linha 101: Linha 104:

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
Linha 103: Linha 126:
Nome do Autor 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

Tirador de Acentos

Atenção: a receita RemovedorDeAcentos possui uma solução bem mais simples.

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".

   1 #!/usr/local/bin/python
   2 # -*- coding: UTF-8 -*-
   3 
   4 #Arrancador de acentos
   5 #Copyright  (2004) João S. O. Bueno 
   6 #Permissao para uso e modificacao conforme a LGPL.
   7 
   8 
   9 #uso: check_alphanum (string) retorna verdadeiro se a string é imprimivivel
  10 #strip_diacriticals : troca todos os acentos pelos equivalentes nao acentuados.
  11 # e retorna a string alterada
  12 
  13 import copy
  14 
  15 conversion= { "á": "a", "é": "e", "í": "i", "ó": "o", "ú": "u",
  16      "à": "a", "è": "e", "ì": "i", "ò": "o", "ù": "u",
  17      "â": "a", "ê": "e", "î": "i", "ô": "o", "û": "u",
  18      "ã": "a", "õ": "o", "ñ": "n", "ç":"c",
  19      "Á": "A", "É": "E", "Í": "I", "Ó": "O", "Ú": "U",
  20      "À": "A", "È": "E", "Ì": "I", "Ò": "O", "Ù": "U",
  21      "Â": "A", "Ê": "E", "Î": "I", "Ô": "O", "Û": "U",
  22      "Ã": "A", "Õ": "O", "Ñ": "N", "Ç": "C",
  23      "Ü": "U", "û":"u", "Ä":"A", "ä":"a", "Ë":"E", "ë":"e",
  24      "Ï":"I", "ï":"i", "Ö":"O", "ö":"o", "ð":"?", "ß":"ss",
  25       "Å":"A","å":"a", "ø":"o", "Ø":"O", "Þ":"?" , "æ":"ae"
  26      }
  27 
  28 alphanum_ops_CHECK=0
  29 alphanum_ops_FIX=1
  30 
  31 def _alphanum_util (string, operation):
  32     """check if all characters are in printable range
  33     and valid in roman alphabet languages"""
  34     global alphanum_ops_CHECK, alphanum_ops_FIX
  35     global conversion
  36     ok=1
  37     out_string=""
  38     skip=0
  39     aux=len(string)
  40     for i in xrange(aux):
  41         if skip:
  42             skip-=1
  43             continue
  44         char=string[i]
  45         num=ord(char)
  46         if num>=32 and num<=127:
  47             out_string+=char
  48         else:
  49             if num> 127 and i<aux-1 and conversion.has_key (string[i]+string[i+1]):
  50                 out_string+=conversion[string[i]+string[i+1]]
  51                 skip=1
  52             else:
  53                 out_string+="?"
  54                 ok=0
  55                 if operation==alphanum_ops_CHECK:
  56                     return ok
  57                 #the following values are picked from utf-8 specification
  58                 #and mean the number of bytes following the first byte > 0xc0
  59                 #that are part of the same utf-8 character
  60                 if num >= 0xf0:
  61                     skip=3
  62                 elif num >= 0xe0:
  63                     skip-2
  64                 elif num>= 0xc0:
  65                     skip=1
  66                 else:
  67                     skip=0
  68     if operation==alphanum_ops_CHECK:
  69         return ok
  70     else:
  71         return out_string
  72 
  73 def check_alphanum (string):
  74     """check if all characters are in printable range and
  75     valid in romam alphabet languages"""
  76     global alphanum_ops_CHECK, alphanum_ops_FIX
  77     return _alphanum_util (string, alphanum_ops_CHECK)
  78 
  79 def strip_diacriticals (string):
  80     """replace non ASCII characters  for '?' ' or equiv.
  81     letter if it is an western european accented letter."""
  82     global alphanum_ops_CHECK, alphanum_ops_FIX
  83     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:

   1 d = {192: u'A', 193: u'A', 194: u'A', 195: u'A', 196: u'A', 197: u'A', 
   2      199: u'C', 200: u'E', 201: u'E', 202: u'E', 203: u'E', 204: u'I', 
   3      205: u'I', 206: u'I', 207: u'I', 209: u'N', 210: u'O', 211: u'O', 
   4      212: u'O', 213: u'O', 214: u'O', 216: u'O', 217: u'U', 218: u'U', 
   5      219: u'U', 220: u'U', 221: u'Y', 224: u'a', 225: u'a', 226: u'a', 
   6      227: u'a', 228: u'a', 229: u'a', 231: u'c', 232: u'e', 233: u'e', 
   7      234: u'e', 235: u'e', 236: u'i', 237: u'i', 238: u'i', 239: u'i', 
   8      241: u'n', 242: u'o', 243: u'o', 244: u'o', 245: u'o', 246: u'o', 
   9      248: u'o', 249: u'u', 250: u'u', 251: u'u', 252: u'u', 253: u'y', 
  10      255: u'y'}
  11 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:

   1 #!/usr/bin/env python
   2 # -*- coding: utf-8 -*-
   3 # Se você quiser "desacentuar" strings em ISO 8859-1, basta trocar a
   4 # linha acima por "coding: iso-8859-1" e salvar o código-fonte com o
   5 # encoding citado.
   6 
   7 _table = { 
   8     "á" : "a", "à" : "a", "â" : "a", "ä" : "a", "ã" : "a", "å" : "a",
   9     "é" : "e", "è" : "e", "ê" : "e", "ë" : "e",
  10     "í" : "i", "ì" : "i", "î" : "i", "ï" : "i",
  11     "ó" : "o", "ò" : "o", "ô" : "o", "ö" : "o", "õ" : "o", "ø" : "o", 
  12     "ú" : "u", "ù" : "u", "û" : "u", "ü" : "u",
  13     "ñ" : "n", "ç" : "c",
  14     "Á" : "A", "À" : "A", "Â" : "A", "Ä" : "A", "Ã" : "A", "Å" : "A",
  15     "É" : "E", "È" : "E", "Ê" : "E", "Ë" : "E", 
  16     "Í" : "I", "Ì" : "I", "Î" : "I", "Ï" : "I", 
  17     "Ó" : "O", "Ò" : "O", "Ô" : "O", "Ö" : "O", "Õ" : "O", "Ø" : "O",
  18     "Ú" : "U", "Ù" : "U", "Û" : "U", "Ü" : "U", 
  19     "Ñ" : "N", "Ç" : "C",
  20     "ß" : "ss", "Þ" : "d" , "æ" : "ae"
  21 }
  22 
  23 
  24 def asciize(s):
  25     """ 
  26     Converts a entire string to a ASCII only string.
  27    
  28     string
  29         The string to be converted.
  30     """
  31     for original, plain in _table.items():
  32         s = s.replace(original, plain)
  33     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