Mudanças entre as edições de "Charset"

De WikiLICC
Ir para: navegação, pesquisa
(Nova página: ==Character Sets / Character Encoding Issues== ==Introduction== Let’s first define some terms to make it easier to understand the following sections (taken from the book XML Interna...)
 
m (Fedora)
 
(53 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 1: Linha 1:
==Character Sets / Character Encoding Issues==
+
O charset '''iso-8859-1''' é o charset para códigos de caracteres latinos. Assim letras acentuadas serão representadas
==Introduction==
+
por apenas um caractere.
 +
palavra -  Hexadecimal 
 +
Ação    -  41-E7-E3-6F 
  
Let’s first define some terms to make it easier to understand the following sections (taken from the book XML Internationalization and Localization). See also the introductory WIKI page on i18n.
+
O charset '''utf-8''' é uma tabela de caracteres [multibyte], ou seja, alguns caracteres serão representados no arquivo como 2 ou mais caracteres ASCII (o que pode dificultar a utilização de funções Lenght).
 +
palavra |  Unicode                      | Hexadecimal
 +
Ação    |  U+0041 U+00E7 U+00E3 U+006F  | 41,C3 A7,C3 A3,6F
  
A character is the smallest component of written language that has a semantic value. Examples of characters are letters, ideographs (e.g. Chinese characters), punctuation marks, digits etc.
+
* [http://en.wikipedia.org/wiki/ISO_8859-1 ISO_8859-1]
 +
* [http://en.wikipedia.org/wiki/UTF-8 UTF-8]
 +
* [http://www.utf8-chartable.de/ Tabela completa UTF-8]
  
A character set is a group of characters without associated numerical values. An example of a character set is the Latin alphabet or the Cyrillic alphabet.
+
=Digitando os caracteres=
 +
Cada uma das partes abaixo pode estar configurada de maneira diferente.
 +
==O sistema operacional==
 +
Para verificar qual charset o sistema linux está usando:
 +
[user@euler]$ locale
 +
LANG=pt_BR.UTF-8
 +
LC_CTYPE="pt_BR.UTF-8"
 +
...
  
Coded character sets are character sets in which each character is associated with a scalar value: a code point. For example, in ASCII, the uppercase letter “A” has the value 65. Examples for coded character sets are ASCII and Unicode. A coded character set is meant to be encoded, i.e. converted into a digital representation so that the characters can be serialized in files, databases, or strings. This is done through a character encoding scheme or encoding. The encoding method maps each character value to a given sequence of bytes.
+
===Gentoo===
 +
* http://www.gentoo-wiki.info/Locales
  
In many cases, the encoding is just a direct projection of the scalar values, and there is no real distinction between the coded character set and its serialized representation. For example, in ISO 8859-1 (Latin 1), the character “A” (code point 65) is encoded as a byte 0×41 (i.e. 65). In other cases, the encoding method is more complex. For example, in UTF-8, an encoding of Unicode, the character “á” (225) is encoded as two bytes: 0xC3 and 0xA1.
+
Todos os locales disponíveis estão em
==Unicode and its encodings==
+
[hunter]$ ls /usr/share/i18n/locales/
 +
..
 +
<font color=red>pt_BR</font>
 +
pt_PT
 +
en_US
 +
en_GB
 +
...  
 +
e os locales com suporte no sistema estão em
 +
[hunter]$ vi /usr/share/i18n/SUPPORTED
 +
..
 +
pt_BR.UTF-8 UTF-8
 +
<font color=red>pt_BR</font>
 +
pt_PT.UTF-8 UTF-8
 +
pt_PT ISO-8859-1
 +
..
  
For Unicode (also called Universal Character Set or UCS), a coded character set developed by the Unicode consortium, there a several possible encodings: UTF-8, UTF-16, and UTF-32. Of these, UTF-8 is most relevant for a web application.
+
* No arquivo /etc/locale.gen estão os locales a serem instalados no sistema
UTF-8
+
[hunter]$ vi /etc/locale.gen
 +
..
 +
<font color=red>pt_BR</font> ISO-8859-1
 +
pt_BR UTF-8
 +
pt_BR.UTF-8 UTF-8
 +
..
 +
* Force a instalação dos locales
 +
[hunter]$ locale-gen
 +
* Verifique os locales instalados
 +
[hunter]$ locale -a
 +
C
 +
POSIX
 +
<font color=red>pt_BR</font>
 +
pt_BR.iso88591
 +
pt_BR.utf8
 +
A variável LANG e LC_ALL (quem sabe as outras) devem conter uns dos itens acima
 +
[hunter]$ locale
 +
LANG=<font color=red>pt_BR</font>
 +
LC_ALL=pt_BR
 +
LC_CTYPE="<font color=red>pt_BR</font>"
 +
...
  
UTF-8 is a multibyte 8-bit encoding in which each Unicode scalar value is mapped to a sequence of one to four bytes. One of the main advantages of UTF-8 is its compatibility with ASCII. If no extended characters are present, there is no difference between a dencoded in ASCII and one encoded in UTF-8.
+
===Fedora===
 +
Para verificar os locales utilizados:
 +
[fedora]$ locale
 +
LANG=en_US.utf8
 +
LC_CTYPE="en_US.utf8"
 +
...
  
One thing to take into consideration when using UTF-8 with PHP is that characters are represented with a varying number of bytes. Some PHP functions do not take this into account and will not work as expected (more on this below).
+
Todos os locales disponíveis estão em
 +
[fedora]$ ls /usr/share/i18n/locales/
 +
..
 +
<font color=red>pt_BR</font>
 +
en_US
 +
...  
  
See also Handling UTF-8 with PHP
+
* No arquivo /etc/locale.conf estão os locales a serem instalados no sistema
==PHP and character sets==
+
[fedora]$ more /etc/locale.conf
 +
LANG="en_US.UTF-8"
  
This page is going to assume you’ve done a little reading and absorbed some paranioa about the issue of character sets and character encoding in web applications. If you haven’t, try here;
+
* Force a instalação dos locales
 +
[hunter]$ locale-gen
 +
* Verifique os locales instalados
 +
[hunter]$ locale -a
 +
C
 +
POSIX
 +
<font color=red>pt_BR</font>
 +
pt_BR.iso88591
 +
pt_BR.utf8
 +
A variável LANG e LC_ALL (quem sabe as outras) devem conter uns dos itens acima
 +
[hunter]$ locale
 +
LANG=<font color=red>pt_BR</font>
 +
LC_ALL=pt_BR
 +
LC_CTYPE="<font color=red>pt_BR</font>"
 +
...
  
    “When I discovered that the popular web development tool PHP has almost complete ignorance of character encoding issues, blithely using 8 bits for characters, making it darn near impossible to develop good international web applications, I thought, enough is enough.
+
===OpenBSD===
 +
Não achei o comando locale. Assim temos que seguir o que está setado (até eu descobrir como mudar).
  
“Darn near impossible” is perhaps too extreme but, certainly in PHP, if you simply “accept the defaults” you probably will end up with all kinds of strange characters and question marks the moment anyone outside the US or Western Europe submits some content to your site
+
Acho que os locales disponíveis estão em
 +
[euler]$ ls /usr/share/i18n/locale/
 +
..
 +
<font color=red>pt_PT.ISO8859-1</font>/
 +
pt_PT.ISO8859-15/
 +
en_US.UTF-8/
 +
en_US.ISO8859-1/
 +
en_GB.ISO8859-1/
 +
...
  
This page won’t rehash existing discussions suffice to say you should be thinking in terms of Unicode, the grand unified solution to all character issues and, in particular, UTF-8, a specific encoding of Unicode and the best solution for PHP applications.
+
* No arquivo /etc/profile temos a linha
Everybody Gets it wrong
+
[euler]$ egrep 'LANG|LC_' /etc/profile
 +
LC_CTYPE=<font color=red>pt_PT.ISO8859-1</font>
  
Just so you don’t get the idea that only “serious programmers” can understand the problem, and as a taster for the type of problems you can have, right now (i.e. they may fix it later) on IBM’s new PHP Blog @ developerworks, here’s what you see if you right click > Page Info in Firefox;
+
Usando o comando '''set''' temos a única variável definida
 +
[euler]$ set | egrep 'LANG|LC_'
 +
LC_CTYPE=<font color=red>pt_PT.ISO8859-1</font>
 +
O truque é usar esse locale no início do script PHP para o comando strtolower funcionar.
  
Firefox say it regards the character encoding as being ISO-8859-1 1). That’s actually coming from an HTTP header - if you click on the “Headers” tab you see;
+
=O cliente SSH=
 +
Usando o Putty, clicando em Settings/Windows/Translations podemos selecionar a tabela charset.
  
Content-Type: text/html;charset=ISO-8859-1
+
=O editor=
 +
O editor de texto usado deve ser capaz de salvar usando a tabela de caracteres desejada.
 +
==vi==
 +
No arquivo de configuração do vi (diretório home), temos
 +
[user@euler] more ~/.vimrc
 +
...
 +
set fileencodings=utf-8,latin1
 +
...
 +
Assim os arquivos podem ser editados nesses formatos.
  
Meanwhile amongst the HTML meta tags (scroll down past the whitespace) though you find;
+
Se um arquivo iso-8859-1 é editado com um cliente SSH (em UTF-8), o arquivo é convertido ao abrir para UTF-8 e convertido de volta ao salvar para iso-8859-1 (veja [http://vimdoc.sourceforge.net/htmldoc/mbyte.html]).
  
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+
Use :language para ver a linguagem usada pelo vi
 +
:language
 +
Current language: "pt_BR.UTF-8"
  
Now that’s not a train smash (yet) but it should raise the flag that something isn’t quite right. The meta tag will be ignored by browsers so content will be regarded as being encoded as ISO-8859-1, thanks to the HTTP header.
+
=O arquivo html=
 +
Para utf-8 use o cabeçalho
 +
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 +
e para iso-8859-1 use
 +
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  
This begs the question - how is the content on the blog actually encoded. If that Content-Type: text/html;charset=ISO-8859-1 header is also turning up in a form that writers on the blog use to submit content, it will probably mean the content being stored will have been encoded as ISO-8859-1. If that’s the case, the real problem will raise it’s head in the blogs RSS Feed which currently does not specify the the charset with an HTTP header - just that it’s XML;
+
=O arquivo php=
 +
Para algumas funções funcionarem como '''strtolower''', '''strtoupper''' deve ser colocado no início do script.
 +
<?php
 +
setlocale(LC_CTYPE  ,'pt_PT.ISO8859-1');
 +
echo strtolower('AÇÃO');
 +
?>
 +
ou na hunter
 +
<?php
 +
setlocale(LC_CTYPE  ,'pt_BR');
 +
echo strtolower('AÇÃO');
 +
?>
  
Content-Type: text/xml
+
==Setar o locale na Euler==
 +
Editar no arquivo ''php.ini'' o valor da diretiva ''auto_prepend_file''
 +
[user@euler]$ vi /usr/local/php5/lib/php.ini
 +
..
 +
auto_prepend_file = /CAMINHO/SetLocale.php
 +
..
 +
O arquivo ''SetLocale.php'' deve conter algo como
 +
[user@euler]$ vi SetLocale.php
 +
<?php
 +
$MyEulerLocale=setlocale(LC_CTYPE, 'pt_PT.ISO8859-1');
 +
if($MyEulerLocale !== 'pt_PT.ISO8859-1'){echo "Warning: Nao consegui escolher locale. (SetLocale.php)\n";};
 +
unset($MyEulerLocale);
 +
?>
  
...but does declare UTF as the encoding in the XML content itself;
+
=O servidor Apache=
 +
Ao enviar uma página para o cliente web, o servidor apache avisa qual tipo de charset é utilizado.
 +
[user@euler]$ more http.conf
 +
...
 +
AddDefaultCharset ISO-8859-1
 +
...
 +
=O cliente Firefox/Internet Explorer=
 +
O Firefox verifica qual encoding foi informado pelo servidor web (no exemplo ISO-8859-1).
 +
Todas as páginas saindo desse servidor serão padrão ISO-8859-1, mesmo que especificado de forma contrária no cabeçalho html.
  
<?xml version="1.0" encoding="UTF-8"?>
+
Clicando em Tools/Page Info/General podemos ver o Encoding e as tags meta.  
  
Anyone subscribed to this feed is going to see some wierd characters appearing, should the blog contain anything but pure ASCII characters, because there’s a very good chance the content is actually stored is ISO-8859-1, the guess here being that the “back end” content admin page (containing a form for adding content) is also telling the browser it’s ISO-8859-1.
+
==Veja Também==
 +
* [[utf8]]: Convertendo arquivos entre utf-8 e iso-8859-1
 +
* [http://jfmitre.com/2006/05/convertendo-arquivos-utf-8-em-iso-8859.html Convertendo arquivos entre utf-8 e iso-8859-1]
 +
* [[Idioma]]: Configuração do vi
  
Hopefully, by the time you’ve read this document, you’ll understand what exactly is going wrong here and why.
+
==Ligações Externas==
 +
* http://www.phpwact.org/php/i18n/charsets, Boa explicação com bastante informação dos diferentes aspectos
 +
* [http://www.w3.org/International/O-HTTP-charset W3Cbr: Configurando o parâmetro HTTP da codificação de caracteres (charset)]
 +
* http://www.w3.org/International/O-charset.pt-br.php
 +
* [http://vimdoc.sourceforge.net/htmldoc/mbyte.html Configurações para o VI]

Edição atual tal como às 10h47min de 20 de junho de 2013

O charset iso-8859-1 é o charset para códigos de caracteres latinos. Assim letras acentuadas serão representadas por apenas um caractere.

palavra -   Hexadecimal  
Ação    -   41-E7-E3-6F  

O charset utf-8 é uma tabela de caracteres [multibyte], ou seja, alguns caracteres serão representados no arquivo como 2 ou mais caracteres ASCII (o que pode dificultar a utilização de funções Lenght).

palavra |   Unicode                      | Hexadecimal
Ação    |   U+0041 U+00E7 U+00E3 U+006F  | 41,C3 A7,C3 A3,6F

Digitando os caracteres

Cada uma das partes abaixo pode estar configurada de maneira diferente.

O sistema operacional

Para verificar qual charset o sistema linux está usando:

[user@euler]$ locale
LANG=pt_BR.UTF-8
LC_CTYPE="pt_BR.UTF-8"
...

Gentoo

Todos os locales disponíveis estão em

[hunter]$ ls /usr/share/i18n/locales/
..
pt_BR
pt_PT
en_US
en_GB
... 

e os locales com suporte no sistema estão em

[hunter]$ vi /usr/share/i18n/SUPPORTED
..
pt_BR.UTF-8 UTF-8
pt_BR
pt_PT.UTF-8 UTF-8
pt_PT ISO-8859-1
..
  • No arquivo /etc/locale.gen estão os locales a serem instalados no sistema
[hunter]$ vi /etc/locale.gen
..
pt_BR ISO-8859-1
pt_BR UTF-8
pt_BR.UTF-8 UTF-8
..
  • Force a instalação dos locales
[hunter]$ locale-gen
  • Verifique os locales instalados
[hunter]$ locale -a
C
POSIX
pt_BR
pt_BR.iso88591
pt_BR.utf8

A variável LANG e LC_ALL (quem sabe as outras) devem conter uns dos itens acima

[hunter]$ locale
LANG=pt_BR
LC_ALL=pt_BR
LC_CTYPE="pt_BR"
...

Fedora

Para verificar os locales utilizados:

[fedora]$ locale 
LANG=en_US.utf8
LC_CTYPE="en_US.utf8"
...

Todos os locales disponíveis estão em

[fedora]$ ls /usr/share/i18n/locales/
..
pt_BR
en_US
... 
  • No arquivo /etc/locale.conf estão os locales a serem instalados no sistema
[fedora]$ more /etc/locale.conf
LANG="en_US.UTF-8"
  • Force a instalação dos locales
[hunter]$ locale-gen
  • Verifique os locales instalados
[hunter]$ locale -a
C
POSIX
pt_BR
pt_BR.iso88591
pt_BR.utf8

A variável LANG e LC_ALL (quem sabe as outras) devem conter uns dos itens acima

[hunter]$ locale
LANG=pt_BR
LC_ALL=pt_BR
LC_CTYPE="pt_BR"
...

OpenBSD

Não achei o comando locale. Assim temos que seguir o que está setado (até eu descobrir como mudar).

Acho que os locales disponíveis estão em

[euler]$ ls /usr/share/i18n/locale/
..
pt_PT.ISO8859-1/
pt_PT.ISO8859-15/
en_US.UTF-8/
en_US.ISO8859-1/
en_GB.ISO8859-1/
... 
  • No arquivo /etc/profile temos a linha
[euler]$ egrep 'LANG|LC_' /etc/profile
LC_CTYPE=pt_PT.ISO8859-1

Usando o comando set temos a única variável definida

[euler]$ set | egrep 'LANG|LC_'
LC_CTYPE=pt_PT.ISO8859-1

O truque é usar esse locale no início do script PHP para o comando strtolower funcionar.

O cliente SSH

Usando o Putty, clicando em Settings/Windows/Translations podemos selecionar a tabela charset.

O editor

O editor de texto usado deve ser capaz de salvar usando a tabela de caracteres desejada.

vi

No arquivo de configuração do vi (diretório home), temos

[user@euler] more ~/.vimrc
...
set fileencodings=utf-8,latin1
...

Assim os arquivos podem ser editados nesses formatos.

Se um arquivo iso-8859-1 é editado com um cliente SSH (em UTF-8), o arquivo é convertido ao abrir para UTF-8 e convertido de volta ao salvar para iso-8859-1 (veja [1]).

Use :language para ver a linguagem usada pelo vi

:language
Current language: "pt_BR.UTF-8"

O arquivo html

Para utf-8 use o cabeçalho

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

e para iso-8859-1 use

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

O arquivo php

Para algumas funções funcionarem como strtolower, strtoupper deve ser colocado no início do script.

<?php 
setlocale(LC_CTYPE  ,'pt_PT.ISO8859-1');
echo strtolower('AÇÃO');
?>

ou na hunter

<?php 
setlocale(LC_CTYPE  ,'pt_BR');
echo strtolower('AÇÃO');
?>

Setar o locale na Euler

Editar no arquivo php.ini o valor da diretiva auto_prepend_file

[user@euler]$ vi /usr/local/php5/lib/php.ini
..
auto_prepend_file = /CAMINHO/SetLocale.php
..

O arquivo SetLocale.php deve conter algo como

[user@euler]$ vi SetLocale.php
<?php
$MyEulerLocale=setlocale(LC_CTYPE, 'pt_PT.ISO8859-1');
if($MyEulerLocale !== 'pt_PT.ISO8859-1'){echo "Warning: Nao consegui escolher locale. (SetLocale.php)\n";};
unset($MyEulerLocale);
?>

O servidor Apache

Ao enviar uma página para o cliente web, o servidor apache avisa qual tipo de charset é utilizado.

[user@euler]$ more http.conf
...
AddDefaultCharset ISO-8859-1
...

O cliente Firefox/Internet Explorer

O Firefox verifica qual encoding foi informado pelo servidor web (no exemplo ISO-8859-1). Todas as páginas saindo desse servidor serão padrão ISO-8859-1, mesmo que especificado de forma contrária no cabeçalho html.

Clicando em Tools/Page Info/General podemos ver o Encoding e as tags meta.

Veja Também

Ligações Externas