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).
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
Vous devez vous connecter pour publier un commentaire.
Êtes-vous à l'aide de LDAP v3?
LDAPv3 supporte l'UTF-8 par défaut, dont il attend des demandes et des réponses par défaut. Voir ici: http://technet.microsoft.com/en-us/library/cc961766.aspx
Exécutez-vous le LDAP script sur une NIX boîte ou une boîte de Windows. Est-il le même serveur que AD est configuré sur? Quelle version de PHP?
Essayez:
iconv("UTF-8", "T.61", $str);
Bon point; j'ai ajouté les informations demandées à la question. ...et:
Wrong charset, conversion from 'UTF-8' to 'T.61' is not allowed
🙁Essayez
ldap_8859_to_t61()
etldap_t61_to_8859
. Voir si cela va vous permettre de convertir desOriginalL'auteur Mike Mackintosh
Voici la solution qui a fonctionné pour moi. Faire les choses suivantes:
1.) D'abord assurez-vous que vous utilisez le protocole LDAP version 3 qui est à l'aide de
"UTF-8" par défaut:
2.) Si vous souhaitez modifier le mot de passe utilisateur, que assurez-vous que l'option "utiliser TLS" est définie à
true
et de l'utilisation de SSL pourfalse
.3.) J'ai utilisé le numéro de port
389
.4.) Utiliser la fonction PHP
ldap_mod_replace
pour remplacer le mot de passe utilisateur.5.) Utiliser la fonction suivante pour encoder vos
$password
:6.) Utiliser la logique suivante pour changer le mot de passe utilisateur:
7.) Veuillez noter que la fonction
encodePassword
encoder vos$password
à l'encodage UTF-8. Si votre mot de passe est codé en UTF-8,ensuite, vous avez à le décoder avant de l'envoyer à l'
encodePassword
fonction. C'est pourquoi j'ai écrit la ligne:Ce code a fonctionné pour moi quand j'fournir des Accents de mot de passe:
äüößÄÜ
etc...Je suis heureux que mon code aidé 😀 Cheers
OriginalL'auteur MrD
J'ai réussi à ajouter des caractères étrangers dans LDAP avec deux étapes:
ajouter l'utilisateur uniquement avec des caractères ASCII (iconv "ASCII//TRANSLIT")
utilisation
ldapmodify
pour mettre à jour le champ(s) avec les caractères UTF-8LDAPv3 est UTF-8, mais l'outil que j'ai utilisé (à partir de
smbldap-tools
) ne traitait pas correctement.OriginalL'auteur mteodor
Une autre chose à mentionner pour ceux qui tombent sur ce:
Si votre texte est déjà en UTF-8, alors n'essayez PAS de le ré-encoder. Remarque les remarques suivantes sur la page de doc pour utf8_encode. Ré-encodage déjà une chaîne codée en résultera texte tronqué. En outre, la fonction permet uniquement pour un codage spécifique à l'autre.
Vous pouvez facilement tester si vous avez besoin de l'UTF-8 encoder la chaîne en faisant quelque chose comme:
Concernant les personnages n'affichant pas correctement sur une page web, mais ils sont sur la CLI, assurez-vous que le réglage de l'charset dans vos en-têtes:
header('Content-type: text/html; charset=utf-8');
OriginalL'auteur ChadSikorra