Newsgroup: it.comp.os.linux.iniziare
Titolo: Caratteri accentati unicod e printf

C'e' modo di far capire a printf che siamo in Europa?
 
Lunedì..venerdì hanno un byte in piu' per la "ì" e mandano fuori
allineamento la riga di sabato, eccolo:
1 lunedì       1 gennaio     7 luglio
2 martedì      2 febbraio    8 agosto
3 mercoledì    3 marzo       9 settembre
4 giovedì      4 aprile     10 ottobre
5 venerdì      5 maggio     11 novembre
6 sabato        6 giugno     12 dicembre
7 domenica
 
L'input a printf e' (ultime righe):
------------
5
venerdì
5
maggio
11
novembre
6
sabato
6
giugno
12
dicembre
-----------
 
la riga di printf e' (stampa e' la funzione):
 
printf "%s% -13s %s %-10s %2s %s\n" $(stampa)
 
(il tutto mi serve per avere da riga di comando i nomi in diverse
lingue, sfrutto il comando date con ad esempio: LANG=fr_FR.utf8,
e i francesi mica scherzano con gli accenti)
 
P.S. Ovviamente con gli americani l'output e' perfetto:
1 Monday        1 January     7 July
2 Tuesday       2 February    8 August
3 Wednesday     3 March       9 September
4 Thursday      4 April      10 October
5 Friday        5 May        11 November
6 Saturday      6 June       12 December
7 Sunday
 
-- 
Yoda
 


Se si legge il tuo post su Google Groups si capisce ben poco perché
perde completamente l'allinamento nelle tabelle come l'avevi impostato
tu ..., comunque visto che la cosa mi incuriosiva ho cercato un po' in
rete per capire qual era il problema; forse la lettura di questa pagina
può aiutarti:
 
https://unix.stackexchange.com/questions/350240/why-is-printf-shrinking-umlaut
 
 

g-umlaut
 
Me l'ha mezzo risolto si'! m'e' bastato leggere le primissime righe
dove mette una <TAB> in aggiunta agli spazi. A me le tab sono molto
antipatiche e le sostituisco sempre con spazi, pero' in questo caso
e' il male minore. L'allineamento risulta perfetto ciao e grazie!
 
-- 
Yoda
 

 e' il male minore. L'allineamento risulta perfetto ciao e grazie!
 
Ah, se ti va bene così ok! :-)
Io pensavo avresti provato uno degli ultimi script presenti in 
 
https://unix.stackexchange.com/questions/350240/why-is-printf-shrinking-umlaut
 
 
quello che utilizza ${#var} e cioè:
 
 
#!/usr/bin/env bash
 
strings=(
  'Früchte und Gemüse'
  'Milchprodukte'
  '12345678901234567890'
)
 
# Initialize column width
cw=20
 
for str in "${strings[@]}"
do
  # Format column1 with computed padding
  printf -v col1string '%s%*s' "$str" $((cw-${#str})) ''
 
  # Print column1 with computed padding, followed by column2
  printf "%s %s\n" "$col1string" 'col2string'
done
 

Addi' 12 gen 2021 19:56:18, Tony Borlini scrive:

Grazie, adesso lo provo. Non capivo ne' questo (che adesso dovro'
decifrare), ne' soprattutto il fatto che usa zshell invece di bash
(cosa che io non farei mai), ne' infine la storia che parla solo
della dieresi.. uno per ogni lettera accentata sarebbe pesante ciao!
 
-- 
Yoda
 

 done
 
E' perfetto! fa qualsiasi lettera accentata gli si dia in pasto, non
solo la U dieresi, moltissime grazie ciao!!
 
(sai non era solo per il calendario, ma anche altri programmi vanno
male fuori ascii.. ad esempio l'ottimo html2text mi faceva dannare
dovendo correggere a manina tutte le scritte in due o piu' colonne)
 
-- 
Yoda
 

 7 domenica
 
Grazie alla risposta di Tony B. ho potuto sintetizzare cosi'.
 
Per detossicare una stringa (o tutta una parte di riga) in TOSSICA,
la si puo' dare in pasto alla seguente funzione, precisando anche la
lunghezza finale L voluta per la stringa d'uscita in SANA.
---------------------
#!/bin/bash
 
detossica() {
strings=($TOSSICA)
for j in "${strings[@]}"; do
printf -v SANA '%s%*s' "$j" $((L-${#j})) ''
done
}
--------------
 
* * * * *
 
Postilla, per curiosita'.
1. Perche' sotto (()) e' indifferente mettere L oppure $L ?
2. Perche' nell'originale tedeschen riportatomi da Tony c'e':
"#!/usr/bin/env bash" invece del classico: "#!/bin/bash" ?
 
-- 
Yoda
 

 "#!/usr/bin/env bash" invece del classico: "#!/bin/bash" ?
 
In breve per avere maggiore compatibilità in quanto bash potrebbe
trovarsi in una directory diversa da /bin . 
 
https://stackoverflow.com/questions/10376206/what-is-the-preferred-bash-shebang
 
 
https://stackoverflow.com/questions/21612980/why-is-usr-bin-env-bash-superior-to-bin-bash
 
 

 trovarsi in una directory diversa da /bin . 
 
Scusa, maggiore portabilità ... :-D

Addi' 13 gen 2021 20:44:03, Tony Borlini scrive:

Gia'.. capit, e infatti nella Debian 10 /bin non c'e' piu':
$: type bash
bash è /usr/bin/bash
 
c'e' solo il link per compatibilita', in mancanza del quale
entrerebbe in gioco la portabilita' che dici ciao e adesso
mettero' sempre l'env
 
-- 
Yoda
 

 1. Perche' sotto (()) e' indifferente mettere L oppure $L ?
 
Perché così volutamente funziona la valutazione aritmetica.
 
Da bash(1):
 
VALUTAZIONE ARITMETICA
   La shell permette di calcolare espressioni aritmetiche, sotto  certe
   circostanze
   [...]
   Le variabili di shell possono essere usate come operandi; l'espansione
   di parametro è effettuata prima della valutazione dell'espressione.
 
 
   Ciao,
 
 
Alessandro