4

ファイル名にチェコ語の文字が含まれている画像ファイル(例:ěščřžýáíé)を取得しました。Webとの互換性を高めるために、アクセントなしで名前を変更したいと思います。単純なstr_replace関数を使用できると思いましたが、ファイル配列では文字列リテラルと同じようには機能しないようです。

拡張子を確認した後、readdirでファイルを読み取りました。

function readFiles($dir, $ext = false) {
    if (is_dir($dir)) {
        if ($dh = opendir($dir)) {
            while (($file = readdir($dh)) !== false) {
                if($ext){  
                    if(end(explode('.', $file)) == $ext) {
                        $f[] = $file;
                    }
                } else {
                    $f[] = $file;
                }
            }

            closedir($dh);
            return $f;
        } else {
            return false;
        }
    } else {
        return false;
    }
}

$files = readFiles(".", "jpg");

$search = array('š','á','ž','í','ě','é','ř','ň','ý','č',' ');
$replace = array('s','a','z','i','e','e','r','n','y','c','-');

$string = "čšěáýísdjksnalci sášěééalskcnkkjy+ěéší";
$safe_string = str_replace($search, $replace, $string);

echo '<pre>';

foreach($files as $fl) {
    $safe_files[] = str_replace($search, $replace, $fl);
}

var_dump($files);
var_dump($safe_files);

var_dump($string);
var_dump($safe_string);

echo '</pre>';

出力

array(6) {
  [0]=>
  string(21) "Hl�vka s listem01.jpg"
  [1]=>
  string(23) "Hl�vky v atelieru02.jpg"
  [2]=>
  string(17) "Jarn� v�hon03.jpg"
  [3]=>
  string(17) "Mlad� chmel04.jpg"
  [4]=>
  string(23) "Stavba chmelnice 05.jpg"
  [5]=>
  string(21) "Zimni chmelnice06.jpg"
}
array(6) {
  [0]=>
  string(21) "Hl�vka-s-listem01.jpg"
  [1]=>
  string(23) "Hl�vky-v-atelieru02.jpg"
  [2]=>
  string(17) "Jarn�-v�hon03.jpg"
  [3]=>
  string(17) "Mlad�-chmel04.jpg"
  [4]=>
  string(23) "Stavba-chmelnice-05.jpg"
  [5]=>
  string(21) "Zimni-chmelnice06.jpg"
}
string(53) "čšěáýísdjksnalci sášěééalskcnkkjy+ěéší"
string(38) "cseayisdjksnalci-saseeealskcnkkjy+eesi"

現在、私はWAMPで実行していますが、プラットフォーム間で機能する回答の方がさらに優れています:)

4

10 に答える 10

5

0xFFFDマーク(Firefoxでは疑問符が入ったひし形で表示されます)によると、正しいエンコーディング(Unicode / UTF-8)を使用してそれらを既に読み取っていません。私がこのバグを見つけた限り、それは関連しているようです。

これに関する別のSOトピックは次のとおりです。日本語のファイル名に関するphpreaddirの問題

要するに、PHP6が安定するまで待ってから、それを使用してください。

問題とは関係ありません。ノーマライザーは、発音区別符号を取り除くための優れたツールです。

于 2009-11-19T22:33:29.510 に答える
1

文字列では機能するが配列では機能しない場合は、文字列に適用するだけです:-)

$search = array('š','á','ž','í','ě','é','ř','ň','ý','č',' ');
$replace = array('s','a','z','i','e','e','r','n','y','c','-');

len = count($safe_files)

for ($i=0; $i<len; $i++)
    $safe_files[$i] = str_replace($search, $replace, $safe_files[$i]);

str_replaceは、最後のパラメータではなく、最初の2つのパラメータの配列のみを受け入れると思います。私は間違っているかもしれませんが、とにかくこれはうまくいくはずです。

どういうわけか、実際のエンコーディングの問題がある場合は、OSがシングルバイトエンコーディングを使用し、ソースファイルが別の(おそらくUTF-8)を使用している可能性があります。

その場合は、次のようにします。

$search = array('š','á','ž','í','ě','é','ř','ň','ý','č',' ');
$replace = array('s','a','z','i','e','e','r','n','y','c','-');

$code_encoding = "UTF-8"; // this is my guess, but put whatever is yours
$os_encoding = "CP-1250"; // this is my guess, but put whatever is yours

len = count($safe_files)

for ($i=0; $i<len; $i++)
{
    $safe_files[$i] = iconv($os_encoding , $code_encoding, $safe_files[$i]); // convert before replace
    /*
     ALternatively :
     $safe_files[$i] = mb_convert_encoding($safe_files[$i], $code_encoding , $os_encoding );
    */
    $safe_files[$i] = str_replace($search, $replace, $safe_files[$i]);
}

mb_convert_encoding()にはext / mbstring拡張子が必要であり、iconv()にはext/iconvが必要です。

于 2009-11-19T22:23:50.120 に答える
1

