|
| Sortering på dansk Fra : Jens Tønnesen |
Dato : 05-09-02 21:03 |
|
Hvordan får man PHP til at lave en vaskeægte dansk sortering, hvor der
tages højde for ÆØÅ's placering i alfabetet og for anvendelsen af AA i
stedet for Å?
Se nedenstående:
$ar = array("Andersen, H.C.",
"Branner, H.C",
"Ægidius, H.C.",
"Østergaard, H.C.",
"Åbenhus, H.C.",
"Aagesen, H.C.");
print "SORT\n";
sort($ar);
var_dump($ar);
print "NATSORT\n";
natsort($ar);
var_dump($ar);
Hverken sort() eller natsort() giver det ønskede resultat.
--
Jens Tønnesen - http://www.pressefoto.dk
| |
Jonas Koch Bentzen (05-09-2002)
| Kommentar Fra : Jonas Koch Bentzen |
Dato : 05-09-02 21:33 |
|
Jens Tønnesen wrote:
>
> Hvordan får man PHP til at lave en vaskeægte dansk sortering, hvor der
> tages højde for ÆØÅ's placering i alfabetet
setlocale(LC_CTYPE, "da_DK");
da_DK kan også være danish eller da.
> og for anvendelsen af AA i
> stedet for Å?
Hmm... Den bliver svær. Hvis ikke ovenstående virker, er der nok ikke
noget, der gør.
| |
Jens Tønnesen (05-09-2002)
| Kommentar Fra : Jens Tønnesen |
Dato : 05-09-02 22:05 |
|
Jonas Koch Bentzen <ingen.email@eksempel.dk> skrev den Thu, 05 Sep
2002 22:32:42 +0200 i dk.edb.internet.webdesign.serverside.php:
>Jens Tønnesen wrote:
>> Hvordan får man PHP til at lave en vaskeægte dansk sortering, hvor der
>> tages højde for ÆØÅ's placering i alfabetet
>setlocale(LC_CTYPE, "da_DK");
Ja, men det placerer 'Åbenhus' før' 'Østergaard'.
--
Jens Tønnesen - http://www.pressefoto.dk
| |
Jonas Koch Bentzen (05-09-2002)
| Kommentar Fra : Jonas Koch Bentzen |
Dato : 05-09-02 22:11 |
|
Jens Tønnesen wrote:
> Jonas Koch Bentzen <ingen.email@eksempel.dk> skrev den Thu, 05 Sep
> 2002 22:32:42 +0200 i dk.edb.internet.webdesign.serverside.php:
>
>>setlocale(LC_CTYPE, "da_DK");
>
>
> Ja, men det placerer 'Åbenhus' før' 'Østergaard'.
Har du prøvet med "da" eller "danish"? Har du prøvet at ændre LC_CTYPE
til LC_ALL?
| |
Peter Brodersen (05-09-2002)
| Kommentar Fra : Peter Brodersen |
Dato : 05-09-02 23:55 |
|
On Thu, 05 Sep 2002 23:05:19 +0200, Jens Tønnesen
<nospam2002-01@pressefoto.dk> wrote:
>Ja, men det placerer 'Åbenhus' før' 'Østergaard'.
>
>--
>Jens Tønnesen - http://www.pressefoto.dk
Hvis der er tale om www.pressefoto.dk, så vær opmærksom på at de af
Tiscalis webservere, der kører FreeBSD, mildest talt er defekte, og
mangler relevante locales for fx dansk.
Prøv evt. at smide følgende kode op og reload evt. en sjat gange for
at se hvordan, webserveren håndterer diverse sprogfunktioner:
<?php
print "HOST: ".$_ENV['HOST']."<br>\n";
print "HOSTNAME: ".$_ENV['HOSTNAME']."<br>\n";
print "SERVER_ADDR: ".$_SERVER['SERVER_ADDR']."<br>\n";
print "php_uname(): ".php_uname()."<br>\n";
print "Current locale: ".SetLocale("LC_ALL", 0)."<br><br>\n";
// Notice we are using the default locale
// The Danish conversion will even work with LC_CTYPE=en_US,
// but not with LC_CTYPE=C
print "strtoupper('æblegrød'): ".strtoupper('æblegrød')."<br>\n";
// We will switch to Danish locale at this point
SetLocale("LC_TIME", "da_DK");
print "Current weekday (in Danish): ".strftime("%A")."<br>\n";
?>
--
- Peter Brodersen
| |
Jens Tønnesen (06-09-2002)
| Kommentar Fra : Jens Tønnesen |
Dato : 06-09-02 08:32 |
|
Peter Brodersen <usenet@ter.dk> skrev den Fri, 06 Sep 2002 00:54:37
+0200 i dk.edb.internet.webdesign.serverside.php:
>Hvis der er tale om www.pressefoto.dk, så vær opmærksom på at de af
>Tiscalis webservere, der kører FreeBSD, mildest talt er defekte, og
>mangler relevante locales for fx dansk.
Nej, det er egentlig ikke www.pressefoto.dk, men mere et generelt
problem. Jeg har prøvet at indsætte nedenstående kode (se i bunden af
indlægget) på forskellige servere, som jeg har adgang til. Der er både
Windows, Linux og FreeBSD imellem:
http://www.fotobase.dk/sorttest.php (min egen test-server på Windows)
http://www.pressefotografforbundet.dk/sorttest.php
http://www.webmedier.dk/sorttest.php
http://sql.pressefoto.dk/sorttest.php
Indsat kode:
<?
print "HOST: ".$_ENV['HOST']."<br>\n";
print "HOSTNAME: ".$_ENV['HOSTNAME']."<br>\n";
print "SERVER_ADDR: ".$_SERVER['SERVER_ADDR']."<br>\n";
print "php_uname(): ".php_uname()."<br>\n";
print "Current locale: ".SetLocale("LC_ALL", 0)."<br><br>\n";
print "strtoupper('æblegrød'): ".strtoupper('æblegrød')."<br>\n";
SetLocale("LC_TIME", "da_DK");
print "Current weekday (in Danish): ".strftime("%A")."<br>\n";
$ar = array("Andersen, H.C.","Branner, H.C","Ægidius,
H.C.","Østergaard, H.C.","Åbenhus, H.C.","Aagesen, H.C.");
LocaleTest("en_US");
LocaleTest("danish");
LocaleTest("da_DK");
LocaleTest("da_DA");
LocaleTest("danish_DENMARK");
function LocaleTest($locale) {
global $ar;
print "<HR>\n\n";
print "Følgende <B>locale</B> bruges: " . $locale . "<BR>\n";
setlocale(LC_ALL,$locale);
print "<B>locale</B> sat til: ";
print SetLocale("LC_ALL", 0)."<br><br>\n";
print "I dag er det " . strftime("%A") . "<BR>\n";
print "<BR><B>SORT</B><BR>\n";
sort($ar);
UdskrivArray($ar);
print "<BR><B>NATSORT</B><BR>\n";
natsort($ar);
UdskrivArray($ar);
}
function UdskrivArray($ar) {
foreach($ar as $value) {
print $value . "<BR>\n";
}
}
?>
--
Jens Tønnesen - http://www.pressefoto.dk
| |
Martin Seebach (07-09-2002)
| Kommentar Fra : Martin Seebach |
Dato : 07-09-02 01:01 |
|
Jeg tror vi skal glemme det meste om eksotiske locales i PHP -- vi har vist
lået fast at det ikke virker helt optimalt.
Kig engang på funktionen usort().. Så skal du bare lave en lille funktion
der kan dansk:
function da_sort($a, $b) {
$a = strtolower($a);
$b = strtolower($b);
$da_arr['a'] = 1;
$da_arr['b'] = 2;
....
$da_arr['æ'] = 27;
$da_arr['Æ'] = 27;
$da_arr['ø'] = 28;
$da_arr['Ø'] = 28;
$da_arr['å'] = 29;
$da_arr['Å'] = 29;
//Det her er grimt grimt grimt .. med sikrer at aa bliver behandlet som
å
list($a, $b) = str_replace("aa", "å", array(strtolower($a),
strtolower($b)));
//find første tegn hvor ordene ikke er ens:
$i = 0;
while(substr($a, $i, 1) != substr($a, $i, 1) && $i<strlen($a) &&
$i<strlen($b)) $i++;
$a_bgstv = substr($a, $i, 1)
$b_bgstv = substr($b, $i, 1)
if($a_bgstv == $b_bgstv) // ordene er ens, i hvert fald op til det
korteste's længde
return 0;
if ( $da_arr[$a_bgstv] && $da_arr[$b_bgstv]) // måske er det ene bogstav
et tegn eller andet godt?
return ($a_bgstv>$b_bgstv) ? 1 : -1;
else
return ($da_arr[$a_bgstv] > $da_arr[$b_bgstv]) ? 1 : -1;
}
Den er ikke testet, men du får ideen?
--
Venlig hilsen
Martin Seebach
- min email adresse virker..
"Jonas Koch Bentzen" <ingen.email@eksempel.dk> wrote in message
news:al8f1u$g6b$1@sunsite.dk...
> Jens Tønnesen wrote:
> >
> > Hvordan får man PHP til at lave en vaskeægte dansk sortering, hvor der
> > tages højde for ÆØÅ's placering i alfabetet
>
> setlocale(LC_CTYPE, "da_DK");
>
> da_DK kan også være danish eller da.
>
> > og for anvendelsen af AA i
> > stedet for Å?
>
> Hmm... Den bliver svær. Hvis ikke ovenstående virker, er der nok ikke
> noget, der gør.
>
| |
Jonas Koch Bentzen (07-09-2002)
| Kommentar Fra : Jonas Koch Bentzen |
Dato : 07-09-02 07:43 |
|
Martin Seebach wrote:
>
> Jeg tror vi skal glemme det meste om eksotiske locales i PHP -- vi har vist
> lået fast at det ikke virker helt optimalt.
Hvad mener du med det? Bare fordi, der muligvis ikke er installeret de
rigtige locales på Jens Tønnesens systemer? setlocale(LC_CTYPE,
"danskLocale"); virker normalt fint. Den kan dog ikke placere "aa" i
slutningen - og det skal den heller ikke efter min mening. Man kan jo
risikere, at der er ord, der begynder med "aa", hvor "aa" ikke svarer
til "å". Eksempler kunne være "AA" (Anonyme Alkoholikere), "Aasiaat" (by
i Grønland).
At lade localen bestemme, at "aa" altid skal til sidst, ville være en
stor fejl efter min mening. Dog kan man - hvis man kender indholdet af
den liste, der skal sorteres, 100% - vælge at lave en
sorteringsfunktion, der placerer "aa" til sidst i listen. Det kræver dog
som sagt, at man kender listen 100% og derfor er sikker på, der ikke
kommer ord med i den, hvor "aa" ikke svarer til "å".
| |
Jens Tønnesen (07-09-2002)
| Kommentar Fra : Jens Tønnesen |
Dato : 07-09-02 08:07 |
|
Jonas Koch Bentzen <ingen.email@eksempel.dk> skrev den Sat, 07 Sep
2002 08:42:57 +0200 i dk.edb.internet.webdesign.serverside.php:
>Bare fordi, der muligvis ikke er installeret de
>rigtige locales på Jens Tønnesens systemer? setlocale(LC_CTYPE,
>"danskLocale"); virker normalt fint.
Hvor placeres 'Åbenhus', hvis du kører nedenstående på dit system (som
jeg formoder må være udstyret med korrekt loacle?
$ar = array("Andersen, H.C.",
"Branner, H.C",
"Ægidius, H.C.",
"Østergaard, H.C.",
"Åbenhus, H.C.",
"Aagesen, H.C.");
print "SORT\n";
sort($ar);
var_dump($ar);
>At lade localen bestemme, at "aa" altid skal til sidst, ville være en
>stor fejl efter min mening. Dog kan man - hvis man kender indholdet af
>den liste, der skal sorteres, 100% - vælge at lave en
>sorteringsfunktion, der placerer "aa" til sidst i listen.
Det er er jeg enig med dig i. Jeg ville også kunne leve med at Aa blev
placeret 'forkert', idet jeg simpelt kunne lave en søg-og-erstat på aa
til å inden jeg sorterede.
Men på ingen af de sider, som jeg har testet locale på, er det
lykkedes mig at få placeret 'Åbenhus' efter 'Østergaard', selvom
systemet sagtens har kunne finde ud af skrive lørdag i stedet for
saturday f.eks.
--
Jens Tønnesen - http://www.pressefoto.dk
| |
Jonas Koch Bentzen (07-09-2002)
| Kommentar Fra : Jonas Koch Bentzen |
Dato : 07-09-02 08:28 |
|
Jens Tønnesen wrote:
>
> Men på ingen af de sider, som jeg har testet locale på, er det
> lykkedes mig at få placeret 'Åbenhus' efter 'Østergaard', selvom
> systemet sagtens har kunne finde ud af skrive lørdag i stedet for
> saturday f.eks.
Det er også det, jeg lige har fundet ud af. Problemet kunne være, at
sort() simpelthen ikke tager hensyn til localen. Det kunne dog være, at
der blandt PHP's utallige sorteringsfunktioner var en, der rent faktisk
tog hensyn til localen - det kan du jo eksperimentere med.
| |
Jens Tønnesen (07-09-2002)
| Kommentar Fra : Jens Tønnesen |
Dato : 07-09-02 07:58 |
|
"Martin Seebach" <martin-nospam@g-bach.dk> skrev den Sat, 7 Sep 2002
02:01:24 +0200 i dk.edb.internet.webdesign.serverside.php:
>Kig engang på funktionen usort().. Så skal du bare lave en lille funktion
>der kan dansk:
Ja, det er også efterhånden dér, jeg er nået hen. Fordi selv om jeg
fandt en locale, der virkede i forhold til korrekt placering af æøå,
så ville den helt sikkert ikke tage hensyn til 'aa'
(Ærgerligt nok at systemet ikke kan sortere ordentligt - selv
sorteringsfunktionen i Microsoft Word kan finde ud af at placere 'aa'
korrekt i forhold til 'a').
Jeg roder lidt videre med det...
--
Jens Tønnesen - http://www.pressefoto.dk
| |
Jonas Koch Bentzen (07-09-2002)
| Kommentar Fra : Jonas Koch Bentzen |
Dato : 07-09-02 08:07 |
|
Jens Tønnesen wrote:
>
> (Ærgerligt nok at systemet ikke kan sortere ordentligt - selv
> sorteringsfunktionen i Microsoft Word kan finde ud af at placere 'aa'
> korrekt i forhold til 'a').
Jeg mener stadig, det er forkert opførsel at sortere "aa" som "å", fordi
man ikke kan være sikker på, at "aa"'et nødvendigvis svarer til et "å".
Det giver det, jeg vil kalde "spinkel" programmering - noget, som ikke
altid vil opføre sig som man forventer.
Jeg er vis på, at dem, der har skrevet de danske locales, har gjort sig
de samme tanker, for hvis man ser andre dele af de danske locales, så
ser man, at de er ret gennemtænkte.
| |
Jens Tønnesen (07-09-2002)
| Kommentar Fra : Jens Tønnesen |
Dato : 07-09-02 08:20 |
|
Jonas Koch Bentzen <ingen.email@eksempel.dk> skrev den Sat, 07 Sep
2002 09:06:55 +0200 i dk.edb.internet.webdesign.serverside.php:
>Jens Tønnesen wrote:
>> (Ærgerligt nok at systemet ikke kan sortere ordentligt - selv
>> sorteringsfunktionen i Microsoft Word kan finde ud af at placere 'aa'
>> korrekt i forhold til 'a').
>Jeg mener stadig, det er forkert opførsel at sortere "aa" som "å", fordi
>man ikke kan være sikker på, at "aa"'et nødvendigvis svarer til et "å".
Som jeg skrev i et andet indlæg, så er jeg enig med dig i, at det ikke
skal være standarden i en locale, at den placerer aa til sidst. Det er
kun i det tilfælde, hvor man f.eks. skal sortere en liste over danske
navne, at det er relevant.
--
Jens Tønnesen - http://www.pressefoto.dk
| |
|
|