107.3 Lezione 1
Certificazione: |
LPIC-1 |
---|---|
Versione: |
5.0 |
Argomento: |
107 Attività Amministrative |
Obiettivo: |
107.3 Localizzazione e internazionalizzazione |
Lezione: |
1 di 1 |
Introduzione
Tutte le principali distribuzioni Linux possono essere configurate per utilizzare le impostazioni personalizzate di localizzazione. Queste impostazioni includono definizioni relative alla regione e alla lingua, quali fuso orario, lingua dell’interfaccia e codifica dei caratteri, impostazioni che possono essere modificate durante l’installazione del sistema operativo o in qualsiasi momento successivo.
Le applicazioni si basano su variabili d’ambiente, file di configurazione di sistema e comandi per decidere l’ora e la lingua appropriate da usare; quindi la maggior parte delle distribuzioni Linux condividono un modo standardizzato per regolare le impostazioni di ora e localizzazione. Queste regolazioni sono importanti non solo per migliorare l’esperienza dell’utente, ma anche per assicurare che la tempistica degli eventi di sistema — importante, per esempio, per segnalare problemi legati alla sicurezza — sia calcolata correttamente.
Per essere in grado di rappresentare qualsiasi testo scritto, indipendentemente dalla lingua parlata, i sistemi operativi moderni hanno bisogno di uno standard di codifica dei caratteri di riferimento, e i sistemi Linux non sono diversi. Poiché i computer sono in grado di trattare solo numeri, un carattere di testo non è altro che un numero associato ad un simbolo grafico. Piattaforme di computer diverse possono associare valori numerici diversi allo stesso carattere, quindi uno standard comune di codifica dei caratteri è necessario per renderli compatibili. Un documento di testo creato in un sistema sarà leggibile in un altro sistema solo se entrambi concordano sul formato di codifica e su quale numero è associato a quale carattere, o almeno se sanno gestire la conversione tra i due standard.
La natura eterogenea delle impostazioni di localizzazione nei sistemi basati su Linux si traduce in piccole differenze tra le distribuzioni. Nonostante ciò, tutte le distribuzioni condividono gli stessi strumenti e concetti di base per impostare gli aspetti di internazionalizzazione di un sistema.
Fusi Orari
I fusi orari sono bande discrete approssimativamente proporzionali della superficie terrestre che coprono l’equivalente di un’ora, cioè regioni del mondo che vivono la stessa ora del giorno nello stesso momento. Poiché non esiste una sola longitudine che possa essere considerata l’inizio del giorno per tutto il mondo, i fusi orari sono relativi al primo meridiano, dove l’angolo di longitudine della Terra è definito come 0. L’ora al primo meridiano è chiamata Tempo Universale Coordinato, per convenzione abbreviato in UTC. Per ragioni pratiche, i fusi orari non seguono l’esatta distanza longitudinale dal punto di riferimento (il primo meridiano). Invece, i fusi orari sono adattati artificialmente per seguire i confini dei paesi o altre suddivisioni significative.
Le suddivisioni politiche sono così rilevanti che i fusi orari prendono il nome da qualche importante elemento geografico in quella particolare area, di solito basato sul nome di un grande paese o città all’interno della zona. Tuttavia, i fusi orari sono divisi in base al loro offset temporale rispetto all’UTC e questo offset può anche essere usato per indicare la zona in questione. Il fuso orario GMT-5, per esempio, indica una regione per la quale l’ora UTC è cinque ore avanti, cioè quella regione è 5 ore indietro rispetto all’UTC. Allo stesso modo, il fuso orario GMT+3 indica una regione per la quale l’ora UTC è tre ore indietro. Il termine GMT — da Greenwich Mean Time — è usato come sinonimo di UTC.
Una macchina collegata può essere raggiunta da diverse parti del mondo, quindi è buona pratica impostare l’orologio hardware su UTC (il fuso orario GMT+0) e lasciare la scelta del fuso orario per ogni caso particolare. I servizi cloud, per esempio, sono comunemente configurati per utilizzare UTC, in quanto può aiutare a mitigare le incongruenze occasionali tra l’ora locale e quella dei client o di altri server. Al contrario, gli utenti che aprono una sessione remota sul server potrebbero voler usare il loro fuso orario locale. Quindi, sarà compito del sistema operativo impostare il fuso orario corretto a seconda del caso.
Oltre alla data e all’ora correnti, il comando date
visualizzerà anche il fuso orario attualmente configurato:
$ date Mon Oct 21 10:45:21 -03 2019
L’offset rispetto all’UTC è dato dal valore -03
, che significa che l’ora visualizzata è tre ore meno dell’UTC. Pertanto, l’ora UTC è tre ore avanti, rendendo GMT-3 il fuso orario corrispondente all’ora data. Il comando timedatectl
, che è disponibile nelle distribuzioni che usano systemd, mostra maggiori dettagli sull’ora e la data del 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
Come mostrato nella voce Time zone
, sono accettati anche nomi di fusi orari basati su località — come America/Sao_Paulo
--. Il fuso orario predefinito per il sistema è mantenuto nel file /etc/timezone
, sia dal nome descrittivo completo della zona che dall’offset. I nomi generici dei fusi orari dati dall’offset UTC devono includere Etc
come prima parte del nome. Quindi, per impostare il fuso orario di default su GMT+3, il nome del fuso orario deve essere Etc/GMT+3
.
$ cat /etc/timezone Etc/GMT+3
Anche se i nomi dei fusi orari basati sulle località non richiedono l’offset temporale per funzionare, non sono così semplici da scegliere. La stessa zona può avere più di un nome, il che può renderla difficile da ricordare. Per facilitare questo problema, il comando tzselect
offre un metodo interattivo che guida l’utente verso la corretta definizione del fuso orario. Il comando tzselect
dovrebbe essere disponibile di default in tutte le distribuzioni Linux, poiché è fornito dal pacchetto che contiene i necessari programmi di utilità relativi alla GNU C Library.
Il comando tzselect
sarà utile, per esempio, per un utente che vuole identificare il fuso orario per “São Paulo City” in “Brazil”. tzselect
inizia chiedendo la macro regione della località desiderata:
$ 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
L’opzione 2
è per località (nord e sud) americane, non necessariamente nello stesso fuso orario. È anche possibile specificare il fuso orario con coordinate geografiche o con la notazione di offset, nota anche come formato Posix TZ. Il passo successivo è quello di scegliere il paese:
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
Il territorio del Brasile si estende su quattro fusi orari, quindi le sole informazioni sul paese non sono sufficienti per impostare il fuso orario. Nel prossimo passo tzselect
richiederà all’utente di specificare la regione locale:
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
Non tutti i nomi delle località sono disponibili, ma scegliere la regione più vicina sarà sufficiente. Le informazioni date saranno poi utilizzate da tzselect
per visualizzare il fuso orario corrispondente:
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. Ecco di nuovo quel valore TZ, questa volta su standard output in modo da potete usare il comando /usr/bin/tzselect negli script di shell: America/Sao_Paulo
Il nome del fuso orario risultante, America/Sao_Paulo
, può anche essere usato come contenuto di /etc/timezone
per informare il fuso orario predefinito del sistema:
$ cat /etc/timezone America/Sao_Paulo
Come indicato dall’output di tzselect
, la variabile d’ambiente TZ
definisce il fuso orario per la sessione di shell, qualunque sia il fuso orario di default del sistema. Aggiungendo la linea TZ='America/Sao_Paulo'; export TZ
al file ~/.profile
renderà America/Sao_Paulo
il fuso orario per le future sessioni dell’utente. La variabile TZ
può anche essere temporaneamente modificata durante la sessione corrente, per visualizzare l’ora in un diverso fuso orario:
$ env TZ='Africa/Cairo' date Mon Oct 21 15:45:21 EET 2019
Nell’esempio, il comando env
esegue il comando dato in una nuova sessione sub-shell con le stesse variabili d’ambiente della sessione corrente, tranne la variabile TZ
, modificata dall’argomento TZ='Africa/Cairo'
.
Ora Legale
Molte regioni adottano l’ora legale per una parte dell’anno — quando gli orologi sono in genere portati avanti di un’ora — che potrebbe portare un sistema mal configurato a segnalare l’ora sbagliata durante quel periodo dell’anno.
Il file /etc/localtime
contiene i dati usati dal sistema operativo per regolare il suo orologio di conseguenza. I sistemi Linux standard hanno file per tutti i fusi orari nella directory /usr/share/zoneinfo/
, quindi /etc/localtime
è solo un collegamento simbolico al file di dati effettivo all’interno di quella directory. I file in /usr/share/zoneinfo/
sono organizzati per il nome del fuso orario corrispondente, quindi il file di dati per il fuso orario America/Sao_Paulo
sarà /usr/share/zoneinfo/America/Sao_Paulo
.
Poiché le definizioni per l’ora legale possono cambiare, è importante mantenere aggiornati i file in /usr/share/zoneinfo/
. Il comando di aggiornamento dello strumento di gestione dei pacchetti fornito dalla distribuzione dovrebbe aggiornarli ogni volta che è disponibile una nuova versione.
Lingua e Codifica dei Caratteri
I sistemi Linux possono lavorare con un’ampia varietà di lingue e codifiche di caratteri non occidentali, definizioni note come locales. La configurazione più basilare di ciò è la definizione della variabile d’ambiente LANG
, dalla quale la maggior parte dei programmi di shell identificano la lingua da usare.
Il contenuto della variabile LANG
segue il formato ab_CD
, dove ab
è il codice della lingua e CD
è il codice della regione. Il codice della lingua dovrebbe seguire lo standard ISO-639 e il codice della regione dovrebbe seguire lo standard ISO-3166. Un sistema configurato per usare il portoghese brasiliano, per esempio, dovrebbe avere la variabile LANG
definita a pt_BR.UTF-8
:
$ echo $LANG pt_BR.UTF-8
Come si vede nell’output di esempio, la variabile LANG
contiene anche la codifica dei caratteri prevista per il sistema. ASCII, abbreviazione di American Standard Code for Information Interchange, è stato il primo standard di codifica dei caratteri ampiamente utilizzato per la comunicazione elettronica. Tuttavia, poiché ASCII ha una gamma molto limitata di valori numerici disponibili ed era basato sull’alfabeto inglese, non contiene caratteri usati da altre lingue o un insieme esteso di simboli non alfabetici. La codifica UTF-8 è uno standard Unicode per i normali caratteri occidentali, più molti altri simboli non convenzionali. Come dichiarato dallo Unicode Consortium, il manutentore dello Standard Unicode, questa codifica dovrebbe essere adottata di base per assicurare la compatibilità tra le piattaforme di computer:
Lo standard Unicode fornisce un numero unico per ogni carattere, non importa quale piattaforma, dispositivo, applicazione o lingua. È stato adottato da tutti i moderni fornitori di software e ora permette ai dati di essere trasportati attraverso molte piattaforme, dispositivi e applicazioni diverse senza corruzione. Il supporto di Unicode costituisce la base per la rappresentazione di lingue e simboli in tutti i principali sistemi operativi, motori di ricerca, browser, computer portatili e smartphone - oltre a Internet e al World Wide Web (URL, HTML, XML, CSS, JSON, ecc.). (…) lo standard Unicode e la disponibilità di strumenti che lo supportano sono tra le più significative tendenze recenti della tecnologia software globale.
Cos'è Unicode?
Alcuni sistemi possono ancora usare standard definiti da ISO — come lo standard ISO-8859-1 — per la codifica dei caratteri non-ASCII. Tuttavia, tali standard di codifica dei caratteri dovrebbero essere deprecati in favore degli standard di codifica Unicode. Tuttavia, tutti i maggiori sistemi operativi tendono ad adottare lo standard Unicode di default.
Le impostazioni di localizzazione a livello di sistema sono configurate nel file /etc/locale.conf
. La variabile LANG
e altre variabili relative al locale sono assegnate in questo file come una normale variabile di shell, per esempio:
$ cat /etc/locale.conf LANG=pt_BR.UTF-8
Gli utenti possono usare una configurazione personalizzata del locale ridefinendo la variabile d’ambiente LANG
. Può essere fatto solo per la sessione corrente o per le sessioni future, aggiungendo la nuova definizione al profilo Bash dell’utente in ~/.bash_profile
o ~/.profile
. Finché l’utente non effettua il login, comunque, il locale di sistema predefinito sarà ancora usato da programmi indipendenti dall’utente, come la schermata di login del display manager.
Tip
|
Il comando |
Oltre alla variabile LANG
, altre variabili d’ambiente hanno un effetto su aspetti specifici del locale, come il simbolo di valuta da usare o il corretto separatore delle migliaia per i numeri:
LC_COLLATE
-
Imposta l’ordine alfabetico. Uno dei suoi scopi è quello di definire l’ordine in cui file e directory sono elencati.
LC_CTYPE
-
Imposta come il sistema tratterà certi insiemi di caratteri. Definisce, per esempio, quali caratteri considerare come uppercase o lowercase.
LC_MESSAGES
-
Imposta il linguaggio per visualizzare i messaggi dei programmi (per lo più programmi GNU).
LC_MONETARY
-
Imposta l’unità monetaria e il formato della valuta.
LC_NUMERIC
-
Imposta il formato numerico per i valori non monetari. Il suo scopo principale è quello di definire le migliaia e i separatori decimali.
LC_TIME
-
Imposta il formato dell’ora e della data.
LC_PAPER
-
Imposta il formato standard della carta.
LC_ALL
-
Sovrascrive tutte le altre variabili, incluso
LANG
.
Il comando locale
mostrerà tutte le variabili definite nella configurazione del locale corrente:
$ 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=
L’unica variabile non definita è LC_ALL
, che può essere usata per sovrascrivere temporaneamente tutte le altre impostazioni di localizzazione. L’esempio seguente mostra come il comando date
— eseguito in un sistema configurato con il locale pt_BR.UTF-8
— modificherà il suo output per conformarsi alla nuova variabile 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
La modifica della variabile LC_ALL
ha reso entrambe le abbreviazioni per il giorno della settimana e il nome del mese da mostrare in inglese americano (en_US
). Non è obbligatorio, tuttavia, impostare lo stesso locale per tutte le variabili. È possibile, per esempio, avere la lingua definita a pt_BR
e il formato numerico (LC_NUMERIC
) impostato allo standard americano.
Alcune impostazioni di localizzazione cambiano il modo in cui i programmi trattano l’ordine alfabetico e i formati dei numeri. Mentre i programmi convenzionali sono solitamente preparati a scegliere correttamente un locale comune per queste situazioni, gli script possono comportarsi in modo inaspettato quando cercano, per esempio, di ordinare in ordine alfabetico una lista di elementi. Per questo motivo, si raccomanda di impostare la variabile d’ambiente LANG
al locale comune C
, come in LANG=C
, così lo script produrrà risultati non ambigui, indipendentemente dalle definizioni di localizzazione usate nel sistema in cui viene eseguito. Il locale C conduce solo un semplice confronto bytewise, quindi avrà anche prestazioni migliori degli altri.
Conversione della Codifica
Il testo può apparire con caratteri incomprensibili quando viene visualizzato su un sistema con una configurazione di codifica dei caratteri diversa dal sistema in cui il testo è stato creato. Il comando iconv
può essere usato per risolvere questo problema, convertendo il file dalla sua codifica di caratteri originale a quella desiderata. Per esempio, per convertire un file chiamato original.txt
dalla codifica ISO-8859-1 al file chiamato converted.txt
usando la codifica UTF-8 si può usare il seguente comando:
$ iconv -f ISO-8859-1 -t UTF-8 original.txt > converted.txt
L’opzione -f ISO-8859-1
(o --from-code=ISO-8859-1
) imposta la codifica del file originale e l’opzione -t UTF-8
(o --to-code=UTF-8
) imposta la codifica per il file da convertire. Tutte le codifiche supportate dal comando iconv
sono elencate con il comando iconv -l
o iconv --list
. Invece di usare il reindirizzamento dell’output, come nell’esempio, si possono usare anche le opzioni -o converted.txt
o --output converted.txt
.
Esercizi Guidati
-
In base al seguente output del comando
date
, qual è il fuso orario del sistema in notazione GMT?$ date Mon Oct 21 18:45:21 +05 2019
-
A quale file dovrebbe puntare il link simbolico
/etc/localtime
per rendereEurope/Brussels
l’ora locale di default del sistema? -
I caratteri nei file di testo potrebbero non essere resi correttamente in un sistema con una codifica dei caratteri diversa da quella usata nel documento di testo. Come si può usare
iconv
per convertire il file codificato WINDOWS-1252old.txt
nel filenew.txt
usando la codifica UTF-8?
Esercizi Esplorativi
-
Quale comando renderà
Pacific/Auckland
il fuso orario predefinito per la sessione corrente della shell? -
Il comando
uptime
mostra, tra le altre cose, il carico medio del sistema in numeri frazionari. Utilizza le impostazioni locali correnti per decidere se il separatore decimale debba essere un punto o una virgola. Se, per esempio, il locale corrente è impostato sude_DE.UTF-8
(lo standard della Germania),uptime
userà una virgola come separatore. Sapendo che nella lingua inglese americana si usa il punto come separatore, quale comando farà sì cheuptime
visualizzi i frazionari usando un punto invece di una virgola per il resto della sessione corrente? -
Il comando
iconv
sostituirà tutti i caratteri al di fuori dell’insieme di caratteri di destinazione con un punto interrogativo. Se//TRANSLIT
è aggiunto alla codifica di destinazione, i caratteri non rappresentati nel set di caratteri di destinazione saranno sostituiti (traslitterati) da uno o più caratteri simili. Come potrebbe essere usato questo metodo per convertire un file di testo UTF-8 chiamatoreadme.txt
in un semplice file ASCII chiamatoascii.txt
?
Sommario
Questa lezione tratta del come configurare un sistema Linux per lavorare con lingue e impostazioni temporali personalizzate. Vengono trattati anche i concetti e le impostazioni di codifica dei caratteri, che sono molto importanti per rendere correttamente il contenuto del testo. La lezione tratta i seguenti argomenti:
-
Come i sistemi Linux selezionano la lingua per visualizzare i messaggi della shell.
-
Capire come i fusi orari influenzano l’ora locale.
-
Identificare il fuso orario appropriato e modificare di conseguenza le impostazioni di sistema.
-
Cosa sono le codifiche dei caratteri e come convertirle.
I comandi e le procedure affrontati sono stati:
-
Variabili d’ambiente relative alla lingua e al tempo, come
LC_ALL
,LANG
eTZ
. -
/etc/timezone
-
/etc/localtime
-
/usr/share/zoneinfo/
-
locale
-
tzselect
-
timedatectl
-
date
-
iconv
Risposte agli Esercizi Guidati
-
In base al seguente output del comando
date
, qual è il fuso orario del sistema in notazione GMT?$ date Mon Oct 21 18:45:21 +05 2019
È il fuso orrio
Etc/GMT+5
. -
A quale file dovrebbe puntare il link simbolico
/etc/localtime
per rendereEurope/Brussels
l’ora locale di default del sistema?Il link
/etc/localtime
dovrebbe puntare a/usr/share/zoneinfo/Europe/Brussels
. -
I caratteri nei file di testo potrebbero non essere resi correttamente in un sistema con una codifica dei caratteri diversa da quella usata nel documento di testo. Come si può usare
iconv
per convertire il file codificato WINDOWS-1252old.txt
nel filenew.txt
usando la codifica UTF-8?Il comando
iconv -f WINDOWS-1252 -t UTF-8 -o new.txt old.txt
eseguirà la conversione desiderata.
Risposte agli Esercizi Esplorativi
-
Quale comando renderà
Pacific/Auckland
il fuso orario predefinito per la sessione corrente della shell?export TZ=Pacific/Auckland
-
Il comando
uptime
mostra, tra le altre cose, il carico medio del sistema in numeri frazionari. Utilizza le impostazioni locali correnti per decidere se il separatore decimale debba essere un punto o una virgola. Se, per esempio, il locale corrente è impostato sude_DE.UTF-8
(lo standard della Germania),uptime
userà una virgola come separatore. Sapendo che nella lingua inglese americana si usa il punto come separatore, quale comando farà sì cheuptime
visualizzi i frazionari usando un punto invece di una virgola per il resto della sessione corrente?Il comando
export LC_NUMERIC=en_US.UTF-8
oexport LC_ALL=en_US.UTF-8
. -
Il comando
iconv
sostituirà tutti i caratteri al di fuori dell’insieme di caratteri di destinazione con un punto interrogativo. Se//TRANSLIT
è aggiunto alla codifica di destinazione, i caratteri non rappresentati nel set di caratteri di destinazione saranno sostituiti (traslitterati) da uno o più caratteri simili. Come potrebbe essere usato questo metodo per convertire un file di testo UTF-8 chiamatoreadme.txt
in un semplice file ASCII chiamatoascii.txt
?Il comando
iconv -f UTF-8 -t ASCII//TRANSLIT -o ascii.txt readme.txt
effettuerà la conversione desiderata.