Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Felipe-Petrópolis

Problema Acentuação Python 2.7.6

Recommended Posts

Olá!

 

Meu nome é Felipe, sou iniciante no mundo Linux e comecei a estudar Python 2.7.6 a pouco tempo quando me surgiu um problema:

 

Há cerca de uns 2 dias atrás, eu estava usando o ambiente interativo só para praticar mesmo, quando tentei executar este pequeno código:

 

- quando tentei comparar uma letra acentuada de uma variável o resultado estava dando sempre “ False ”

>>> palavra = "página"

>>> palavra [ 1 ] == "á"

>>> False

- quando dei um print do conteúdo da variável, ela foi exibida normalmente na tela.

>>> palavra = "página"

>>> print palavra

>>> página

- e quando tentei exibir a variável, para saber como o seu valor estava sendo armazenado, saiu isto:

>>> palavra = “página”

>>> palavra

>>> 'p\xc3\xa1gina'

Ate ai tudo bem, não me assustei, eu já havia ouvido falar que Python 2.7.6 tinha alguns detalhes relativos a codificação que poderiam causar este tipo de problema, na hora eu não me preocupei, deixei isso de lado por hora e fui terminar alguns outros testes que eu precisava fazer.

 

Porem, ontem quando tentei buscar soluções para esse problema, eu basicamente não consegui resolvê-lo, eu busquei em tudo quanto é lugar informações que pudesse me ajudar, mas nada adiantou.

 

O que eu encontrei principalmente dizia para alterar a codificação na qual o arquivo fonte seria salvo, introduzindo no código a codificação a ser usada:

#!/usr/bin/python


# -*- coding: latin-1 -*-

# coding: latin-1


# -*- coding: utf-8 -*-

# coding: utf-8


# -*- coding: iso-8859-1 -*-

# coding: iso-8859-1

- eu já tentei usar quase que todas as codificações que pude encontrar em uma serie de combinações diferentes e nada, o problema permanece

 

- eu tentei editar o fonte em diferentes editores de texto e tentando alterar a codificação em que o arquivo seria salvo, e também nada

 

- eu entrei nas opções do IDLE do Python 2.7.6 e lá na opção Default Source Encoding – está marcada UTF-8, e mesmo alterando para outras o problema permanece

 

- encontrei em alguns sites, sobre usar .enconde() e .decode() para codificar e decodificar, não sei exatamente para que isso funciona, foi mesmo o desespero batendo a porta, e sai isso:

>>> palavra = "página"

>>> palavra

>>> 'p\xc3\xa1gina'

>>> palavra.encode("utf-8")


Traceback (most recent call last):

File "<pyshell#2>", line 1, in <module>

palavra.encode("utf-8")

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

mas, quando tento codificar a variável sem que está contenha um caractere especial, pelo menos não é apresentado nenhum erro

>>> palavra = "Marcos"

>>> palavra

>>> 'Marcos'

>>> palavra.encode("utf-8")

>>>

Bom por hora é isso, se alguém souber o que pode estar acontecendo estou aguardando . . .

 

Observações:

 

- o problema acontece tanto em modo interativo quanto no modo de edição

 

- não tenho o Windows instalado para ver se o mesmo acontece na versão Windows, pois, alguns anos atrás quando arranhei um pouco de Python o mesmo problema aconteceu, mas a mudança de codificação resolveu o problema. O que não ocorre agora com o meu Linux

 

- tentei usar diferentes IDEs – Ninja IDE, Wing IDE free, e nada também

 

- baixei e instalei a IDLE do Python 3.4.3 mas aqui o problema dos acentos nem chega a ocorrer, muito provavelmente porque foi corrigido nesta versão do Python, eu ate poderia mudar para o Python 3, mas quero continuar um pouco mais no Python 2, antes de ir para o Python 3, além disso alguns programas e/ou bibliotecas ( principalmente a de Terceiros ) existentes no 2 podem não ser completamente compatíveis com o 3.

 

- fora o que já mencionei acima, por ser iniciante tanto no mundo Linux quanto em programação ( Python ), não busquei ainda qualquer informação e/ou dicas sobre o sistema operacional que pudesse estar causando este problema, principalmente para não piorar a situação

 

- se tiverem algum link, que acharem que possa me ajudar de alguma forma, seja para este problema em especial ou qualquer outro assunto, podem passar que tão logo quanto possível estarei dando uma olhada

 

 

Ubuntu 14.04 LTS - 32 bit - Python 2.7.6

 

IDLE - Python 2.7.6 (default, Jun 22 2015, 18:00:18)

[GCC 4.8.2] on linux2

 

 

Obrigado pela Atenção ! ! !

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

palavra, palavra2 = 'página', u'página'
=> None
type(palavra)
=> <type 'str'>
type(palavra2)
=> <type 'unicode'>
palavra[1] == 'á', palavra[1] == u'á'
=> (False, False)
palavra2[1] == 'á', palavra2[1] == u'á'
=> (False, True)
palavra.decode('utf-8')[1] == 'á'
=> False
palavra.decode('utf-8')[1] == u'á'
=> True

 

