Avrupa karakterleri ile PHP readdir

8 Cevap php

I get images files which have Czech characters in the filename (eg, ěščřžýáíé) and I want to rename them without the accents so that they are more compatible for the web. I thought I could use a simple str_replace function but it doesn't seem to work the same with the file array as it does with a string literal.

Ben uzatma için kontrol ettikten sonra, readdir ile dosyaları okuyabilir.

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>';

Çıktı

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"

Şu anda ben WAMP üzerinde koşuyorum ama platformlarda çalışmak cevaplar daha iyidir :)

8 Cevap

Zaten (Unicode / UTF-8 olacak) doğru kodlamayı kullanarak onları okuma değildir (içinde bir soru işareti ile elmas gibi Firefox görünür) 0xFFFD işaretleri göre. Bildiğim kadarıyla bu bug, bu ilişkili gözükmektedir bulundu.

İşte bu konuda başka SO konu bulunuyor: http://stackoverflow.com/questions/482342/php-readdir-problem-with-japanese-language-file-name

Noktaya, onlar PHP6 istikrarlı elde edene kadar bekleyin ve ardından kullanabilirsiniz.

Soruna ilgisiz: Normalizer diacritical marks kurtulmak için iyi bir araçtır.

O :-) dizeleri ile çalışır ancak dizilerle, sadece dizeleri üzerinde uygular değilse

$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]);

I str_replace sadece ilk 2 params diziler kabul düşünmek ve son değil. Ben yanlış olabilir, ama yine de bu çalışması gerekir.

Herhangi bir ortalama ile, gerçek bir kodlama sorun varsa, sadece kaynak dosya başka kullanırken OS muhtemelen UTF-8, tek bir bayt kodlamasını kullanmanız olabilir.

Bu durumda, böyle bir şey yapın:

$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 () () Dış / iconv gerektirir uzantısı ve iconv Mbstring / ext gerektirir.

Not directly an answer to your question maybe but you might want to take a look at the iconv() function in PHP and more in particulare the //TRANSLIT option that you can append to the second argument. I've used it several times turning french and eastern europe strings to their a-z and url friendly counterparts.

PHP.net dan (http://www.php.net/manual/en/function.iconv.php)

Eğer out_charset için dize / / translite eklerseniz çevirisi aktive edilir. Bu bir karakter hedef charset temsil edilemeyen zaman, bir ya da birkaç benzer görünümlü karakterler aracılığıyla yaklasık anlamına gelir.

Dosya adları tek bayt kodlama kullanmak görünüyor ise kaynak kodu (ve testi dize), utf8 olmak görünür. Ben sizin yedek dizesi için aynı kodlamayı kullanın öneririm. Kaynak kodlaması sorunları önlemek için, ("C" vb için \ xE8 gibi) bir altıgen şeklinde kodunuzu aksanlı karakter yazmak için daha iyi olurdu.

Yani bu benim Windows XP sistemi üzerinde çalışan var

$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]);
  }
}

Ben bir conincidence ya da değil bilmiyorum, ama yok mb_get_info() gösterileri çağrı

[internal_encoding] => ISO-8859-1

Burada bulunan başka bir fonksiyonu olan yararlı on the PHP strtr page

<?
// 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;
}
?>

Temelde, bir ascii equivilent için avrupa karakterleri dönüştürmek için böyle bir sorun değildi, ama ben dosyaları (ASCII olmayan karakterler yani, referans dosyaları) yeniden adlandırmak için hiçbir güvenilir bir yol bulabiliriz.

UTF-8 için PHP fonksiyon utf8_encode kullanın. Microsoft Windows ISO-8859-1 ve böylece bu durumda bir dönüşüm gereklidir kullanır.

Örnek - Bir Dir dosyaları listeleme:

<?php
$dir_handle = opendir(".");
while (false !== ($file = readdir($dir_handle)))
{
  echo utf8_encode($file)."<br>";
}
?>

Area5one doğru vardır - bu farklı kodlama bir sorun.

Ben XP'den Win7 benim makineyi yükseltilmiş zaman, ben de MySQL ve PHP benim sürümünü yükseltti. Yerde yol boyunca, iş için kullanılan PHP programları çalışmıyor. Özellikle, scandir, readdir ve utf-8 artık birlikte mutlu yaşamışlar, ama etmişti.

So, I've modified my code. Variables related to data taken from the hard disk end in "_iso" to reflecct Windows' ISO-8859-1 encoding, data from the MySQL database goes in variables ending in "_utf". Thus, the code from area5one would like this: $dir_handle_iso = opendir("."); while (false !== ($file_iso = readdir($dir_handle_iso))) { $file_utf = utf8_encode($file); ... }