Les caractères étrangers et LDAP. Quel encodage/charset ne LDAP attendre?

Je suis d'analyse XML, avec simplexml_load_string(), et en utilisant les données de mise à jour Active Directory (AD) des objets, via LDAP.

Exemple XML (simplifié):

<?xml version="1.0" encoding="UTF-8"?>
<users>
    <user>Bìlbö Bággįnš</user>
    <user>Gãńdåłf Thê Gręât</user>
    <user>Śām Wīšë</user>
</users>

J'ai tout d'abord exécuter une ldap_search() de trouver un seul utilisateur, puis passez à modifier leurs attributs. Pompage les valeurs ci-dessus directement dans AD, LDAP, sera en partie assez mutilé caractères.

Par exemple: Bìlbö Bággįnš

J'ai essayé les fonctions suivantes, en vain:

utf8_encode($str);
utf8_decode($str);
iconv("UTF-8", "ISO-8859-1//TRANSLIT", $str);
iconv("UTF-8", "ASCII//TRANSLIT", $str);
iconv("UTF-8", "T.61", $str);

Idéalement, je ne veux pas faire aucune de ces conversions de chaînes. UTF-8 devrait être beau, non?!

J'ai aussi remarqué ce qui suit:
J'ai imprimé les valeurs de voir comment ils s'en sortent. curl-ing le script dans l'interface de ligne affichera les caractères corrects, mais les navigateurs web affichent le même que AD.

Ce qu'il se passe? Devrais-je être à la recherche de quelque chose d'autre, par exemple. Le codage d'URL?
J'espère que c'est une simple erreur sur ma fin.

EDIT:
Je suis entré dans ces caractères à l'aide d'ANNONCES de l'interface d'administration afin de voir comment ils s'en sortent. Je peux les lire via LDAP amende. Corriger les caractères sont affichés dans un navigateur. curl-ing via l'interface CLI montrera les points d'interrogation à la place des caractères étrangers. En passant de l'une de ces valeurs renvoyées dans mb_detect_encoding() sera de retour en UTF-8.

J'ai décidé de modifier immédiatement le même objet par le pas de l'écriture dans une nouvelle chaîne, mais juste inverser la valeur existante et la sauvegarde de l'objet. Cela fonctionne très bien - je voir la bonne valeur (reprises) dans AD.

  • En développement sur Mac OS X 10.7 Lion - PHP 5.4.3
  • De production: Red Hat 6 - PHP 5.4.3
  • AD serveur: Windows 2003

Mise à JOUR:
Après quelques mois, j'ai été incapable de trouver la réponse/solution à ce problème.
En fin de compte, je suis allé avec le remplacement de caractères non accentués équivalent (PAS l'idéal, je sais).

Utilisation bin2hex() sur l'un de ces valeurs, afin de nous montrer la chaîne binaire de valeurs.
bin2hex( á ) == c3a1. Je ne sais pas si tout ce qui arrive au personnage qu'il est copié et collé un peu partout. Presse-papiers du système peut corrompre/changement (?).
Je suppose que LDAP/AD, qui est une version de Microsoft LDAP est en WINDOWS-1250 codage tel que rien de la part de Microsoft... Donc iconv("UTF-8", "WINDOWS-1250", $str); devrait fonctionner.
Il n'aime pas WINDOWS-1250 - iconv(): Detected an illegal character in input string
est-il rien à voir avec le fichier php lui-même n'a pas l'encodage UTF8 ? le fichier php accéder à ldap doit définir le type d'encodage en UTF-8?

OriginalL'auteur OmidTahouri | 2012-06-14