Nas versões 2.x existe diferença entre strings criadas com "" e u"".

 

http://farmdev.com/talks/unicode/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

 

Oi, _Isis_ muito obrigado pela resposta, sobre o link que me passou, vou dar uma lida com mais calma, assim que puder . . . e sobre o exemplo do código, abaixo segue o que ocorreu aqui:

 

 

Antes de tudo peço desculpas pelo post gigantesco que vou postar, mas acho que pode ser útil.

 

 

Eu Testei o código no Ubuntu Instalado na Maquina e em algumas Live CD que possuo aqui na esperança de conseguir alguma luz, e eis o resultado:

 

 

No Ubuntu 14.04 LTS 32-bit – Único Sistema Instalado na maquina

 

Via Terminal e também através da IDLE do Python 2x:

Python 2.7.6 (default, Jun 22 2015, 18:00:18)

[GCC 4.8.2] on linux2

Type "copyright", "credits" or "license()" for more information.


>>> palavra, palavra2 = 'página', u'página'

>>> type(palavra)

<type 'str'>

>>> type(palavra2)

<type 'unicode'>

>>> palavra[1] == 'á', palavra[1] == u'á'

Warning (from warnings module):

File "__main__", line 1

UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal

(False, False)

>>> palavra2[1] == 'á', palavra2[1] == u'á'

(False, False)

>>> palavra.decode('utf-8')[1] == 'á'

False

>>> palavra.decode('utf-8')[1] == u'á'

False

>>>

No Ubuntu 14.04 LTS – 32-bit – Live CD

 

Via Terminal:

ubuntu@ubuntu:~$ python -


Python 2.7.6 (default, Mar 22 2014, 22:59:38)

[GCC 4.8.2] on linux2

Type "help", "copyright", "credits" or "license" for more information.


>>> palavra, palavra2 = 'página', u'página'

>>> type(palavra)

<type 'str'>

>>> type(palavra2)

<type 'unicode'>

>>> palavra[1] == 'á', palavra[1] == u'á'

__main__:1: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal

(False, False)

>>> palavra2[1] == 'á', palavra2[1] == u'á'

(False, True)

>>> palavra.decode('utf-8')[1] == 'á'

False

>>> palavra.decode('utf-8')[1] == u'á'

True

>>>

No Ubuntu 14.10 - 32-bit – Live CD

 

Python via Terminal:

ubuntu-gnome@ubuntu-gnome:~$ Python


Python 2.7.8 (default, Oct 20 2014, 15:05:29)

[GCC 4.9.1] on linux2

Type "help", "copyright", "credits" or "license" for more information.


>>> palavra, palavra2 = 'página', u'página'

>>> type(palavra)

<type 'str'>

>>> type(palavra2)

<type 'unicode'>

>>> palavra[1] == 'á', palavra[1] == u'á'

__main__:1: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal

(False, False)

>>> palavra2[1] == 'á', palavra2[1] == u'á'

(False, True)

>>> palavra.decode('utf-8')[1] == 'á'

False

>>> palavra.decode('utf-8')[1] == u'á'

True

>>>

No Debian 7.8 - Release (wheezy) 32-bit – Live CD

 

Kernel Linux 3.2.0-4-486

 

GNOME 3.4.2

 

 

Python via Terminal:

user@debian:~$ python


Python 2.7.3 (default, Mar 14 2014, 11:57:14)

[GCC 4.7.2] on linux2

Type "help", "copyright", "credits" or "license" for more information.


>>> palavra, palavra2 = 'página', u'página'

>>> type(palavra)

<type 'str'>

>>> type(palavra2)

<type 'unicode'>

>>> palavra[1] == 'á', palavra[1] == u'á'

__main__:1: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal

(False, False)

>>> palavra2[1] == 'á', palavra2[1] == u'á'

(False, True)

>>> palavra.decode('utf-8')[1] == 'á'

False

>>> palavra.decode('utf-8')[1] == u'á'

True

>>>

- Bom, ao que parece a linha:

UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal

(False, False)

comum a todas as execuções do Python 2x não sei exatamente o que esta causando isso, mas pelo que vi,

o problema parece estar sendo causado, na execução desta parte:

 palavra[1] == u'á' 

- E com relação a ultima linha a ser executada, essa linha no Ubuntu 14.04 LTS instalado, foi o único que ocorreu essa anomalia:

>>> palavra.decode('utf-8')[1] == u'á'

False

em todas as outras execuções do Python 2x, a linha veio correta:

>>> palavra.decode('utf-8')[1] == u'á'

True

Pelo que parece o problema deve estar girando muito provavelmente em torno do Ubuntu 14.04 instalado aqui . . .

 

 

Observações.:

 

- não sei se é pertinente ao caso, mas quando eu executo o código via idle Python, a parte palavra2 = u'página'', a letra “ u ” fica na cor verde, a mesma que é usada para representar a string, enquanto que no código que você postou e em outros códigos que encontrei, que deram a mesma forma de representar uma string como ( unicode ?) a cor da letra “ u ” é diferente, normalmente “ preta ”, muito provavelmente isso se deve a algum tipo de tag code


