Add a New Comment Rich Markup
No trur eg (igjen) eg har klart å fiksa problemet. Oppsummert: «BSD look» har ingen problem med UTF-8 så lenge ein køyrer under eit UTF-8-lokale. I utgangspunktet skulle ein derfor trudd ein måtte køyra under same lokale når ein genererer ordlistefilene (sidan sorteringa av ord er lokalespesifikk). Men det stemmer ikkje. På manualsida https://www.freebsd.org/cgi/man.cgi?query=look&apropos=0&sektion=0&manpath=FreeBSD+11-current&arch=default&format=html står det: Lines are not compared according to the current locale's collating order. Input files must be sorted with LC_COLLATE set to `C'. Men kva med «look» frå linux-util? Her står det ingenting tilsvarande på manualsida. Men om me ser i kjeldekoden https://github.com/karelzak/util-linux/blob/master/misc-utils/look.c finn me at programmet samanliknar tekstar med strncmp() i staden for med strcoll(). Med andre ord antar «look» same sorterings-/kollateringsrekkefølgje som under C-lokalet. Så dei to variantane av «look»-verktøyet skal altså oppføra seg likt. Konklusjonen er at om me sorterer ordlista under C-lokalet men køyrer «look» under eit vilkårleg (UTF-8-)lokale, så skal alt fungera heilt fint! Iallfall fram til nokon gjer «look»-verktøya meir lokale-bevisst … Lukkar saka igjen, og reknar problemet som løyst i revisjon 169.
Opna saka igjen. Det viste seg at løysinga berre tilsynelatande fungerte skikkeleg. For eksempel fungerte ikkje eit oppslag på «åtøle» lenger.
OK, no trur eg har funne ein måte å fiksa det. Her kjem ei oppsummering: BSD look likar ikkje UTF-8 teikn om ein køyrer under C-lokalet (kanskje ikkje så rart), mens look frå util-linux ikkje har noko problem med det. Men viss me brukar argumentet «-d» kan me unngå det. Her er ein liten test: LC_ALL=nn_NO.UTF-8 sort -d fullform_nn.dat > ord_utf8.txt LC_ALL=C sort -d fullform_nn.dat > ord_c.txt LC_ALL=nn_NO.UTF-8 look -d møllmiddel ord_utf8.txt LC_ALL=nn_NO.UTF-8 look -d møllmiddel ord_c.txt LC_ALL=C look -d møllmiddel ord_utf8.txt LC_ALL=C look -d møllmiddel ord_c.txt Av dei fire «look»-kommandoane fungerer 1 og 2 med BSD look (3 og 4 gjev feilmeldingar), mens 2 og 4 fungerer med look frå util-linux (ingen gjev feilmeldingar, men 1 og 3 gjev ingen resultat). Ergo vil variant 2 fungera alle plassar. Me sorterer derfor med «LC_ALL=C sort -d» og køyrer «look -d» (utan nokon «LC_ALL»). Men det er eit problem. «look -d» (frå util-linux) har ein annan definisjon av «-d» enn kva «sort -d» har. Det meiner eg er ein feil i «look -d», og har meldt han inn på https://github.com/karelzak/util-linux/issues/284 Men uansett er konsekvensen at «look -d» ser vekk frå blankteikn ved oppslag, og sidan me skil ord med tabulator, får me ikkje lenger fullstendig filtrering. Eit oppslag på «hei» vil for eksempel også finna «heissjakt». Derfor må me etterfiltrera søkeresultata for å fjerna desse falske treffa. Likevel hjelper filtreringa godt på (ein slepp for eksempel unna med å etterfiltrera berre dei cirka 2000 orda som begynner på «hei», i staden for dei halv million orda som finst i ordlista), og programmet er derfor for dei flesta orda omtrent like raskt som før. Unntak er «orda» æ, ø og å (og Æ, Ø og Å), sidan «look»-filtreringa ikkje hjelper i det heile tatt på filtreringa. Men det er ein liten pris å betala for kompatibilitet, synest eg. Retta i revisjon 167 (med ei lita tilleggsendring i revisjon 168).
$ dpkg-query -S `which look` bsdmainutils: /usr/bin/look $ LC_ALL=C /usr/bin/look -- møllmiddel /usr/local/share/ordbanken/fullform_nn.dat look: Invalid or incomplete multibyte or wide character $ LC_ALL=nn_NO.UTF-8 /usr/bin/look -- møllmiddel /usr/local/share/ordbanken/fullform_nn.dat møllmiddel møllmiddel subst nøyt appell eint ub 61752 823 møllmiddel møllmiddel subst nøyt appell fl ub 61752 823 møllmiddel møllmiddelet subst nøyt appell eint bu 61752 823 møllmiddel møllmidla subst nøyt appell fl bu 61752 823 Dette er på Xubuntu 15.10, har vore sånn på alle *buntu eg har prøvd. Merk forresten òg at man-sida til BSD look seier at den utgåva av «look uses a linear search by default instead of a binary search, which is what most other implementations use by default» – så det er kanskje ikkje så mykje raskare enn grep. Her er éin måte å testa for om look er BSD: $ echo ø >/tmp/ø; LC_ALL=C look ø /tmp/ø; echo $? look: Invalid or incomplete multibyte or wide character 2 eventuelt: $ look -h ; echo $? look: invalid option -- 'h' usage: look [-bdf] [-t char] string [file ...] 2
(Note: upload size limit is set to 16384 kB, after insertion of the required escape characters.)
Attach Files: Comment:
No files currently attached
Depends on the following items: None found
Items that depend on this one: None found
Please enter the title of George Orwell's famous dystopian book (it's a date):
Follow 7 latest changes.
Copyright © 2023 Free Software Foundation, Inc. Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved. The Levitating, Meditating, Flute-playing Gnu logo is a GNU GPL'ed image provided by the Nevrax Design Team. Source Code
Powered by Savane 3.12