Comment puis-je vérifier si PHP a été compilé avec la version UNICODE de l'API Win32?
Ceci est lié à cette publication Stack Overflow:
glob () ne peut pas find les noms de files avec des caractères multi-octets sur Windows?
- Comment afficher un file Unicode distant via ssh?
- Le module git ne parvient pas à interpréter le paramètre bool (assume Unicode) - 1.9.2
- Powershell 2: Comment supprimer un caractère spécifique d'un corps de text ASCII
- Caractères spéciaux dans les noms d'user ssh
- La meilleure façon de s'assurer qu'une database MySQL est entièrement dans UTF8
J'ai des problèmes avec PHP et les files qui ont des caractères multi-octets sur Windows. Voici mon cas de test:
print_r(scandir('./uploads/')); print_r(glob('./uploads/*'));
Correction de la sortie sur le server UNIX distant:
Array ( [0] => . [1] => .. [2] => filename-äöü.jpg [3] => filename.jpg [4] => test이test.jpg [5] => имя файла.jpg [6] => פילענאַמע.jpg [7] => 文件名.jpg ) Array ( [0] => ./uploads/filename-äöü.jpg [1] => ./uploads/filename.jpg [2] => ./uploads/test이test.jpg [3] => ./uploads/имя файла.jpg [4] => ./uploads/פילענאַמע.jpg [5] => ./uploads/文件名.jpg )
Sortie incorrecte localement sur Windows:
Array ( [0] => . [1] => .. [2] => ??? ?????.jpg [3] => ???.jpg [4] => ?????????.jpg [5] => filename-äöü.jpg [6] => filename.jpg [7] => test?test.jpg ) Array ( [0] => ./uploads/filename-äöü.jpg [1] => ./uploads/filename.jpg )
Voici un extrait pertinent de la réponse que j'ai choisi d'accepter (qui est en fait une citation d'un article publié depuis plus de 2 ans en ligne):
À partir des commentaires sur cet article: http://www.rooftopsolutions.nl/blog/filesystem-encoding-and-php
La sortie de votre installation PHP sur Windows est facile à expliquer: vous avez installé la mauvaise version de PHP et utilisé une version non compilée pour utiliser la version Unicode de l'API Win32. Pour cette raison, les appels de système de files utilisés par PHP utiliseront l'API "ANSI" et les bibliothèques C / C ++ liées à cette version de PHP tenteront d'abord de convertir votre string de PHP codée UTF-8 en "ANSI" local page de code sélectionnée dans l'environnement en cours d'exécution (voir la command CHCP avant de démarrer PHP à partir d'une window de command line)
Votre version de Windows n'est PAS PROBLEAMENTE PAS responsable de cette chose étrange. En fait, c'est VOTRE version de PHP qui n'est pas compilée correctement et qui utilise la version ANSI existante de l'API Win32 (pour la compatibilité avec les versions 16 bits avancées de Windows 95/98 dont le support du système de files dans le kernel n'a pas eu de direct support pour Unicode, mais a utilisé une couche de conversion interne pour convertir Unicode vers la page de codes ANSI locale avant d'utiliser la version ANSI réelle de l'API).
Recomstackz PHP en utilisant l'option compilateur pour utiliser la version UNICODE de l'API Win32 (qui devrait être la valeur par défaut aujourd'hui et, de toute façon, toujours la valeur par défaut pour PHP installée sur un server qui NE SERA JAMAIS Windows 95 ou Windows 98 …)
Je ne peux pas confirmer si c'est mon problème ou non. J'ai utilisé phpinfo()
et je n'ai rien trouvé d'intéressant, mais je ne savais pas trop quoi chercher. J'ai utilisé XAMPP pour des installations faciles, donc je ne sais vraiment pas exactement comment il a été installé.
J'utilise Windows 7, 64 bits – alors pardonne mon ignorance, mais je ne suis même pas sûr si "Win32" est pertinent ici. Comment puis-je vérifier si ma version actuelle de PHP a été compilée avec la configuration mentionnée ci-dessus?
- Version PHP : 5.3.8
- Système : Windows NT WES-PC 6.1 build 7601 (Windows 7 Home Premium Edition Service Pack 1) i586
- Date de construction : 23 août 2011 11:47:20
- Compilateur : MSVC9 (Visual C ++ 2008)
- Architecture : x86
- Configurer la command :
cscript /nologo configure.js "--enable-snapshot-build" "--disable-isapi" "--enable-debug-pack" "--disable-isapi" "--without-mssql" "--without-pdo-mssql" "--without-pi3web" "--with-pdo-oci=D:\php-sdk\oracle\instantclient10\sdk,shared" "--with-oci8=D:\php-sdk\oracle\instantclient10\sdk,shared" "--with-oci8-11g=D:\php-sdk\oracle\instantclient11\sdk,shared" "--enable-object-out-dir=../obj/" "--enable-com-dotnet" "--with-mcrypt=static" "--disable-static-analyze"
Dans le cas où il est pertinent ou révèle toute information utile, voici une capture d'écran de mon phpinfo()
(section mbssortingng):
Comment puis-je savoir si mon installation PHP a été compilée avec la version UNICODE de l'API Win32? (et cela a-t-il des sens?)
- PuTTY peut-il être configuré pour afficher les caractères UTF-8 suivants?
- Versions Unicode d'outils de text commun UNIX pour s'exécuter sur Windows
- MS-DOS atsortingb + s 'path non trouvé'
- Fichiers chinois de sauvegarde de Ubuntu Bacula (unicode)
- Comment faire pour que la command «less» gère UTF-8?
- Cisco FWSM -> la mise à jour ASA a cassé notre server de messagerie
- Diffusion des domaines Emoji d'hébergement
- Linux unicode / umlauts dans URL
4 Solutions collect form web for “Comment puis-je vérifier si PHP a été compilé avec la version UNICODE de l'API Win32?”
Je pense que vous devriez download un binary officiel du repository PHP Windows et l'installer (prendre note du path d'installation).
Après cela, vous devrez configurer Apache pour utiliser le nouveau binary au lieu de celui qu'il a porté par défaut. C'est simple:
-
Trouvez votre file
httpd.conf
dans le dossier WAMP (quelque chose comme C: \ wamp \ bin \ apache \ ApacheXXX \ conf \ httpd.conf) – il peut également être possible de passer par trayicon. -
Ok, maintenant que vous l'avez trouvé, localisez une string correspondant à
LoadModule php5_module
-
Bien, il suffit de replace cette ligne par votre nouveau
php5_module
qui est probaly dans c: /php/php5apache2_2.dll (vous avez enregistré le path d'installation!). Résultat dans quelque chose commeLoadModule php5_module "c:/php/php5apache2_2.dll"
Voila. Réinitialisez le server Wamp et testez votre application avec la dernière version de php build spécialement pour Windows.
Je ne suis pas sûr que cela résolvira votre problème, mais c'est sûrement un véritable path à parcourir. Si vous avez des problèmes sur l'installation de php, lisez cet article .
Bonne chance!
Il semble que cette question existe depuis un moment et si php a été compilé avec des drapeaux unicode n'affecte pas son support unicode, mais si vous devez déterminer si une image PE donnée était probablement compilée contre la version Unicode de la API Windows, vous pouvez utiliser dumpbin
pour examiner les imports kernel32.dll utilisées. Ce n'est pas exactement ce que je ferais de façon pragmatique, mais dans un pincement, cela pourrait fonctionner pour le diagnostic.
Par exemple, un exécutable Unicode pourrait répertorier:
4C CreateFileMappingW 45 CreateDirectoryW 33 CompareSsortingngW 12E GetCurrentDirectoryW AF ExpandEnvironmentSsortingngsW 2F0 SetFileAtsortingbutesW
en notant le nombre de fonctions se terminant par W, aka Wide pour les caractères unicode.
Pour un file exécutable ou DLL ANSI, vous pouvez voir quelque chose de plus proche de:
30A SetCurrentDirectoryA 15E GetFileAtsortingbutesA 171 GetLastError 4B CreateDirectoryA 319 SetFileAtsortingbutesA
Avec la plupart des fonctions se terminant par A, on peut voir que l'exécutable était probablement compilé avec des indicateurs ANSI.
Voici un code sur lequel j'ai travaillé pour traiter un problème de mbssortingng
auquel je me trouvais. J'ai fini par itérer à travers toutes les combinaisons d'enencodings et d'options jusqu'à ce que l'une d'entre elles présentait la sortie dont j'avais besoin. J'ai le sentiment que ce type de procédure pourrait vous aider à find la réponse que vous searchz.
Ne countz pas sur la documentation , comme dans mon cas, les résultats n'étaient pas ce que je pensais que les options et les enencodings ferait. Je me callbackle dans mes tests, j'aurais les rectangles, les s, et les choses comme A ~. Mon test était exactement comme le vôtre, print_r
les informations. Dans mon cas, mon script importe les informations client et de vente dans Quickbooks, qui ne peut pas gérer UTF-8. (Soit QB lui-même ne peut pas ou le pilote QODBC ne peut pas) Tildes, tombes et umlats sont hors de question.
setlocale(LC_CTYPE, 'en_US.UTF-8'); $xmlstr=file_get_contents($file); // convert character encoding to get rid of accents, etc // see http://www.php.net/manual/en/function.mb-detect-encoding.php#89915 // note that unlike ASCII//TRANSLIT and ASCII//TRANSLIT//IGNORE do not work // in windows 7. $xmlstr=iconv('UTF-8', 'ASCII//IGNORE', $xmlstr);
Ce lien ci-dessus est http://www.php.net/manual/en/function.mb-detect-encoding.php#89915 et si Google vous trouve ici, lisez définitivement cela.
Je crois que vous voudrez vérifier si PHP a été compilé avec mbssortingng (ou le module mbssortingng est installé et activé si vous utilisez des modules). L'extension de cette extension devrait résoudre vos problèmes. Cette page devrait vous indiquer tout ce que vous devez savoir pour fonctionner.