2009-09-25 7 views
1

J'utilise Unicode SynEdit, qui (en théorie) a la détection de base d'encodage de fichier/flux. Cela a bien fonctionné jusqu'à ce que j'essaye d'ouvrir le fichier qui a été généré par mon script PHP. Le fichier dont je parle est détecté par UniSynEdit comme utf8 sans nomenclature. Malheureusement, il ne s'ouvre pas - la chaîne chargée est vide. Je l'ai débogué, et il semble que le problème est la fonction Utf8Decode, qui échoue pour une raison quelconque et renvoie une chaîne vide. J'ai aussi vérifié le fichier avec l'éditeur hexadécimal, et c'est vrai: il n'a pas de nomenclature, tous les caractères normaux sont codés en utilisant un octet, tandis que certaines lettres polonaises que j'ai dans le fichier sont en double octet. ..Delphi, détection de charset ([Uni] SynEdit) - Problème Utf8Decode

Qu'est-ce qui pourrait ne pas fonctionner, et comment puis-je empêcher cela? Je crois que l'encodage incorrect chargé est meilleur que pas de fichier du tout ...

+0

Dans quelle version de Delphi êtes-vous? –

+0

J'ai oublié d'écrire ... Delphi 7. – migajek

+0

Que se passe-t-il quand il y a une nomenclature? –

Répondre

3

Si vous voulez vraiment charger des fichiers qui ne sont pas encodés correctement en UTF-8, alors vous devez utiliser une fonction qui ne retourne pas un résultat vide pour une chaîne contenant des séquences d'octets invalides, mais les remplace à la place par un caractère de remplacement. Voir le Wikipedia entry on UTF-8, en particulier la section "Séquences d'octets invalides".

Malheureusement le Delphi 2009 (ne pas avoir Delphi 7 à vérifier là) UTF8Decode() appelle MultibyteToWideChar(CP_UTF8, ...) en interne, ce qui renvoie une erreur sur les séquences d'octets invalides.

Ce que vous devez faire est d'utiliser une autre fonction d'encodage. Peut-être qu'il y a quelque chose dans l'une des bibliothèques Delphi tierces qui ont leurs propres fonctions de décodage. Peut-être que vous pourriez utiliser l'une des bibliothèques liées here. Si tout le reste échoue, vous pouvez écrire le vôtre, peut-être basé sur this code du consortium Unicode.

+0

BTW: Si vous n'avez même pas * signifié * votre script PHP pour créer un fichier UTF-8 - détrompez-vous à ce sujet. Il devrait, et de préférence valide UTF-8 :-) – mghie

+0

ce n'est pas un point :) En fait, grâce à cela j'ai trouvé mon application échouée à un moment donné, jusqu'à présent j'étais sûr qu'il gère tous les fichiers ** valides **. et c'est le cas. Mais je n'avais aucune chance de tester à nouveau ces invalides;) – migajek

+0

Merci, il semble que l'utilisation de UTF8StringToWideString de cUnicodeCodecs (Delphi Fundamentals) fonctionne bien:] – migajek

Questions connexes