PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PHP, shell_exec, Linux und Umlaute



Chocwise
07.02.2012, 05:16
Es geht darum, dass ich mir ein Shellscript in PHP schreiben möchte, welches meine Filmsammlung fein indexiert.
Dazu benutz ich die Funktion shell_exec und den Shellbefehl "tree" um mir eine nette Auflistung aller Dateien in einem Verzeichnisast ausspucken zu lassen.

Das klappt auch alles ganz super, mit dem einzigen Problem, dass bei der Sache irgendwie die Umlaute zerhauen werden.
So spuckt mir shell_exec als Beispiel solche Dateinamen aus:

Die Abenteuer des Baron M\303\274nchhausen.avi
Basil - Der gro\303\237e M\303\244usedetektiv.avi
u.s.w.


Die Frage ist nun: Wie bekomme ich das möglichst elegant gefixt?
Ich habs schon mit putenv("LANG=de_DE.UTF-8"); im Script versucht, oder utf8_decode($value) oder shell_exec('LANG=en_US.UTF-8; tree');

Aber nix hats gebracht. :/
Wobei ich auch absolut kein Plan von Charsets, Zeichencodierung und so'n Kabbes hab. XD

Zu str_replace oder preg_replace möchte ich eigentlich nur sehr ungerne greifen, weil ich das Script schon gerne sehr robust halten möchte. Und wenn ich da etwas bei der Ersetzung vergesse, zerhauts mir am Ende mein Index.


Die Umgebungsvariable für LANG ist de_DE.utf8 auf meinem System.

gorn79
07.02.2012, 11:32
Soweit ich mich erinnere brauchst du lediglich dein Skript als UTF8 zu speichern. Wenn dein Skript nicht als UTF8 gespeichert ist bringt dir auch ein utf8_encode nichts mehr weil alle strings vorher schon in das entsprechende Zeichenformat umgewandelt wurden, utf8_encode würde dann lediglich den String (der bereits keine Umlaute enthält) in UTF8 codieren.

ps: bin aber nicht so der php crack ;)

Chocwise
07.02.2012, 15:09
Hmnee. Das wars vermutlich auch nicht. Die Codierung der Scriptdatei ist bereits UTF-8. :/

gorn79
07.02.2012, 15:45
kannst du das skript mal anhängen (als datei)?

devZero
07.02.2012, 16:20
Probiers mal mit

putenv('LC_ALL=de_DE.UTF-8');

Chocwise
07.02.2012, 16:29
kannst du das skript mal anhängen (als datei)?

#!/usr/bin/php5
<?php
putenv('LC_ALL=de_DE.UTF-8');

mysql_connect("midgard","projects", "***************");
mysql_select_db("homecenter");

$files=shell_exec("tree -i -f");
$files_r=explode("\n",$files,-3);

foreach ($files_r as $value) {
$name=pathinfo($value);
$name_s=$name[filename];
$extension=$name[extension];
$filesize= filesize($value);

if(!empty($extension)){
$hash = md5($value);

$isthere=mysql_query("SELECT hash FROM mindex WHERE hash='$hash'");
if(mysql_num_rows($isthere)==0){
//mysql_query("INSERT INTO mindex (hash,title,extension,filesize) VALUES('$hash','$name_s','$extension','$filesize')");
//system("/home/chocwise/bin/mtn -t -i -w 150 -h 10 -f /usr/share/fonts/truetype/msttcorefonts/arial.ttf -O /home/chocwise/Desktop/misc/www-nfs/homecenter/mindex -j 60 -c 3 -r 1 \"".$value."\"");
}
}
}
?>

Probiers mal mit

putenv('LC_ALL=de_DE.UTF-8');
Nee, bringt leider auch nix. Immernoch die zerhackten Umlaute nach wie vor.


EDIT: Ich seh grad, dass tree selbst die zerhackten Umlaute produziert. -__-
Sprich: Führ ich den tree-Befehl in der Shel aus, spuckt jener mir bereits die zerhauenen Umlaute aus. PHP oder das Script kann da also nix für. :/

However. Das Problem besteht nach wie vor. nur jetz mit anderem Fokus. XD
Jemand eine Idee wie ich entweder die Funktion tree's ersetzen kann (Nur komplette oder relative Dateipfade ausgeben lassen, keine Spalten, keine Zusatzinfos. Mit ls hab ich derlei nicht zustande gebracht), oder tree dazu bewegen kann mir Umlaute ordentlich auszugeben? ;)

Satans Krümelmonster
07.02.2012, 16:45
schonmal mit setlocale(LC_ALL, 'de_DE') versucht?

edit: da sollte dir scandir (http://de2.php.net/manual/de/function.scandir.php) helfen.

Chocwise
07.02.2012, 16:50
schonmal mit setlocale(LC_ALL, 'de_DE') versucht?

edit: da sollte dir scandir (http://de2.php.net/manual/de/function.scandir.php) helfen.

Kann man mit scandir() auch in Unterverzeichnisse abtauchen. Also kann man es rekursiv nutzen ohne auf verschachtelte Schleifen zurückgreifen zu müssen?
EDIT: Hmjanee, scheinbar nicht. XD
Dann lieber shell_exec mit find DIR. XD
Ist definitiv schneller, wennauch sicherlich unschön. ;)

EDIT²: Wobei... ich glaub ich benutz dann lieber exec() statt shell_exec(). Dann muss da nicht extra 'ne Shell für mitgestartet werden. Außerdem kann ich mir dann auch explode() sparen.

ojas
07.02.2012, 20:21
Was hast du gegen verschachtelte Schleifen?



function scandir_deep($directory) {
$contents = $stack = array();

array_push($stack, $directory);

while (!empty($stack)) {
$path = array_pop($stack);

foreach (scandir($path) as $basename) {
if ($basename == '.' || $basename == '..') {
continue;
}

$fullname = $path . DIRECTORY_SEPARATOR . $basename;
if (is_dir($fullname)) {
array_push($stack, $fullname);
} else {
$contents[] = $fullname;
}
}
}

return $contents;
}