usada para representação de código em paginas web, como disse não sei se é pertinente ao problema, mas cada detalhe acho que já ajuda . . .

 

- o sistema operacional está sendo executado em um notebook, mais especificamente um Samsung RV411 CD4BR, não acho que possa haver alguma relação com o problema referente a ultima linha no Ubuntu 14.04 LTS instalado – retornar False, já que em todas as outras Python 2x a ultima linha foi executado com sucesso, mas como já tive problemas ao apertar teclas sem querer mudando a entrada das teclas, não me surpreenderia se algo parecido pudesse estar causando o problema . . .

 

 

Bom por hora é só, vou continuar a pesquisar o que pode estar causando a anomalia aqui, e muito obrigado pelas dicas, tenho certeza que assim que conseguir resolver esses problemas aqui, elas serão de grande utilidade . . .

 

e desculpe pela tag " code " em branco não lembrei que o sistema do forum iria usa-la, falta de atenção da minha parte . . . :P

 

 

Obrigado pela Atenção ! ! !

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por Nightmare SEP
      Estou tendo problemas com acentuação, das informações que estão no banco de dados.
       
      No servidor que está na produção atualmente, rodando uma Intranet, está funcionando normalmente, numa versão mais antiga no XAMPP.
      MySQL: 5.1.41
      PHP: 5.4
      Collation do BD: utf8_general_ci
       
      Segue, como está no banco de dados, e como aparece no HTML.
       
      ---
       
      Porém, formatei o meu computador recentemente, e nele instalei a versão mais atual do XAMPP, com PHP 8.2.
      Criei o bando de dados também com a mesma collation, utf8_general_ci, porém no meu localhost, os acentos aparecem todos zuados.
       
      Uma coisa que percebi, é que no servidor da Intranet, no banco de dados, os acentos ficam zuados, mas no PHP/HTML mostra os acentos corretamente.
      Já no meu computador, os acentos ficam com problema.
       
      É alguma relação com a versão do MySQL? É a Collation errada que estou usando?
       
      Obrigado.

    • Por Nightmare SEP
      Bom dia,
      Estou com problema com acentos no PHPMailer (classe para envio de e-mails). Conforme anexo.
       
      Na configuração do e-mail de destinatário, o nome do destinatário tem acento, quando enviado o e-mail, ao invés de aparecer o nome, aparece aqueles caracteres ali (conforme anexo).
      Acontece o mesmo se eu coloco acentuação no assunto do e-mail.
       
      require("../phpmailer/class.phpmailer.php"); $mail = new PHPMailer(); $mail->IsHTML(true); $mail->CharSet = 'utf-8';  
      Será que pode ser algo no php.ini? Lá eu vi que está marcado o default_charset = 'utf-8'. Ou não tem nada a ver?
       
      EDITANDO:
      Funciona os acentos no corpo do e-mail. Só não funciona no ASSUNTO e no NOME DO DESTINATÁRIO.
       

    • Por FabianoSouza
      Tenho uma function que recupera valores de um cookie.
       
      O problema é que truca quando há algum caractere com acento.
      Exemplo
       
      Tássia   -   retorna assim:  T%C3%A1ssia
       
      Acho que isso é UNICODE, né?
       
      Bom, como é grande a lista de caracteres que podem receber acento, quero saber sem alguém já essa listinha pronta pra eu montar um replace.
      Fiz um código que funciona. Só preciso mesmo dessa listinha para encher as variáveis unicode e normal
      function charDecode(str) { var unicode = '%C3%A0,%C3%A1' , normal = 'à,á'; var strUnicode = unicode.split(','); for(j = 0; j < strUnicode.length; j++){ for(k = 0; k < normal.length; k++) { var tratada = str.replace(strUnicode[j], normal[k]) } } return tratada; }  
      Obrigado desde já.
    • Por Xevious
      Tenho dois sites feitos com php, um é em laravel e o outro básico.
      E eles usam duas cópias do mesmo banco de dados.
       
      Mas um, oq é em Laravel, os acentos dos produtos, que vem do banco de dados, aparecem corretamente.
      No php básico não.
       
      Este que é em php básico, deixei com o mesmo 'meta' que o que é em Laravel.
      Mas não mudou o resultado.
       
      <html lang="pt">
      <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    • Por lordstarlight
      Olá amigos,
       
      Tenho uma tabela Character Set: UFT8 e  Collation: uft8_general_ci.
      Não consigo fazer um select onde possa ignorando maiúsculas, minúsculas, acentos e caracteres especiais.
      Já varri a internet e nada no original ou adaptado funcionou.
      Ignora maiúsculas e minúsculas ainda dá certo mais quanto vai para acentuação fico perdido.
       
      Tentei algo como:
      "SELECT DISTINCT * FROM livros WHERE tituloLivro LIKE _utf8'%".$termo."%' COLLATE utf8_unicode_ci OR tituloLivro LIKE '%".$termo."%'" Usei uft8_encode e uft8_decode na variável termo e ainda nada.
       
      Alguma dica?!
       
      Valeu
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.