ot Rumen_Yotov(5-11-2004)

reiting (17)   [ dobre ]  [ zle ]

Printer Friendly 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 >>