質問に対する直接の答えではないかもしれませんがiconv()、PHPの関数、特に//TRANSLIT2番目の引数に追加できるオプションを確認することをお勧めします。私はそれを数回使用して、フランス語と東ヨーロッパの文字列をazとurlに適した文字列に変えました。

PHP.netから(http://www.php.net/manual/en/function.iconv.php

文字列//TRANSLITをout_charsetに追加すると、音訳がアクティブになります。これは、文字がターゲット文字セットで表現できない場合、1つまたは複数の同様に見える文字で近似できることを意味します。

于 2009-11-19T22:58:28.523 に答える
0

ソースコード(およびテスト文字列)はutf8にあるように見えますが、ファイル名はシングルバイトエンコーディングを使用しているようです。置換文字列に同じエンコーディングを使用することをお勧めします。ソースエンコーディングの問題を回避するには、コードにアクセント付き文字を16進形式で記述することをお勧めします(「č」の場合は\ xE8など)。

于 2009-11-19T22:16:58.507 に答える
0

だから私はこれによって私のWindowsXPシステムでそれを動作させました

$search = array('š','á','ž','í','e','é','r','n','ý','c',' ');
$replace = array('s','a','z','i','e','e','r','n','y','c','-');

$files = readFiles(".", "jpg");
$len = count($files);

for($i = 0; $i < $len; $i++){
  if(mb_check_encoding($files[$i], 'ASCII')){
    $safe_files[$i] = $files[$i];
  }else{
    $safe_files[$i] = str_replace(
        $search, $replace, iconv("iso-8859-1", "utf-8//TRANSLIT", $files[$i]));
  }
  if($files[$i] != $safe_files[$i]){
    rename($files[$i], $safe_files[$i]);
  }
}

偶然かどうかはわかりませんがmb_get_info()

[internal_encoding] => ISO-8859-1

于 2009-11-20T01:41:17.260 に答える
0

PHPstrtrページで役立つと思った別の関数を次に示します。

<?
// Windows-1250 to ASCII
// This function replace all Windows-1250 accent characters with
// thier non-accent ekvivalents. Useful for Czech and Slovak languages.

function win2ascii($str)    {   

$str = StrTr($str,
    "\xE1\xE8\xEF\xEC\xE9\xED\xF2",
    "\x61\x63\x64\x65\x65\x69\x6E");

$str = StrTr($str,
    "\xF3\xF8\x9A\x9D\xF9\xFA\xFD\x9E\xF4\xBC\xBE",
    "\x6F\x72\x73\x74\x75\x75\x79\x7A\x6F\x4C\x6C");

$str = StrTr($str,
    "\xC1\xC8\xCF\xCC\xC9\xCD\xC2\xD3\xD8",
    "\x41\x43\x44\x45\x45\x49\x4E\x4F\x52");

$str = StrTr($str,
    "\x8A\x8D\xDA\xDD\x8E\xD2\xD9\xEF\xCF",
    "\x53\x54\x55\x59\x5A\x4E\x55\x64\x44");

return $str;
}
?>

基本的に、ヨーロッパの文字をASCIIと同等の文字に変換することはそれほど問題ではありませんでしたが、ファイルの名前を変更する信頼できる方法(つまり、ASCII以外の文字を含む参照ファイル)を見つけることができませんでした。

于 2009-12-15T10:10:52.443 に答える
0

UTF-8の場合は、PHP関数utf8_encodeを使用します。Microsoft WindowsはISO-8859-1を使用しているため、この場合は変換が必要です。

例-ディレクトリ内のファイルを一覧表示します。

<?php
$dir_handle = opendir(".");
while (false !== ($file = readdir($dir_handle)))
{
  echo utf8_encode($file)."<br>";
}
?>
于 2009-12-25T12:57:23.420 に答える
0

Area5oneはそれを正しく持っています-それは異なるエンコーディングの問題です。

マシンをXPからWin7にアップグレードしたとき、MySQLとPHPのバージョンもアップグレードしました。途中のどこかで、以前は機能していたPHPプログラムが機能しなくなりました。特に、scandir、readdir、utf-8は一緒に幸せに暮らしていましたが、もはやそうではありませんでした。

そこで、コードを変更しました。WindowsのISO-8859-1エンコーディングを反映するためにハードディスクから取得されたデータに関連する変数は「_iso」で終わり、MySQLデータベースからのデータは「_utf」で終わる変数になります。したがって、area5oneのコードは次のようになります。$ dir_handle_iso = opendir( "。"); while(false!==($ file_iso = readdir($ dir_handle_iso))){$ file_utf = utf8_encode($ file); ...}

于 2013-05-28T19:38:38.340 に答える
0

これは私にとって100%機能します:

setlocale(LC_ALL,"cs_CZ");
$new_str = iconv("UTF-8","ASCII//TRANSLIT",$orig_str);
于 2015-03-24T08:35:47.967 に答える
0

$ file = mb_convert_encoding($ file、'UTF-8'、 "iso-8859-1"); 私のために働いた(Windows、デンマーク語の文字)。

于 2016-12-16T02:30:34.650 に答える