все!
Я не могу понять это, и сейчас я очень озадачен обработкой кодировки. Следующая конфигурация:
a) Windows 10 с Apache, PHP и MySQL - внешний жесткий диск USB, опубликованный как «video1», с видеофайлами, содержащими метаинформацию о содержимом в имени файла - также содержащими специальные символы (то есть немецкие умляуты).
PHP-скрипт рекурсивно читает (scandir) все имена файлов и отображает (utf8_encode) извлеченную метаинформацию через html. Этот скрипт работает как шарм уже несколько лет.
б) RasPi 2 с Apache, PHP и MySQL - тот же жесткий диск, смонтированный (cifs) в /mnt/video1.
Тот же скрипт выполняется, но отображает нечетные символы. Если я уберу utf8_encode, то дисплей будет странным на стороне Win10, но корректным на стороне RasPi. Что мне нужно сделать, чтобы скрипт работал на на обоих серверах?
Пример сценария: (изменить только $ directory = ... для Windows и RasPi)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<?php include("metatags.txt"); ?>
<TITLE>Charset Test</TITLE>
</HEAD>
<BODY>
<?php
function scan_dir_recursive( $dir, $result ) {
//echo "Entering: " . $dir . "<BR>";
$direntries = scandir( $dir );
//echo "Entries: "; var_dump( $direntries ); echo "<BR>";
foreach ( $direntries as $entry ) {
if ( is_dir( $dir . $entry )) {
if (( $entry <> "." ) and ( $entry <> ".." )) {
$result = scan_dir_recursive( $dir . $entry . "/", $result );
}
}
if ( is_file( $dir . $entry )) {
//echo( "<B> + " . $dir . $entry . "</B><BR>" );
$result[] = $dir . $entry;
}
}
//echo "Result: "; var_dump( $result ); echo "<BR>";
return $result;
}
function displayheader( $mode ) {
switch ( $mode ) {
case 1:
echo( "unverändert" );
break;
case 2:
echo( "utf8_encode" );
break;
}
}
function displayentry( $entry, $mode ) {
switch ( $mode ) {
case 1:
$result = $entry;
break;
case 2:
$result = utf8_encode( $entry );
break;
}
echo $result;
}
$directory = "//192.168.1.20/video1/charset/";
//$directory = "/mnt/video1/charset/";
$videolist = array();
$videolist = scan_dir_recursive( $directory, $videolist );
?>
<?php
for ( $t = 1; $t <= 2; $t++ ) {
?>
<TABLE>
<TR>
<TH><?php displayheader( $t );?></TH>
</TR>
<?php
foreach ( $videolist as $entry ) {
?>
<TR>
<TD><?php displayentry( $entry, $t );?></TD>
</TR>
<?php
}
?>
</TABLE>
<?php
}
?>
</BODY>
</HTML>
Скрипт отображает список правильно с помощью utf8_encode, но отображает черные точки с помощью "?" без. RasPi, с другой стороны, отображает правильный список без кодировки, но с 2-байтовым мусором («A» с ~ выше плюс 2-й символ) с использованием кодировки. «Ls -la» в CLI RasPi также отображает правильные имена файлов, как и «dir» на ПК с Windows.
Любая помощь приветствуется, спасибо!
Michael