2013-03-15 1 views
0

J'ai besoin de convertir les noms de fichiers téléchargés avec un encodage inconnu vers Windows-1252 tout en gardant la compatibilité UTF-8. Lorsque je transmets ces fichiers à un contrôleur (sur lequel je n'ai aucune influence), les fichiers doivent être codés sous Windows-1252. Ce contrôleur génère ensuite une liste de fichiers valides (noms) stockés via MySQL dans une base de données. J'ai donc besoin de la compatibilité UTF-8. Les noms de fichiers transmis au contrôleur et les noms de fichiers écrits dans la base de données DOIVENT correspondre. Jusqu'ici tout va bien.Conversion de codage PHP vers Windows-1252 tout en conservant la compatibilité UTF-8

Dans de rares cas, lors de la conversion en "Windows-1252" (comme avec le caractère "ï"), le caractère est converti en quelque chose de non valide en UTF-8. MySQL supprime ensuite ces caractères non valides - par conséquent, les noms de fichiers sur le disque et les noms de fichiers stockés dans la base de données ne correspondent plus. Cette conversion, qui failes parfois, est réalisée avec recodage simple:

$sEncoding  = mb_detect_encoding($sOriginalFilename); 
$sTargetFilename = iconv($sEncoding, "Windows-1252//IGNORE", $sOriginalFilename); 

Pour éviter que des caractères non valides générés par la conversion, je puis à nouveau puis supprimer tous les caractères UTF-8 invalides de la chaîne recodé:

ini_set('mbstring.substitute_character', "none"); 
$sEncoding  = mb_detect_encoding($sOriginalFilename); 
$sTargetFilename = iconv($sEncoding, "Windows-1252//TRANSLIT", $sOriginalFilename); 
$sTargetFilename = mb_convert_encoding($sTargetFilename, 'UTF-8', 'Windows-1252'); 

Mais cela supprimera/recodera complètement tous les caractères spéciaux restant dans la chaîne. Par exemple, je perds tous les "äöüÄÖÜ" etc., qui sont assez réguliers en langue allemande.

Si vous connaissez une méthode d'encodage plus simple et plus simple pour Windows-1252 (sans perdre les caractères spéciaux valides), faites le moi savoir.

Toute aide est très appréciée. Merci d'avance!

Répondre

1

Je pense que le problème de maing est que mb_detect_encoding() ne fait pas exactement ce que vous pensez qu'il fait. Il tente de détecter le codage de caractères mais il le fait à partir d'une liste assez limitée de codages prédéfinis. Par défaut, ces codages sont ceux retournés par mb_detect_order(). Dans mon ordinateur, ils sont:

  • ASCII
  • UTF-8

cette fonction est donc complètement inutile, sauf si vous prenez soin de dresser une liste des codages candidats et nourrir la fonction avec elle.

En outre, il n'existe fondamentalement aucun moyen fiable de deviner le codage d'une chaîne d'entrée arbitraire, même si vous vous limitez à un petit sous-ensemble de codages. Dans votre cas, Windows-1252 est si proche de ISO-8859-1 et ISO-8859-15 que vous n'avez aucun moyen de leur différencier autre que l'inspection visuelle des caractères clés comme & curren; ou €.

2

Vous ne pouvez pas avoir une chaîne Windows-1252 et UTF-8 en même temps. Les jeux de caractères sont identiques pour les 128 premiers caractères (ils contiennent par exemple l'alphabet latin de base), mais quand ils vont au-delà (comme pour les trémas), c'est l'un ou l'autre. Ils ont différents points de code en UTF-8 par rapport à Windows-1252.

1

Conserver en ASCII dans le système de fichiers - si vous avez besoin de caractères ASCII en dehors d'un nom de fichier, il existe schémas que vous pouvez utiliser pour représenter les caractères Unicode tout en conservant ASCII.

Par exemple, pour cent encodage:

äöüÄÖÜ.txt < ->%C3%A4%C3%B6%C3%BC%C3%84%C3%96%C3%9C.txt

Bien sûr, cela a frappé la limite de nom de fichier assez rapide et n'est pas très optimale.

Comment sur punycode?

äöüÄÖÜ.txt < ->xn--4caa7cb2ac.txt

Questions connexes