Question

J'ai un script php qui accède à une base de données MSSQL2005, lit certaines données et envoie les résultats par courrier.

Il existe des caractères spéciaux dans certains noms de colonnes et dans les champs eux-mêmes.

Lorsque j'accède au script via mon navigateur (webserver iis), la requête est exécutée correctement et le contenu du courrier est correctement codé (pour mon public cible). Cependant, lorsque j'exécute php à partir de la console, la requête échoue (en raison des caractères spéciaux dans les noms de colonne). Si je remplace les caractères spéciaux de la requête par des appels à chr () et par le code de caractère de latin-1, la requête est exécutée correctement, mais les résultats sont également codés en latin-1 et ne s'affichent donc pas correctement dans le courrier. Pourquoi PHP / le pilote MSSQL / & # 8230? en utilisant un encodage différent dans les deux scénarios? Y a-t-il un moyen de le contourner?

Si vous vous le demandez, j'ai besoin de la console car je veux planifier le script à l'aide de SQLAgent (ou du gestionnaire de tâches ou autre).

Était-ce utile?

La solution

En fonction du type de caractères que vous avez dans votre base de données, cela pourrait être une limitation de la console, je suppose. Si vous tapez chcp dans la console, vous verrez quelle est la page de code active, ce qui pourrait ressembler à CP437 , également appelé ASCII étendu. Si vous avez des caractères hors de cette page de code, comme dans UTF8, vous pourriez rencontrer des problèmes. Vous pouvez modifier la page de code active en cours en tapant chcp 65001 pour passer à UTF8.

Vous pouvez également modifier la police Raster par défaut en Lucida Console en fonction des caractères requis, car toutes les polices ne prennent pas en charge les caractères étendus (clic droit sur le titre, les propriétés et la police de la fenêtre d'invite de commande.

Comme déjà dit, le support unicode de PHP n’est pas idéal, mais vous pouvez le faire en PHP5 avec quelques appels de fonctions bien placés de utf8_decode . Le secret de l'encodage de caractères est de bien comprendre quel est l'encodage actuel de tous les outils que vous utilisez: base de données, connexion à la base de données, octets actuels de votre variable PHP, votre sortie sur l'écran de la console, vos e-mails. body encoding, votre client de messagerie, etc.

Pour tout ce qui a des caractères spéciaux, de nos jours, quelque chose comme UTF8 est souvent recommandé. Assurez-vous que tout le long du chemin est défini sur UTF8 et convertissez uniquement si nécessaire.

Autres conseils

Le faible support de PHP pour le monde non anglais est bien connu. Je n'ai jamais utilisé de base de données contenant des caractères extérieurs au domaine ASCII de base, mais de toute évidence, vous avez déjà un moyen de contourner le problème et il semble que vous n'ayez plus qu'à vivre avec.

Si vous souhaitez aller plus loin, vous pouvez: 1. Ecrivez un tableau contenant tous les caractères spéciaux et leurs équivalents CHR 2. foreach le tableau et str_replace sur la requête

Mais si la requête est codée en dur, je suppose que ce que vous avez est bien. Assurez-vous également que vous utilisez la dernière version de PHP, au moins 4.4.x. Cette modification a toujours été corrigée, mais j’ai feuilleté les notes de publication 4.x.x et je ne vois rien qui se rapporte à votre problème.

Ce qu'il faut retenir des chaînes PHP, c'est qu'elles sont des flux d'octets. Si vous voulez obtenir les données dans le bon jeu de caractères (quel que soit ce que vous faites), vous devez le faire explicitement via une sorte de fonction ou de filtre. Tout cela est plutôt bas.

En fonction de votre configuration, vous devrez peut-être connaître le jeu de caractères interne des chaînes de la base de données, mais au minimum, vous devez savoir quel jeu de caractères la base de données envoie à PHP (car rappelez-vous que PHP juste un flux d'octets).

Ensuite, vous devez connaître le jeu de caractères cible (et éventuellement le spécifier, ce que vous devriez de toute façon). Par exemple, supposons que vous obtenez utf-8 à partir de la base de données mais souhaitez envoyer un latin-1 (et donc en base64 ou q-imprimable codé en tant que 'Contenu-transfert-codage'):

$send_string = base64_encode(utf8_decode($database_string));

Bien sûr, dans ce cas, vous devez savoir que tous les caractères utf-8 existent dans le jeu de caractères latin-1, et vous ne voudriez probablement pas vraiment base64 (PHP n'a malheureusement pas un bon q- fonction d'encodage imprimable, bien que curieusement, elle le fasse pour le décodage), et si vous ne parlez pas d'Utf-8 < = > latin-1, vous voudrez fouetter les fonctions mbstring à la place.

En ce qui concerne la console, vous devez savoir ce que PHP obtient lorsque vous saisissez des caractères spéciaux à partir de la console, ce qui dépend probablement des paramètres du shell et / ou de PHP. Mais rappelez-vous que PHP ne comprend les chaînes que comme octet, octet, octet, et vous devriez pouvoir le résoudre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top