2010-01-01 7 views
1

Je crée un dossier comme suit.Problème de caractères norvégiens

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); 
      ... 

Cependant, il ne remplace pas le caractère norvégien _ (sous la barre)

Par exemple, Atest øre va créer un dossier appelé ã ... test_ã¸re.

J'ai

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

dans un en-tête. J'utilise PHP/codeigniter sur XAMPP/Windows Vista.

Comment puis-je résoudre ce problème?

Répondre

0

Utilisez ceci.

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

Cela ne résout pas vraiment le problème de l'encodage, c'est juste une sorte de ... ignore il. - Une meilleure solution serait de coder correctement le texte et de l'utiliser comme Unicode. - Aussi; ni les modificateurs «i» ou «U» ne sont nécessaires dans cette expression régulière. Vous incluez manuellement les majuscules et les minuscules, et le modificateur 'U' * (un-greedy) * n'a aucun effet ici. * (Ni "u" (Unicode), d'ailleurs, vu que cela suppose que le texte est ASCII) * – Atli

1

Vous devez vous rappeler d'enregistrer votre fichier PHP dans l'encodage correct. Essayez de l'enregistrer dans ISO-8859-1 ou UTF8. Souvenez-vous également de le rouvrir après l'enregistrement, afin que vous voyiez s'il est enregistré correctement ou si les caractères ont été convertis. Votre IDE peut les convertir en octets (caractères étranges) sans afficher le changement dans l'éditeur.

  1. Lorsque vous écrivez votre fichier, Enregistrer sous ..
  2. filename.php et au-dessous il faut dire que le codage. Ici, vous devez choisir ISO-8859-1 (ou Latin-1) ou UTF8. Si vous utilisez Notepad ce ne sera pas une option, vous devez obtenir a proper editor.
  3. Appliquez le même codage à tous les autres fichiers PHP de cette application. Je pense que ISO-8859-1 le fera, mais UTF8 est un bon défaut, alors choisissez-le si cela fonctionne pour cela.
+0

Comment faire? Pouvez-vous donner plus de détails plz? – shin

1

Essayez le réglage explicitement le codage interne utilisé par PHP:

mb_internal_encoding('UTF-8'); 

Edit: en fait, maintenant que j'y pense ... Je conseille l'utilisation strtr. Il a un support pour les caractères multi-octets et serait beaucoup plus rapide:

$from = ' åøæÅØÆ'; 
$to = '_______'; 
$fixed = strtr($string, $from, $to); 
+0

Où dois-je ajouter ce code? Nulle part? – shin

+0

Mettez le 'mb_internal_encoding' tout en haut de votre script. En ce qui concerne l'autre bit, utilisez simplement le concept à la place de ce que vous avez maintenant. – brianreavis

1

La plupart des fonctions normales de chaînes ne gèrent pas bien les caractères Unicode, le cas échéant.

Dans cette situation, vous pouvez utiliser une expression régulière pour contourner ce problème.

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

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

Retours:

_test__re 
+0

åtest øtest sorties ¥ test_ ¸test dans le lecteur c. – shin

+1

Avez-vous enregistré le fichier au format UTF8? Il est important que vous le fassiez, sinon la chaîne de test pourrait ne pas être lue comme Unicode, ce qui gâcherait l'expression régulière. - Vous pouvez voir un exemple de la façon dont je l'utilise sur mon serveur de test - http://atli.advefir.com/test/chars.php – Atli

1

L'interface que vous obtenez le système de fichiers Windows à partir de PHP est la bibliothèque standard C un. Windows mappe son schéma de nommage de système de fichiers Unicode en octets pour PHP en utilisant la page de codes par défaut du système. Votre page de codes système par défaut est probablement 1252 Europe de l'Ouest si vous êtes en Norvège, mais c'est un détail de déploiement qui peut changer lorsque vous le déplacez sur un serveur en direct et que ce n'est pas facile à corriger.

L'encodage de votre page/site est UTF-8. Malheureusement, alors que les serveurs Linux modernes utilisent généralement UTF-8 comme encodage d'accès au système de fichiers, Windows ne le peut pas car la page de codes par défaut n'est jamais UTF-8. Vous pouvez convertir une chaîne UTF-8 en cp1252 en utilisant iconv; naturellement, tous les caractères qui ne rentrent pas dans cette page de code seront perdus ou mutilés.L'alternative serait de faire en sorte que le site entier utilise charset=iso-8859-1, qui peut (dans la plupart des cas) être stocké dans cp1252. C'est un peu en arrière d'utiliser un jeu de caractères non-UTF-8 et bien sûr, il va encore casser si vous le déployez sur une machine en utilisant une page de code par défaut différente.

Pour cette raison et d'autres, les noms de fichiers sont difficiles. Vous devriez faire tout ce que vous pouvez pour éviter de faire un nom de fichier d'une chaîne arbitraire. Il y a beaucoup plus de caractères que vous auriez besoin de bloquer pour insérer une chaîne dans un nom de fichier sous Windows et éviter les attaques de traversée de répertoire. Il est préférable de stocker un ID tel que 123.jpeg sur le système de fichiers et d'utiliser l'accès par script ou la réécriture d'URL si vous souhaitez le faire apparaître sous un autre nom de chaîne.

Si vous devez faire un nom de fichier Windows convivial à partir d'une chaîne arbitraire, il serait plus facile de faire quelque chose de similaire à slug génération: preg_replace loin tous caractères Unicode (ou autre) qui ne correspondent pas à ceux de sources sûres comme `[A-Za-z0-9_-], vérifiez que le résultat n'est pas vide et ne correspond pas à l'un des bad filenames (si c'est le cas, ajoutez un trait de soulignement) et ajoutez enfin l'extension.

Questions connexes