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?

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):

phpinfo screen shot

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?)

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 comme LoadModule 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.

  • utiliser curl contre mon IDN ne fonctionne pas correctement; les browsers sont OK
  • Imapsync ne synchronise pas correctement les caractères unicode
  • Existe-t-il un benchmark de performance MySQL pour mesurer l'impact de utf8_unicode_ci versus utf8_general_ci?
  • Comment faire pour que la commande "moins" gère UTF-8?
  • Logcheck: caractères generics qui incluent des caractères non latins
  • La meilleure façon de s'assurer qu'une base de données MySQL est entièrement dans UTF8
  • Pourquoi Firefox ne génère-t-il pas ce html généré par AWstats?
  • Prise en charge de Linux pour les noms de files Unicode
  • Comment cite-t-on les caractères unicode dans mysql ou SQL en général?
  • Comment append des inputs non latines dans le file hosts
  • UnicodeEncodeError lors de l'import de files dans Django admin
  • Les astuces du serveur de linux et windows, tels que ubuntu, centos, apache, nginx, debian et des sujets de rĂ©seau.