11
votes

C #: Conversion des octets [] à la chaîne codée UTF8

J'utilise une bibliothèque appelée Exifextractor pour extraire des informations de métadonnées des images. Cette partie est en partie utilise system.drawing.iming.propertyitem faire tout le travail acharné. Certaines des données de biens immobiliers, telles que les détails de l'image etcetera, sont extraites comme une chaîne ASCII stockée dans un octet [] selon la documentation Microsoft.

Mon problème est que les personnages internationaux (`¥, ¤, ö, etc., etc.) sont abandonnés et remplacés par des questions. Lorsque je débobile le code, il est évident que l'octet [] est une représentation d'un UTF-8.

J'aimerais analyser l'octet [] comme une chaîne UTF8, comment puis-je faire cela sans perdre d'informations dans le processus?

Merci d'avance!


MISE À JOUR:

On m'a demandé de fournir un extrait de mon code: < / p>

Le premier extrait est de la classe I utilise, à savoir le exifextractor.cs écrit par asim goheer xxx

et ceci est mon code où je fais de mon mieux pour gérer les résultats de ce qui précède. xxx

J'ai aussi essayé deux autres façons d'obtenir mon précieux ä, ä, ¶ Des données, mais rien ne semble faire l'affaire. Je commence à penser que Hans Passant a raison dans ses conclusions dans sa réponse ci-dessous.


2 commentaires

Si les informations sont lues à l'aide du codage ASCII, tous les caractères non-ASCII ne seront pas lus correctement en conséquence. Cette lecture de caractères avec un codage puis une rédaction d'un tableau d'octets ne semble pas bien. Pouvez-vous créer un lien vers la documentation qui indique que c'est le cas?


Ici, si je suis autorisé à poster un autre hyperlien :) msdn.microsoft.com/en-us/library/...


4 Réponses :


4
votes

Utilisez le getString méthode sur le coding.utf8 objet.


0 commentaires

39
votes
string yourText = System.Text.Encoding.UTF8.GetString(yourByteArray);

6 commentaires

Merci pour la réponse rapide. Cependant j'ai déjà essayé cela. Pas de chance. Je commence à me demander si les sources (fichiers image) sont correctement codées en premier lieu.


Si vous pouvez partager un exemple, nous pouvons vérifier ou essayer le nôtre.


Bien sûr. Depuis que je suis nouveau à cela, dois-je le fournir comme une réponse ou dans un commentaire ou quelle est la manière préférée de le faire?


Vous devriez éditer et mettre à jour votre question. Une étiquette de "mise à jour" audacieuse dans le texte avec la "nouvelle" substance devrait faire.


S'il vous plaît voir mon commentaire dans la réponse de Hans Passant


Très bien, cela semble être la solution après tout. Sorte de, au moins. J'étais juste un peu en ce qui concerne le codage. Les métadonnées semblent être codées à l'aide de ISO-8859-1, ce qui a du sens puisque nous utilisons des fenêtres sur tous nos sites. Donc je crée simplement un encodeur: coding Enc = coding.gecoding ("ISO-8859-1"); Ensuite, je l'utilise pour décoder le tableau d'octets: v = enc.getstring (p.value, 0, p.len - 1); Où p est le propéryité. Cela semble fonctionner! Merci pour votre aide! Je suis impressionné par votre enthousiasme et votre aide. Espérons que je peux hommage de la même manière! Merci encore!



1
votes

Peut-être que vous pourriez essayer un autre codage? Utf16, Unicode? Si vous n'êtes pas sûr de ne pas être encodé en premier lieu en premier lieu, essayez de visualiser les métadonnées Exif avec un autre lecteur Exif.


0 commentaires

2
votes

Oui, il s'agit d'un problème avec l'application ou la caméra originaire de l'image. La norme EXIF ​​a un support horrible pour le texte, il doit être codé en ASCII. Cela ne fonctionne que seulement lorsque le photographe parle anglais. Nul doute que le logiciel qui a codé l'image ignore cette exigence. C'est ce que la classe de propriététem va également, elle code une chaîne à des octets [] avec Marshal.stringtoHglobalansi (), qui assume la page de code par défaut du système.

Il n'y a pas de solution évidente pour cela, vous obtiendrez de la mojibake lorsque la photo a été faite trop loin de votre machine.


5 commentaires

C'était ce que je m'attendais. Dans quelle mesure j'espérais toujours que Photoshop et l'outil intégré de XMP seraient capables d'obtenir des choses droites. Y a-t-il des suggestions sur ce que l'on pourrait faire pour résoudre le problème? Ma compagnie a beaucoup de fichiers avec un mauvais codage, donc un processeur de lots serait préféré.


Est-il toujours vrai que dans le tableau des octets, tous les octets sont corrects selon vos paramètres régionaux? Si tel est le cas, vous pouvez essayer de coder / décoder à l'aide de votre local au lieu de UTF8 / ASCII. Voir MSDN.MicRosoft.com/en-us/Library / ...


J'ai téléchargé une application appelée Geosetter qui est utilisée pour les photos Geotag, mais elle a également les capacités de lire et d'écrire Exif- et IPTC-MetaData. Il me dit que les métadonnées sont codées UTF-8 et affichent correctement les caractères suédois.


Je me demande si vous pouvez ajouter un exemple d'une telle image (si elle est autorisée). Vous pouvez modifier l'image aussi, tant que les données EXIF ​​sont toujours écrites.


Je pourrais être sur le bon parcours vers une solution. J'ai réussi à modifier la classe Exifextractor pour traduire le tableau des octets en une chaîne correctement codée immédiatement. Je conduirai encore plus de recherches et pourra bientôt dire si mes théories tiennent!