107.3 Lição 1
Certificação: |
LPIC-1 |
---|---|
Versão: |
5.0 |
Tópico: |
107 Tarefas Administrativas |
Objetivo: |
107.3 Localização e internacionalização |
Lição: |
1 de 1 |
Introdução
Todas as principais distribuições Linux podem ser configuradas para usar configurações de localização personalizadas. Essas configurações incluem definições relacionadas à região e ao idioma, como fuso horário, idioma da interface e codificação de caracteres, e podem ser modificadas durante a instalação do sistema operacional ou a qualquer momento depois disso.
Os aplicativos contam com variáveis de ambiente, arquivos de configuração do sistema e comandos para decidir o formato de data e hora e o idioma adequados a empregar; assim, a maioria das distribuições Linux compartilha uma maneira padronizada de ajustar as configurações de data, hora e localização. Esses ajustes são importantes não somente para aprimorar a experiência do usuário, mas também para garantir que o tempo dos eventos do sistema — importante, por exemplo, para relatar problemas relacionados à segurança — seja calculado corretamente.
Para serem capazes de representar qualquer texto escrito, independentemente da língua falada, os sistemas operacionais modernos precisam de um padrão de codificação de caracteres de referência, e os sistemas Linux não fogem à regra. Como os computadores só conseguem lidar com números, um caractere de texto nada mais é do que um número associado a um símbolo gráfico. Plataformas de computação distintas podem associar valores numéricos distintos ao mesmo caractere e, portanto, um padrão comum de codificação de caracteres é necessário para torná-los compatíveis. Um documento de texto criado em um sistema só será legível em outro sistema se ambos concordarem quanto ao formato de codificação e aos números associado a cada caractere, ou pelo menos se souberem converter entre os dois padrões.
A natureza heterogênea das configurações de localização nos sistemas baseados em Linux resulta em diferenças sutis entre as distribuições. Apesar dessas diferenças, todas as distribuições compartilham as mesmas ferramentas e conceitos básicos para configurar os aspectos de internacionalização de um sistema.
Fusos horários
Os fusos horários são faixas distintas da superfície da Terra, aproximadamente proporcionais, abrangendo o equivalente a uma hora, ou seja, regiões do mundo que experimentam a mesma hora do dia no mesmo momento. Uma vez que não existe uma única longitude que possa ser considerada como o início do dia para o mundo inteiro, os fusos horários são relativos ao meridiano primário, onde o ângulo de longitude da Terra foi definido como 0. O tempo no primeiro meridiano é chamado de Tempo Universal Coordenado, por convenção abreviado para UTC. Por razões práticas, os fusos horários não seguem a distância longitudinal exata a partir do ponto de referência (o meridiano principal). Em vez disso, eles são artificialmente adaptados de forma a seguir as fronteiras dos países ou outras subdivisões significativas.
As subdivisões políticas são tão relevantes que os fusos horários recebem nomes que homenageiam algum agente geográfico importante daquela área específica, geralmente com base no nome de um grande país ou cidade dentro da zona. No entanto, os fusos horários são divididos de acordo com seu deslocamento de tempo em relação a UTC; esse deslocamento também pode ser usado para indicar o fuso em questão. O fuso horário GMT-5, por exemplo, indica uma região na qual o horário UTC está cinco horas à frente, ou seja, essa região está 5 horas atrás do UTC. Da mesma forma, o fuso horário GMT+3 indica uma região na qual o horário UTC está três horas atrás. O termo GMT — de Greenwich Mean Time — é usado como sinônimo de UTC nos nomes de fusos horários que indicam a diferença de hora.
Uma máquina conectada pode ser acessada de diferentes partes do mundo, de forma que é aconselhável definir o relógio do hardware para UTC (o fuso horário GMT+0) e deixar a escolha do fuso horário para cada caso particular. Os serviços em nuvem, por exemplo, costumam ser configurados para usar UTC, o que pode ajudar a mitigar eventuais inconsistências entre o horário local e o horário dos clientes ou de outros servidores. Por outro lado, os usuários que abrem uma sessão remota no servidor podem querer usar seu fuso horário local. Assim, caberá ao sistema operacional configurar o fuso horário correto de acordo com cada caso.
Além da data e hora atuais, o comando date
também exibe o fuso horário atualmente configurado:
$ date Mon Oct 21 10:45:21 -03 2019
O deslocamento em relação a UTC é dado pelo valor -03
, que indica que a hora exibida é três horas a menos que UTC. Portanto, o horário UTC está três horas à frente, e assim GMT-3 é o fuso horário correspondente para as configurações de tempo especificadas. O comando timedatectl
, disponível em distribuições que usam o systemd, mostra mais detalhes sobre a data e hora do sistema:
$ timedatectl Local time: Sat 2019-10-19 17:53:18 -03 Universal time: Sat 2019-10-19 20:53:18 UTC RTC time: Sat 2019-10-19 20:53:18 Time zone: America/Sao_Paulo (-03, -0300) System clock synchronized: yes systemd-timesyncd.service active: yes RTC in local TZ: no
Como vemos na entrada Time zone
, nomes de fusos horários baseados em localidades — como America/Sao_Paulo
— também são aceitos. O fuso horário padrão para o sistema é mantido no arquivo /etc/timezone
, seja com o nome descritivo ou com a diferença de hora em relação a UTC. Os nomes genéricos de fusos horários indicados pela diferença em relação a UTC devem incluir Etc
na primeira parte do nome. Assim, para definir o fuso horário padrão como GMT+3, o nome do fuso horário deve ser Etc/GMT+3
:
$ cat /etc/timezone Etc/GMT+3
Embora os nomes de fusos horários com base em localidades não exijam a indicação da diferença de hora para funcionar, eles não são tão fáceis de escolher. A mesma zona pode ter mais de um nome, sendo assim mais difícil de lembrar. Para mitigar este problema, o comando tzselect
oferece um método interativo que guia o usuário na definição correta do fuso horário. O comando tzselect
deve estar disponível por padrão em todas as distribuições Linux, já que é fornecido pelo pacote que contém utilitários necessários relacionados à Biblioteca GNU C.
O comando tzselect
será útil, por exemplo, para um usuário que deseja identificar o fuso horário da “Cidade de São Paulo” no “Brasil”. O tzselect
começa perguntando qual a macrorregião do local desejado:
$ tzselect Please identify a location so that time zone rules can be set correctly. Please select a continent, ocean, "coord", or "TZ". 1) Africa 2) Americas 3) Antarctica 4) Asia 5) Atlantic Ocean 6) Australia 7) Europe 8) Indian Ocean 9) Pacific Ocean 10) coord - I want to use geographical coordinates. 11) TZ - I want to specify the time zone using the Posix TZ format. #? 2
A opção 2
refere-se a locais da América do Norte e do Sul, não necessariamente no mesmo fuso horário. Também é possível especificar o fuso horário com coordenadas geográficas ou com a notação de deslocamento, também conhecida como formato Posix TZ. A etapa seguinte é escolher o país:
Please select a country whose clocks agree with yours. 1) Anguilla 19) Dominican Republic 37) Peru 2) Antigua & Barbuda 20) Ecuador 38) Puerto Rico 3) Argentina 21) El Salvador 39) St Barthelemy 4) Aruba 22) French Guiana 40) St Kitts & Nevis 5) Bahamas 23) Greenland 41) St Lucia 6) Barbados 24) Grenada 42) St Maarten (Dutch) 7) Belize 25) Guadeloupe 43) St Martin (French) 8) Bolivia 26) Guatemala 44) St Pierre & Miquelon 9) Brazil 27) Guyana 45) St Vincent 10) Canada 28) Haiti 46) Suriname 11) Caribbean NL 29) Honduras 47) Trinidad & Tobago 12) Cayman Islands 30) Jamaica 48) Turks & Caicos Is 13) Chile 31) Martinique 49) United States 14) Colombia 32) Mexico 50) Uruguay 15) Costa Rica 33) Montserrat 51) Venezuela 16) Cuba 34) Nicaragua 52) Virgin Islands (UK) 17) Curaçao 35) Panama 53) Virgin Islands (US) 18) Dominica 36) Paraguay #? 9
O território brasileiro abrange quatro fusos horários; portanto, o nome do país por si só não basta para definir o fuso horário. Na etapa seguinte, o tzselect
pede que o usuário especifique a região local:
Please select one of the following time zone regions. 1) Atlantic islands 2) Pará (east); Amapá 3) Brazil (northeast: MA, PI, CE, RN, PB) 4) Pernambuco 5) Tocantins 6) Alagoas, Sergipe 7) Bahia 8) Brazil (southeast: GO, DF, MG, ES, RJ, SP, PR, SC, RS) 9) Mato Grosso do Sul 10) Mato Grosso 11) Pará (west) 12) Rondônia 13) Roraima 14) Amazonas (east) 15) Amazonas (west) 16) Acre #? 8
Nem todos os nomes de localidade estão presentes, mas escolher a região mais próxima já basta. As informações fornecidas serão então usadas pelo tzselect
para exibir o fuso horário correspondente:
The following information has been given: Brazil Brazil (southeast: GO, DF, MG, ES, RJ, SP, PR, SC, RS) Therefore TZ='America/Sao_Paulo' will be used. Selected time is now: sex out 18 18:47:07 -03 2019. Universal Time is now: sex out 18 21:47:07 UTC 2019. Is the above information OK? 1) Yes 2) No #? 1 You can make this change permanent for yourself by appending the line TZ='America/Sao_Paulo'; export TZ to the file '.profile' in your home directory; then log out and log in again. Here is that TZ value again, this time on standard output so that you can use the /usr/bin/tzselect command in shell scripts: America/Sao_Paulo
O nome do fuso horário resultante, America/Sao_Paulo
, também pode ser usado como o conteúdo de /etc/timezone
para informar o fuso horário padrão para o sistema:
$ cat /etc/timezone America/Sao_Paulo
Conforme declarado na saída de tzselect
, a variável de ambiente TZ
define o fuso horário da sessão do shell, qualquer que seja o fuso horário padrão do sistema. Se adicionarmos a linha TZ='America/Sao_Paulo'; export TZ
ao arquivo ~/.profile
, America / Sao_Paulo
se tornará o fuso horário das sessões futuras do usuário. A variável TZ
também pode ser modificada temporariamente durante a sessão atual, a fim de exibir a hora em um fuso horário diferente:
$ env TZ='Africa/Cairo' date Mon Oct 21 15:45:21 EET 2019
No exemplo, o comando env
executa o comando fornecido em uma nova sessão de sub-shell com as mesmas variáveis de ambiente da sessão atual, exceto pela variável TZ
, modificada pelo argumento TZ='Africa/Cairo'
.
Horário de verão
Muitas regiões adotam o horário de verão — quando os relógios são normalmente adiantados em uma hora — em parte do ano, o que pode levar um sistema mal configurado a relatar a hora errada durante aquela estação do ano.
O arquivo /etc/localtime
contém os dados usados pelo sistema operacional para ajustar seu relógio corretamente. Os sistemas Linux padrão têm arquivos para todos os fusos horários no diretório /usr/share/zoneinfo/
, de modo que /etc/localtime
é apenas um link simbólico para o arquivo de dados real dentro desse diretório. Os arquivos em /usr/share/zoneinfo/
são organizados pelo nome do fuso horário correspondente, então o arquivo de dados para o fuso horário America/Sao_Paulo
será /usr/share/zoneinfo/America/Sao_Paulo
.
Como as definições de horário de verão podem mudar, é importante manter em dia os arquivos de /usr/share/zoneinfo/
. O comando de atualização da ferramenta de gerenciamento de pacotes fornecida pela distribuição deve atualizá-los sempre que uma nova versão estiver disponível.
Idioma e codificação de caracteres
Os sistemas Linux podem funcionar com uma ampla variedade de idiomas e codificações de caracteres não ocidentais, definições conhecidas como localidades (em inglês, locales). A configuração de localidade mais básica é a definição da variável de ambiente LANG
, a partir da qual a maioria dos programas do shell identificam o idioma a ser usado.
O conteúdo da variável LANG
segue o formato ab_CD
, onde ab
é o código do idioma e CD
é o código da região. O código do idioma deve seguir o padrão ISO-639 e o código da região, o padrão ISO-3166. Um sistema configurado para usar o português do Brasil, por exemplo, deve ter a variável LANG
definida como pt_BR.UTF-8
:
$ echo $LANG pt_BR.UTF-8
Conforme visto na saída deste exemplo, a variável LANG
também contém a codificação de caracteres destinada ao sistema. O ASCII, abreviação de American Standard Code for Information Interchange, foi o primeiro padrão de codificação de caracteres amplamente usado para comunicação eletrônica. No entanto, como o ASCII tem uma gama muito limitada de valores numéricos disponíveis e foi baseado no alfabeto inglês, ele não contém caracteres usados por outros idiomas ou um conjunto extenso de símbolos não-alfabéticos. A codificação UTF-8 é um Padrão Unicode para os caracteres ocidentais comuns, além de diversos outros símbolos não convencionais. Conforme afirmado pelo Unicode Consortium, mantenedor do Padrão Unicode, ele deve ser adotado por padrão para garantir a compatibilidade entre as plataformas de computação:
O padrão Unicode atribui um número exclusivo a cada caractere, em qualquer plataforma, dispositivo, aplicativo ou idioma. Ele foi adotado por todos os provedores de software modernos e agora permite que os dados sejam transportados através de muitas plataformas, dispositivos e aplicativos diferentes sem corrupção. O suporte a Unicode forma a base para a representação de idiomas e símbolos em todos os principais sistemas operacionais, mecanismos de pesquisa, navegadores, laptops e smartphones — além da Internet e da World Wide Web (URLs, HTML, XML, CSS, JSON, etc.). (…) o Padrão Unicode e a disponibilidade de ferramentas de suporte estão entre as mais recentes tendências globais de tecnologia de software.
What is Unicode?
Alguns sistemas ainda podem usar padrões definidos pelo ISO — como o padrão ISO-8859-1 — para a codificação de caracteres não-ASCII. No entanto, esses padrões de codificação de caracteres devem ser preteridos em favor dos padrões de codificação Unicode. Todos os principais sistemas operacionais tendem a adotar o Unicode por padrão.
As configurações de localidade de todo o sistema são definidas no arquivo /etc/locale.conf
. A variável LANG
e outras variáveis relacionadas à localidade são atribuídas neste arquivo como uma variável de shell comum, por exemplo:
$ cat /etc/locale.conf LANG=pt_BR.UTF-8
Os usuários podem empregar uma configuração de localidade personalizada redefinindo a variável de ambiente LANG
. Isso pode ser feito apenas para a sessão atual ou para sessões futuras, adicionando a nova definição ao perfil Bash do usuário em ~/.bash_profile
ou ~/.profile
. Entretanto, até que o usuário efetue login, a localidade padrão do sistema ainda será usada por programas independentes do usuário, como a tela de login do gerenciador de exibição.
Tip
|
O comando |
Além da variável LANG
, outras variáveis de ambiente afetam aspectos específicos da localidade, como o símbolo monetário ou o separador de milhar correto para números:
LC_COLLATE
-
Define a ordem alfabética. Uma de suas finalidades é definir a ordem em que os arquivos e diretórios são listados.
LC_CTYPE
-
Define como o sistema tratará certos conjuntos de caracteres. Ele define, por exemplo, quais caracteres considerar como maiúsculas ou minúsculas.
LC_MESSAGES
-
Define o idioma para exibir as mensagens de programas (principalmente programas do GNU).
LC_MONETARY
-
Define a unidade monetária e o formato da moeda.
LC_NUMERIC
-
Define o formato numérico para valores não-monetários. Sua finalidade principal é definir os separadores de milhar e decimais.
LC_TIME
-
Define o formato de hora e data.
LC_PAPER
-
Define o tamanho padrão do papel.
LC_ALL
-
Sobrepõe todas as outras variáveis, incluindo
LANG
.
O comando locale
mostra todas as variáveis definidas na configuração de localidade atual:
$ locale LANG=pt_BR.UTF-8 LC_CTYPE="pt_BR.UTF-8" LC_NUMERIC=pt_BR.UTF-8 LC_TIME=pt_BR.UTF-8 LC_COLLATE="pt_BR.UTF-8" LC_MONETARY=pt_BR.UTF-8 LC_MESSAGES="pt_BR.UTF-8" LC_PAPER=pt_BR.UTF-8 LC_NAME=pt_BR.UTF-8 LC_ADDRESS=pt_BR.UTF-8 LC_TELEPHONE=pt_BR.UTF-8 LC_MEASUREMENT=pt_BR.UTF-8 LC_IDENTIFICATION=pt_BR.UTF-8 LC_ALL=
A única variável indefinida é LC_ALL
, que pode ser usada para substituir temporariamente todas as outras configurações locais. O exemplo a seguir mostra como o comando date
— sendo executado em um sistema configurado para a localidade pt_BR.UTF-8
— modifica sua saída de forma a cumprir a nova variável LC_ALL
:
$ date seg out 21 10:45:21 -03 2019 $ env LC_ALL=en_US.UTF-8 date Mon Oct 21 10:45:21 -03 2019
A modificação da variável LC_ALL
fez com que ambas as abreviações de dia da semana e nome do mês fossem mostradas em inglês americano (en_US
). Não é obrigatório, entretanto, definir a mesma localidade para todas as variáveis. É possível, por exemplo, ter a linguagem definida como pt_BR
e o formato numérico (LC_NUMERIC
) no padrão americano.
Algumas configurações de localização alteram a forma como os programas lidam com a ordem alfabética e formatos de numeração. Embora os programas convencionais geralmente sejam capazes de escolher corretamente uma localidade comum para essas situações, os scripts podem se comportar de forma inesperada ao tentar ordenar corretamente uma lista de itens em ordem alfabética, por exemplo. Por este motivo, recomenda-se definir a variável de ambiente LANG
para a localidade comum C
, como em LANG=C
, para que o script produza resultados inequívocos, independentemente das definições de localização usadas no sistema onde é executado. A localidade C realiza apenas uma comparação simples de bytes e, portanto, também terá um desempenho melhor do que as outras.
Conversão de codificação
Um texto pode aparecer com caracteres ilegíveis quando exibido em um sistema com uma configuração de codificação de caracteres diferente do sistema onde o texto foi criado. O comando iconv
ajuda a resolver este problema, convertendo o arquivo de sua codificação de caracteres original para a desejada. Por exemplo, para converter um arquivo de nome original.txt
da codificação ISO-8859-1 no arquivo converted.txt
utilizando a codificação UTF-8, o seguinte comando pode ser usado:
$ iconv -f ISO-8859-1 -t UTF-8 original.txt > converted.txt
A opção -f ISO-8859-1
(ou --from-code=ISO-8859-1
) define a codificação do arquivo original e a opção -t UTF-8
(ou --to-code=UTF-8
) define a codificação do arquivo convertido. Para listar todas as codificações suportadas pelo comando iconv
, usamos o comando iconv -l
ou iconv --list
. Ao invés de usar o redirecionamento de saída, como no exemplo, a opção -o converted.txt
ou --output converted.txt
também faz o serviço.
Exercícios Guiados
-
Com base na seguinte saída do comando
date
, qual é o fuso horário do sistema na notação GMT?$ date Mon Oct 21 18:45:21 +05 2019
-
Para qual arquivo o link simbólico
/etc/localtime
deve apontar a fim de tornarEurope/Brussels
o fuso horário local padrão do sistema? -
Os caracteres dos arquivos de texto podem não ser exibidos corretamente em um sistema com uma codificação de caracteres diferente da usada na criação do documento de texto. Como o
iconv
pode ser usado para converter o arquivoold.txt
, codificado em WINDOWS-1252, no arquivonew.txt
, que usa a codificação UTF-8?
Exercícios Exploratórios
-
Qual comando tornará
Pacific/Auckland
o fuso horário padrão para a sessão do shell atual? -
O comando
uptime
mostra, entre outras coisas, a carga média do sistema em números fracionários. Ele usa as configurações de localidade atuais para decidir se o separador de casas decimais deve ser um ponto ou uma vírgula. Se, por exemplo, o local atual estiver definido comode_DE.UTF-8
(o local padrão da Alemanha), ouptime
usará uma vírgula como separador. Sabendo que no idioma inglês americano o ponto é usado como separador, qual comando fará com que ouptime
exiba as frações usando um ponto ao invés de uma vírgula no resto da sessão atual? -
O comando
iconv
substitui todos os caracteres que não pertencem ao conjunto de caracteres de destino por um ponto de interrogação. Se//TRANSLIT
for anexado à codificação de destino, os caracteres não representados no conjunto de caracteres de destino serão substituídos (transliterados) por um ou mais caracteres de aparência semelhante. Como esse método pode ser usado para converter um arquivo de texto UTF-8 chamadoreadme.txt
em um arquivo ASCII simples chamadoascii.txt
?
Resumo
Esta lição aborda a maneira de configurar um sistema Linux para trabalhar com idiomas e configurações de data e hora personalizadas. Também abordamos conceitos e configurações de codificação de caracteres, fundamentais para exibir corretamente o conteúdo de texto. A lição abrange os seguintes tópicos:
-
Como os sistemas Linux selecionam o idioma para exibir as mensagens do shell.
-
Compreender como os fusos horários afetam a hora local.
-
Como identificar o fuso horário apropriado e modificar as configurações do sistema de acordo.
-
O que são as codificações de caracteres e como converter entre elas.
Os comandos e procedimentos abordados foram:
-
Variáveis de ambiente relacionadas a localidade e tempo, como
LC_ALL
,LANG
eTZ
. -
/etc/timezone
-
/etc/localtime
-
/usr/share/zoneinfo/
-
locale
-
tzselect
-
timedatectl
-
date
-
iconv
Respostas aos Exercícios Guiados
-
Com base na seguinte saída do comando
date
, qual é o fuso horário do sistema na notação GMT?$ date Mon Oct 21 18:45:21 +05 2019
Trata-se do fuso horário
Etc/GMT+5
. -
Para qual arquivo o link simbólico
/etc/localtime
deve apontar a fim de tornarEurope/Brussels
o fuso horário local padrão do sistema?O link
/etc/localtime
deve apontar para/usr/share/zoneinfo/Europe/Brussels
. -
Os caracteres dos arquivos de texto podem não ser exibidos corretamente em um sistema com uma codificação de caracteres diferente da usada na criação do documento de texto. Como o
iconv
pode ser usado para converter o arquivoold.txt
, codificado em WINDOWS-1252, no arquivonew.txt
, que usa a codificação UTF-8?O comando
iconv -f WINDOWS-1252 -t UTF-8 -o new.txt old.txt
realizará a conversão desejada.
Respostas aos Exercícios Exploratórios
-
Qual comando tornará
Pacific/Auckland
o fuso horário padrão para a sessão do shell atual?export TZ=Pacific/Auckland
-
O comando
uptime
mostra, entre outras coisas, a carga média do sistema em números fracionários. Ele usa as configurações de localidade atuais para decidir se o separador de casas decimais deve ser um ponto ou uma vírgula. Se, por exemplo, o local atual estiver definido comode_DE.UTF-8
(o local padrão da Alemanha), ouptime
usará uma vírgula como separador. Sabendo que no idioma inglês americano o ponto é usado como separador, qual comando fará com que ouptime
exiba as frações usando um ponto ao invés de uma vírgula no resto da sessão atual?O comando
export LC_NUMERIC=en_US.UTF-8
ouexport LC_ALL=en_US.UTF-8
. -
O comando
iconv
substitui todos os caracteres que não pertencem ao conjunto de caracteres de destino por um ponto de interrogação. Se//TRANSLIT
for anexado à codificação de destino, os caracteres não representados no conjunto de caracteres de destino serão substituídos (transliterados) por um ou mais caracteres de aparência semelhante. Como esse método pode ser usado para converter um arquivo de texto UTF-8 chamadoreadme.txt
em um arquivo ASCII simples chamadoascii.txt
?O comando
iconv -f UTF-8 -t ASCII//TRANSLIT -o ascii.txt readme.txt
realizará a conversão desejada.