PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : locale



DBGTMaster
19.05.08, 20:43
Hallo,

habe ein Problem mit PHP. Und zwar lässt mir die PHP Funktion strtolower(), welche einen String in Kleinbuchstaben verwandelt, alle Umlaute verschwinden.

Laut PHP Manual:


Beachten Sie, dass 'Buchstaben' vom Wert locale abhängig ist. Ist z. B. die Voreinstellung für locale "C", werden Sonderzeichen wie Umlaute (ä, ö, ü) nicht umgewandelt.


mail:~# export
declare -x HOME="/root"
declare -x LANG="de_DE.UTF-8"
declare -x LOGNAME="root"
declare -x LS_COLORS="no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:do =01;35:b d=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30; 43:tw=30;42:ow=34;42:st=37;44: ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz =01;31:*.lzh=01;31:*.zip=01;31 :*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.deb= 01;31:*.rpm=01;31:*.jar=01;31: *.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:* .pbm=01;35:*.pgm=01;35:*.ppm=0 1;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01; 35:*.tiff=01;35:*.png=01;35:*. mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.avi=01;35:*.f li=01;35:*.gl=01;35:*.dl=01;35 :*.xcf=01;35:*.xwd=01;35:*.flac=01;35:*.mp3=01;35: *.mpc=01;35:*.ogg=01;35:*.wav= 01;35:"
declare -x LS_OPTIONS="--color=auto --human"
declare -x MAIL="/var/mail/root"
declare -x OLDPWD
declare -x PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
declare -x PS1="\\h:\\w\\\$ "
declare -x PWD="/root"
declare -x SHELL="/bin/bash"
declare -x SHLVL="1"
declare -x SSH_CLIENT="85.127.134.112 59625 22"
declare -x SSH_CONNECTION="85.127.134.112 59625 88.198.50.93 22"
declare -x SSH_TTY="/dev/pts/2"
declare -x TERM="xterm"
declare -x USER="root"

PHP Dateien sind alle in UTF-8 Kodiert. Genau das selbe Problem habe ich auch mit meiner Postgresql Datenbank.

Wenn ich "SELECT LOWER(name) FROM table" ausführe, so verschwinden aus "name" alle Umlaute. Datenbank ist ebenso in UTF8. Was mach ich falsch?

UzumakiNaruto
19.05.08, 20:51
es gibt in PHP eine locale variable
http://de.php.net/setlocale

setlocale(LC_ALL, 'de_DE');

DBGTMaster
19.05.08, 20:59
Leider löst das aber mein Problem nicht.


<?php
header('Content-Type: text/html; charset=utf-8');
setlocale(LC_ALL, 'de_DE');
echo strtolower("ölö");
?>

Gibt mir im browser nur komische Zeichen aus.

DBGTMaster
19.05.08, 21:32
Juhuu, lighttpd (also php) hat einen restart gebraucht, damit er die neu installierten locales auch frisst :-). Werd später, wenn die Zugriffe weniger werden, auch mal Postgresql neu starten :D

DBGTMaster
19.05.08, 22:09
Nur leider hat sich mein Postgresql Problem nicht gelöst :-(.

http://www.postgresql.org/files/documentation/books/pghandbuch/html/charset.html#LOCALE

Dort ist zu lesen:


Bei einigen Locale-Kategorien steht der Wert für die gesamte Lebensdauer des Datenbankclusters fest. Das heißt, nachdem initdb ausgeführt wurde, dann können Sie ihn nicht mehr verändern. Diese Kategorien sind LC_COLLATE und LC_CTYPE

Würde das nun bedeuten, dass ich die Datenbank exportieren, initdb neu ausführen und wieder erstellen muss ?!

Edit:
Laufzeitvariablen sagen mir:


lc_collate en_US.ISO-8859-15
lc_ctype en_US.ISO-8859-15
lc_messages en_US.ISO-8859-15
lc_monetary en_US.ISO-8859-15
lc_numeric en_US.ISO-8859-15
lc_time en_US.ISO-8859-15

Und noch eine Frage:

ich benutze ja nun de_DE.utf8. Was ist, wenn ich chinesische Zeichen brauche. Muss ich dann wieder eine andere locale benutzen?

UzumakiNaruto
20.05.08, 13:48
kp .. ich benutze kein postgre .. ich benutze mysql .. da wirst du dich wohl an andere wenden, oder das forum dafür wechseln :D

DBGTMaster
20.05.08, 23:31
Das postgresql Problem ist nun gelöst. Hab die Datenbank exportiert, initdb ausgeführt und wieder importiert.

Nun habe ich aber noch ein Problem mit Umlauten:

Öffne ich den "vi" Editor und gebe ein Umlaut ein, so schreibt er: ä

Ebenso in PHP das Problem, dass die Funktion strlen() ein Umlaut als 2 Zeichen zählt (wird wohl daran liegen, dass er aus einen Umlaut ein ä macht.

Umgebungsvariablen:


mail:~# export
....
declare -x LANG="de_DE.UTF-8"
...

Den Rest hab ich ausgeschnitten, da diese nix mit der locale zu tun hatten.

UzumakiNaruto
20.05.08, 23:38
stelle mal deine frage in einem php-forum .. vllt können diese dir dort weiter helfen
http://php-resource.de/forum/