|
ot Rumen_Yotov(5-11-2004)
reiting (17)
[ dobre ]
[ zle ]
Variant za otpechatvane
Izpolzvane na unikod s Linuks (prevod)
http://software.newsforge.com/article.pl?sid=04/10/27/1631244
Posledniiat put stavashe duma za unikod i negovite predimstva
(bel.pr. ima predishna obzorna statiia za unikod, no mislia che
tazi e po-praktichnata). Ako ste reshili, che iskate da
polzvate tezi predimstva, eto kak da nastroite edna Linuks
sistema ot ne-unikod kodirane kum unikod takova.
Predi vsichko proverete dali veche izpolzvate unikod lokal.
Komandata 'locale' izvezhda stoinostite na promenlivite na
sredata, koito imat otnoshenie kum nastroikata na lokala.
Pulno opisanie na tehnite stoinosti e nalichno v pomoshtnite
(man) stranitsi na lokala. Obiknovenno, naimenovaniiata na
lokala se sustoiat ot kod na ezik s malki bukvi, sledvan ot
dolna cherta (underscore) i koda na durzhava s golemi bukvi
(napr. en_US za amerikanski angliiski). Imenata na lokali,
koito izpolzvat unikod kodirane dopulnitelno zavurshvat s
".UTF-8." Ako podobni imena prisustvat v rezultata sled
startirane na 'locale' to Vie veche izpolzvate unikod
lokal.
Ako vse pak triabva da prenastroivate sistemata si, purvo
napravete rezervno kopie na vazhnite si failove, tui kato shte
transformirate vashite diskovi failovi sistemi. Zabelezhete,
che rezervnite kopiia napraveni predi transformatsiiata na
failovata sistema i sled neia sa do izvestna stepen
nesuvmestimi. Kakto otbeliazahme predi tova (v druga statiia),
operatsionnata sistema i mnogo programi ne vzemat predvid s
kakvi simvoli e predstaveno imeto na faila. Izmezhdu
programite imashti tozi problem e i 'tar' -programata, koiato e
edin chesto izpolzvan instrument za suzdavane na rezervni
kopiia. Ako v momenta Vie izpolzvate 'en_US' lokal i niakoi
imena na failove sudurzhat simvola "ä" (germansko A
umlaut), to toi se predstavia ot edinichen bait: hex 0xE4.
Sled kato preminete kum unikod (UTF-8), sushtata bukva shte se
predstavia ot dva baita: 0xC3 0xA4. Obache nito failovata
sistema nito 'tar' "znaiat", che tezi dve razlichni
posledovatelnosti ot baitove mogat da predstavliavat edin i
susht simvol. Ako vuzstanovite staroto ime na fail ot rezervno
kopie (bakup) sled preminavane kum unikod lokal, ednobaitova
kodirovka shte bude izpolzvana v imeto na vuzstanoven fail,
praveiki imeto razlichno ot tova pri novata (unikod) versiia.
Pri polzvane na UTF-8 lokal, tozi edinichen bait niama da
predstavliava "ä" a po-skoro nevalidna UTF-8
posledovatelnost, i shte bude predstaven chrez zamestitel ili
chrez osmichno predstaviane samo na 'greshniia' bait. Taka che,
ako Vie vuzstanoviavate danni ot stari kopiia ili arhivi sled
kato preminete kum UTF-8, mozhe da se nalozhi da izpolzvate
programa za konvertirane, podobna na tazi za koiato shte
spomenem po-dolu vurhu imenata na vuzstanovenite failove za
da mozhe te da se izobraziavat pravilno.
Vuzmozhnostta da se polzva UTF-8 lokal bez da triabva da se
investira prekaleno mnogo trud za postiganeto mu, iziskva
glibc (GNU C library) versiia 2.2 ili po-nova (vsiaka
otnositelno suvremenna distributsiia bi triabvalo da ia ima).
Mozhete da proverite Vashata versiia startiraiki
/lib/libc.so.6.
Sledvashtiiat paragraf predstavia stupka po stupka opisanie na
nachina po koito da izvurshite transformatsiiata. Povecheto
operatsii, opisani tuk triabva da se izvurshat kato
administrator (root).
Zadavane na lokala
Opredeleni promenlivi na sredata kazvat na prilozheniiata koi
lokal da se izpolzva. Po-chesto izpolzvanite promenlivi
sa:
* LC_ALL -- Kogato e zadadena, stoinostta na tazi
promenliva pripokriva (zamestva) stoinostite na vsichki drugi
LC_* promenlivi.
* LC_* -- Tezi promenlivi kontrolirat razlichni aspekti
na lokala. Naprimer, LC_CTYPE kontrolira nachina za
transformatsiia ot golemi-kum-malki bukvi, dokato LC_TIME
kontrolira formata za data i vreme. LC_MESSAGES opredelia
ezika, izpolzvan v suobshteniiata ot prilozheniiata. Podrobnosti
mogat da se vidiat v pomoshtnata stranitsa na locale(7).
* LANG -- Ako LC_ALL ne e zadadeno, togava parametri na
lokala, chiito suotvetni LC_* promenlivi ne sa zadadeni
poluchavat stoinostta po podrazbirane na LANG.
Predi da promenite svoia lokal, ne zabraviaite da zapazite
vuv fail izhodnata informatsiia ot 'locale', koiato pokazva
Vashiiat tekusht lokal. Sushto taka, zapishete niakude izhodiashtata
informatsiia ot 'locale -k LC_CTYPE | fgrep charmap' (Vasheto
tekushto kodirane na simvolite), tui kato shte se nuzhdaete ot
tazi informatsiia po-kusno.
Za da posochite na prilozheniiata da izpolzvat UTF-8 kodirane,
i predpolagaiki, che U.S. angliiski e Vashiiat predpochitan ezik
(za nas BG), mozhe da izpolzvate slednata komanda:
export LC_ALL=en_US.UTF-8
Prilozheniia startirani sled tova ot sushtiiat terminalen
prozorets shte budat nastroeni za UTF-8. Za da proverite dali
tova e taka, mozhete naprimer da izpolzvate komandata 'wc'.
'wc -c' shte Vi pokazhe broiat na baitovete a 'wc -m' broiat na
simvolite v fail ili danni, cheteni ot standartniia vhod (krai
na teksta e Enter ili Ctrl-D). Pri UTF-8 lokal, ako teksta
sudurzha ne-ASCII simvoli, broia na baitovete shte bude po-goliam
ot broia na simvolite. Naprimer:
user@host:~$ wc -c
Bär
5
user@host:~$ wc -m
Bär
4
Tazi tri-bukvena duma e kodirana chrez 4-baita pri UTF-8
(dopulnitelniiat simvol ili bait e markera za krai na
red).
Ako Vashiiat test se provali (t.e. wc izvede edin i susht broi
pri dvata sluchaia), to veroiatno Vashata sistema ne pritezhava
UTF-8 - definitsii na lokal, i Vie shte triabva da izpolzvate
'localedef' za da gi generirate. Naprimer, ako en_US.UTF-8
lipsva, to mozhe da go generirate ot 'en_US' izpolzvaiki:
localedef -i en_US -f UTF-8 en_US.UTF-8
Tui kato stoinostite na promenlivite ot obkruzhenieto sa
validni samo v ramkite na sesiiata, to triabva Vie da
postavite Vashite komandi za eksport v /etc/profile taka che,
te da budat startirani za vseki potrebitel, kogato
sledvashtiiat put toi/tia se vklyuchva v sistemata. Ako rabotite v
KDE, shte triabva da izlezete i otnovo da vlezete, taka che
promenlivite ot obkruzhenieto da budat procheteni otnovo i da
budat aktivirani. GNOME izglezhda vinagi izpolzva UTF-8
vutreshno, dori ako lokala ne e UTF-8-baziran. Bez znachenie
kakuv desktop-sreda izpolzvate, mozhe da se nalozhi da
izlezete ako polzvate menazher za vhod (t.e. KDM ili GDM),
restartiraite X Window sistemata chrez natiskane na
'Ctrl-Alt-Backspace' taka che, /etc/profile da bude procheten
nanovo i vsichki prilozheniia da znaiat za noviia lokal.
Konvertirane na failovite sistemi
Sledvashtata stupka e da se konvertirat (transformirat)
Vashite failovi sistemi. Tova e edinstvenata riskova chast ot
preminavaneto (kum UTF-8), taka che, napravete kopie (bakup)
na vsichki vazhni danni ot diskovete si ako vse oshte ne ste go
napravili.
Kakto be otbeliazano po-gore, iadroto na Linux ne se
interesuva ot kodiraneto na simvolite. Za chesto izpolzvanite
failovi sistemi (ext2, ext3, ReiserFS, i drugi failovi
sistemi, tipichni za YUniks-ite), informatsiiata che dadena
failova sistema izpolzva edno ili drugo kodirane ne se
suhraniava kato chast ot failovata sistema. Samo
kontrolirashtite lokala promenlivi ot obkruzhenieto "kazvat" na
softuera che dadeni baitove triabva da se izobraziat kato edin
ili drug simvol. Failovite sistemi raboteshti na Microsoft
Windows mashini (NTFS i FAT) sa razlichni po tova, che te
suhraniavat na diska imenata na failovete izpolzvaiki dadeno
kodirane. Qdroto triabva da prevede tova kodirane kum
sistemnoto kodirane, koeto shte bude UTF-8 v nashiiat
sluchai.
Ako vuv Vashata sistema imate Windows dialove, triabva da
vnimavate te da budat montirani, izpolzvaiki pravilnite
optsii. Za FAT i ISO9660 (izpolzvano pri CD-ROM-mite)
dialovete, optsiiata 'utf8' kara sistemata da "prevede"
kodiraneto na failovata sistema kum UTF-8. Za NTFS, nls=utf8
e preporuchanata optsiia (utf8 sushto bi triabvalo da raboti).
Dobavete tezi optsii pri montirane na failovi sistemi ot tezi
tipove v Vashiia /etc/fstab za da gi montirate s pravilnite
nastroiki. Fragment ot /etc/fstab veroiatno shte izglezhda taka
(drugi optsii mogat da prisustvat suobrazno Vashite
nastroiki):
/dev/hda2 /mnt/c ntfs
defaults,ro,nls=utf8 1 0
/dev/hda3 /mnt/d vfat
defaults,quiet,utf8 1 0
/dev/cdrom /mnt/cdrom iso9660
defaults,noauto,users,ro,utf8 0 0
# If using supermount, add "utf8" to the options _after_
two dashes, e.g.
#none /mnt/cdrom supermount
fs=iso9660,dev=/dev/cdrom,--,auto,ro,utf8 0 0
/dev/fd0 /mnt/floppy auto
defaults,noauto,users,rw,quiet,utf8 0 0
Sled kato promenite /etc/fstab, triabva da montirate otnovo
suotvetnite failovi sistemi chrez 'mount -o remount
/mnt/mount-point' komandata za vsiaka edna ot tiah. Ne-ASCII
simvolite v imenata na failove ot tezi failovi sistemi bi
sledvalo otnovo da se izbraziavat pravilno. Zabelezhete, che
tova iziskva iadroto da mozhe da konvertira pravilno mezhdu
razlichnite simvolni nabori, taka che, poddruzhkata na UTF-8
triabva da bude kompilirana direktno v iadroto ili nalichna
kato modul. Tazi optsiia se namira v "File systems"->"Native
Language Support"->"NLS UTF-8" v programata za konfiguratsiia
na iadroto. V zavisimost ot koe kodirane izpolzvat Vashite
Windows dialove, sushto taka mozhe da se nalozhi da kompilirate
poddruzhka za tiahnoto kodirane. Proverete tazi stranitsa [1]
za spisuk ot kodovite stranitsi, izpolzvani ot razlichnite
ezikovi versii na FAT. NTFS vinagi izpolzva vutreshno Unicode
i ne se nuzhdae ot nikakvi NLS optsii na iadroto osven tezi za
UTF-8 poddruzhka.
Sobstvenite failovi sistemi na Linuks ne suhraniavat
informatsiia otnosno izpolzvanoto kodirane, taka che triabva Vie
fizicheski da promenite imenata na vsichki failove kum novoto
kodirane, za razlika ot prostoto povtorno montirane na FAT i
NTFS tomovete. Na teoriia vsichko koeto triabva da napravite e
da izpulnite:
mv original-filename filename-in-UTF-8-encoding
za vseki fail. Na praktika, neshtata obiknovenno sa malko
po-slozhni. Predi vsichko, mozhe veche da imate UTF-8-kodirani
failovi imena na diska si bez da go znaete. Naprimer, niakoi
GNOME prilozheniia suzdavat UTF-8 failovi imena, nezavisimo ot
izpolzvaniiat lokal, i kbd (nabor ot programi za rabota s
konzolnite shriftove) idva s primeren fail narechen
♪♬ (dve muzikalni noti) v dokumentatsiiata si. Po
vreme na konversiiata tezi failove triabva da se identifitsirat
i tehnite imena da ne se promeniat.
Druga osobenost za koiato da se vnimava sa direktoriite. Tui
kato i imeto na direktoriiata i imenata na failovete v neia
mozhe da se nuzhdaiat ot preimenuvane kum tehnite UTF-8
ekvivalenti, ne mozhete prosto da si suzdadete spisuk s
vsichki failove i direktorii i togava da izvurshite 'mv
old-name new-name' za vseki edin/edna ot tiah. Ako go
napravite i purvo preimenuvate direktoriia, sled tova putiat
izpolzvan za dostup do failovete v neia niama poveche da bude
validen. Sledovatelno redut e vazhen. V durvoto na
direktoriite, listata (t.e. failovete) triabva da budat
preimenuvani purvi, sled tova direktoriite ot nai-nisko
nivo, sled tiah tehnite roditelski direktorii i taka
natatuk.
Po-dolu shte namerite skript, koito opitva da izvurshi
avtomatichno neobhodimite preobrazuvaniia. Imaite predvid, che
negovoto izpolzvane mozhe da bude opasno -- purvo si
suhranete vazhnite danni! Vupreki che raboti v povecheto
sluchai, tozi skript ne e bezgreshen. Za da zapazim neshtata
prosti, toi ne obrabotva niakoi spetsialni sluchai, kato
intervali vutre v putishta za montirane (koito realno sa riadko
sreshtani) i failovi sistemi, montirani samo za chetene (ne e
ochevidno kakvo triabva da se napravi s tiah; ako imate
namerenie da konvertirate dial ot tvurd disk, montiran samo
za chetene, ruchno go montiraite otnovo za chetene/pisane chrez:
'mount -o remount,rw /some/mount/path' predi da izpulnite
skripta). V zavisimost ot razmera na failovata sistema i
broia failove koito triabva da se konvertirat, izpulnenieto na
tozi skript mozhe otneme dosta vreme, oshte poveche che s ogled
prostota toi e dalech ot optimalen (vsichko tova veroiatno mozhe
da bude napraveno na Perl po mnogo po-stegnat nachin).
Ne zabraviaite da promenite 'orgcharset' v skripta po-dolu
kum imeto na Vasheto staro kodirane, koeto shte poluchite kato
rezultat sled izpulnenie na edna ot predishnite ni stupki,
izpolzvaiki: locale -k LC_CTYPE.
#!/bin/sh
fstab=/etc/fstab
orgcharset=INVALID_CHARSET_NAME
export LC_ALL=POSIX
# Find filesystems suitable for conversion
filesystems=`awk
'!/vfat|ntfs|iso9960|udf|auto|autofs|swap|subfs|sysfs|proc|devpts|nfs|smbfs|^#/{print
$2}' "$fstab"`
# Locate files whose names need to be converted and sort
the list
find $filesystems -xdev | {
while read; do
# Check if the filename needs conversion (i.e. is not a
correct UTF-8 string)
if ! echo `basename "$REPLY"` | iconv -f UTF-8 -t UTF-8
&>/dev/null; then
echo "$REPLY"
fi
done
} | sort -r | {
# Rename files
while read; do
dirname=`dirname "$REPLY"`
orgfname=`basename "$REPLY"`
newfname=`echo "$orgfname" | iconv -f "$orgcharset" -t
UTF-8`
if [ $? -ne 0 ]; then
echo "Error: iconv failed for $REPLY. Skipping." >&2
continue
fi
mv "$REPLY" "$dirname"/"$newfname"
done
}
Konvertirane na tekstovi failove
Normalno e za tekstovite failove na potrebitelia e da se
polzva podrazbirashtoto se sistemno kodirane, taka che sled
preminavane kum UTF-8 Vie veroiatno iskate sushto taka da
konvertirate svoite tekstovi failove. Konvertiraneto na
konfiguratsionnite failove realno ne e neobhodimo, tui kato
programi koito mogat da obrabotvat ne-ASCII danni v svoite
konfiguratsii pochti vinagi veche izpolzvat UTF-8 za
suhranenie. Mozhete da konvertirate edinichen tekstovi fail s
'iconv':
iconv -f old-encoding -t UTF-8 filename > temp.tmp && mv
temp.tmp filename
Napomniane, proverete dali naistina raboti predi da go
izpolzvate vurhu vazhni danni.
Namirane na simvolni nabori (fontove) s unikod
poddruzhka
Unikod simvoli za tekstovata konzola obiknoveno sa vklyucheni
v po-golemite Linuks distributsii. Za da aktivirate unikod
(UTF-8) v konzolata, startiraite 'unicode_start'
('unicode_stop' za da se vurnete kum predishniiat ednobaitov
metod na kodirane).
Za da imate vuzmozhnost naistina da vizhdate unikod
simvolite, izobraziavani ot X-prilozheniiata, e nuzhno da si
svalite i instalirate Unikod simvolni nabori (fonts).
Bitstream Vera e "TrueType font" koito se razprostraniava pod
otvoren litsenz i kum momenta se dostavia s mnogo Linuks
distributsii. Za suzhalenie toi sudurzha malko simvoli.
Razshirena versiia, v koiato ima poddruzhka na povecheto latinski
simvoli s udareniia, se naricha Hunky Font. Familiia ot unikod
simvolni nabori, narechena 'FreeFont' sushto e nalichna pod Obsht
Publichen Litsenz (GPL). Ima sushto taka niakolko
"free-as-in-beer" simvolni nabori v Internet, vklyuchitelno
"Microsoft Core Fonts" (paket sudurzhasht mezhdu drugoto i
razprostranenite shriftove "Arial" i "Times New Roman"),
Bitstream Cyberbit (nalichen e samo Roman stil, no zatova puk
ima mnogo dobra poddruzhka na unikod), Gentium, i mnogo
drugi. Razbira se sushtestvuvat i mnogo komersialni simvolni
nabori, koito mogat da se izpolzvat v X.
Obobshtenie
Izpolzvaneto na unikod UTF-8 dava mnogo predimstva pred
izpolzvaneto na ednobaitov lokal. Nai-malkoto ot tiah e
vuzmozhnostta da se izpolzvat vsiakakvi simvoli v imenata na
failove i v komandniia red. Osnovnoto predimstvo na unikod,
obache, e v tova che mnogo po-lesno stava obmena
(prehvurlianeto) na danni i se podobriava suvmestimostta v
sravnenie s vseki edin drug simvolen nabor. UTF-8 e
prednaznachen da zameni ASCII v budeshte, taka che v niakoi
moment "tekstovi fail" shte znachi "UTF-8 fail" sushto kakto v
nastoiashtiiat moment toi znachi "ASCII fail".
Neprekusnato obnoviavana versiia na tazi statiia mozhe da se
nameri na ueb-saita na avtora.
Michał Kosmulski e student vuv Varshavskiia universitet
i Varshavskiia universitet za tehnologii.
Vruzki
1. "Last time" - http://software.newsforge.com/article.pl?sid=04/10/27/1628230&tid=130
2. "locale man pages" - http://www.die.net/doc/linux/man/man1/locale.1.html
3. "environment variables" - http://en.wikipedia.org/wiki/Environment_variable
4. "this page" - http://www.microsoft.com/windowsxp/home/using/productdoc/en/default.asp?url=/WINDOWSXP/home/using/productdoc/en/country.asp
5. "Bitstream Vera" - http://www.gnome.org/fonts/
6. "Hunky Font" - http://www.yoper.com/ariszlo/hunky.html
7. "FreeFont" - http://www.nongnu.org/freefont/
8. "Microsoft Core Fonts" - http://corefonts.sourceforge.net/
9. "Bitstream Cyberbit" - http://ftp.netscape.com/pub/communicator/extras/fonts/windows/
10. "Gentium" - http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&item_id=Gentium
11. "Unicode Consortium" - http://unicode.org/
12. "Unicode page in Wikipedia" - http://en.wikipedia.org/wiki/Unicode
13. "UTF-8 page in Wikipedia" - http://en.wikipedia.org/wiki/UTF-8
14. "man page for UTF-8" - http://www.zevils.com/cgi-bin/man/man2html?utf8+7
15. "man page for Unicode" - http://www.zevils.com/cgi-bin/man/man2html?7+unicode
16. "UTF-8 and Unicode FAQ" - http://www.cl.cam.ac.uk/~mgk25/unicode.html
17. "Unicode HOWTO" - http://tldp.org/HOWTO/Unicode-HOWTO.html
18. "updated version of this article" - http://hektor.umcs.lublin.pl/~mikosmul/computing/articles/linux-unicode.html
19. "Michał Kosmulski" - http://hektor.umcs.lublin.pl/~mikosmul/
20. "Warsaw University" - http://www.uw.edu.pl/en/
21. "Warsaw University of Technology" - http://www.pw.edu.pl/english/index.html
<< Vuvedenie v RSBAC, chast II | SAGA ZA POSIX ili UVOD V POSIX'IVIZMA >>
|
|