Norveç karakter sorunu

5 Cevap

Ben aşağıdaki gibi bir klasör oluşturun.

function create(){
if ($this->input->post('name')){
    ...
            ...
    $folder = $this->input->post('name');
    $folder = strtolower($folder);
    $forbidden = array(" ", "å", "ø", "æ", "Å", "Ø", "Æ");
    $folder = str_replace($forbidden, "_", $folder);
    $folder = 'images/'.$folder;
    $this->_create_path($folder);
            ...

Ancak _ (çubuğunun altında) ile Norveç karakteri yerine geçmez

Örneğin, ATEST øre ¸ re à ... test_a adında bir klasör oluşturur.

Ben

<meta http-equiv="content-type" content="text/html; charset=utf-8" />

Bir başlığında.

Ben XAMPP / Windows Vista üzerinde PHP / CodeIgniter kullanıyorum.

Bu sorunu nasıl çözebilirim?

5 Cevap

Bu kullanın.

$string = $this->input->post('name');
$regexp = '/( |å|ø|æ|Å|Ø|Æ|Ã¥|ø|æ|Ã…|Ø|Æ)/iU';
$replace_char = '_';

Sen doğru kodlama PHP dosyayı kaydetmek için hatırlamak zorunda. ISO-8859-1 veya UTF8 kaydetmeyi deneyin. Ayrıca karakterler dönüştürülmüş olsaydı doğru kaydedilmiş ya da olup olmadığını görürsünüz, böylece kaydettikten sonra yeniden açmak için hatırlıyorum. IDE editörü değişiklik görüntülemeden bayt (garip karakter) onları dönüştürmek olabilir.

  1. Dosyanızı, Save As yazdığınızda ..
  2. filename.php ve altındaki Kodlama diyebilirim. Burada ISO-8859-1 (veya Latin-1) veya UTF8 seçmelisiniz. Eğer bu bir seçenek olmayacak Defteri'ni kullanıyorsanız, size lazım a proper editor.
  3. Bu uygulama diğer tüm PHP dosyaları için aynı kodlamayı uygulayın. Ben ISO-8859-1 bunu düşünüyorum, ama UTF8 iyi bir varsayılan, bu yüzden bu işleri eğer onu seçin.

PHP tarafından kullanılan dahili kodlamayı ayarlama açıkça deneyin:

mb_internal_encoding('UTF-8');

Edit: aslında, şimdi ben bunu düşünüyorum ... Ben kullanarak tavsiye ediyorum strtr. Bu multibyte karakter desteği vardır ve hızlı bir iyi bir anlaşma olacaktır:

$from  = ' 帿ŨÆ';
$to    = '_______';
$fixed = strtr($string, $from, $to);

Hiç değilse, normal string fonksiyonları en iyi Unicode karakter işleyemez.

Bu durumda, etrafında çalışmak için normal bir ifade kullanabilirsiniz.

<?php
$string = 'Åtest øre';
$regexp = '/( |å|ø|æ)/iu';
$replace_char = '_';

echo preg_replace($regexp, $replace_char, $string)
?>

İade:

_test__re

Eğer PHP, Windows dosya sistemi olsun arayüz C standart kütüphanesi biridir. Windows sistem varsayılan kod sayfasını kullanarak PHP bayt içine Unicode dosya sistemi adlandırma şeması eşler. Muhtemelen Norveç'te ise sistem varsayılan kod sayfası 1252 Batı Avrupa, ancak canlı bir sunucu üzerinde koymak taşımak ve bunu düzeltmek için kolay bir şey değil ne zaman ki değiştirebileceğiniz bir dağıtım detay.

Sayfanız / sitesi kodlaması UTF-8'dir. Modern Linux sunucuları genellikle kendi dosya sistemi erişim kodlaması olarak UTF-8 kullanmak Maalesef ederken, Windows'un varsayılan kod sayfası UTF-8 asla olamaz çünkü. Sen iconv kullanarak CP1252 bir UTF-8 dizesi dönüştürebilirsiniz; doğal olarak bu kod sayfasında uymayan karakterler kaybolabilir veya karıştırılmış olacak. Alternatif (çoğu durumda) CP1252 saklanabilir tüm site kullanımını charset=iso-8859-1, yapmak olacaktır. Ama olmayan bir UTF-8 karakter setlerini kullanarak ve tabii ki farklı bir varsayılan kod sayfasını kullanarak bir makineye dağıtmak eğer yine kırarım biraz geriye doğru.

Bu nedenle ve diğerleri için, dosya adları zor. Siz rastgele bir dize dışında bir dosya adı yapmamak için her şeyi yapmalıdır. Windows üzerinde bir dosya bir dize uygun yapmak ve dizin geçişi saldırıları önlemek için engellemek gerekir daha birçok karakter vardır. Çok daha iyi dosya sistemi üzerinde 123.jpeg gibi bir kimliği saklamak ve bunu farklı bir dize adı altında görünür yapmak istiyorsanız yeniden senaryolaştırdığı-erişimini veya URL kullanmak için.

Eğer rastgele bir dize bir Windows-dostu bir dosya yapmak gerekiyorsa, o nesil sülük benzer bir şey yapmak kolay olurdu: preg_replace uzaklıkta all karakter (Unicode veya başka türlü) uymaz bilinen güvenli olanları gibi `[A-Za-z0-9_-], sonuç boş değil ve bad filenames birini eşleşmesi (eğer öyleyse, bir alt çizgi) ve nihayet uzantısı eklemek değil kontrol edin.