Convertir ANSI (Windows 1252) pour de l'utf-8 en C#
J'ai demandé cela avant dans un rond-point avant ici sur un Débordement de Pile et voulez bien faire les choses cette fois. Comment puis-je convertir ANSI (page de Codes 1252) en UTF-8, tout en préservant les caractères spéciaux? (Je suis conscient que l'UTF-8 prend en charge un plus grand jeu de caractères de la norme ANSI, mais il est correct si je peux conserver tous les caractères UTF-8 qui sont pris en charge par l'ANSI et remplacer le reste avec un ?
ou quelque chose)
Pourquoi je Veux Convertir ANSI → UTF-8
Je suis fondamentalement écrire un programme qui divise les fichiers vCard (VCF) dans des fichiers individuels, chacun ne contenant qu'un seul contact. J'ai remarqué que Nokia et Sony Ericsson téléphones enregistrer la sauvegarde VCF fichier en UTF-8 (sans BOM), mais Android enregistre dans la norme ANSI (1252). Et Dieu sait dans quels formats les autres téléphones de les enregistrer dans!
Donc mes questions sont les
- N'est-il pas une norme de l'industrie pour les fichiers vCard' encodage des caractères?
- Qui est plus facile pour ma résolution de mon problème? La conversion ANSI UTF8 (et/ou l'inverse), ou à essayer de détecter l'encodage du fichier d'entrée a et la notification de l'utilisateur à ce sujet?
tl;dr
Besoin de savoir comment faire pour convertir l'encodage des caractères à partir de (ANSI /UTF8) à (UTF8 /ANSI) tout en préservant tous les caractères spéciaux.
OriginalL'auteur GPX | 2010-12-08
Vous devez vous connecter pour publier un commentaire.
VCF est encodé en utf-8, comme exigé par le spec dans le chapitre 3.4. Vous avez besoin de prendre cela au sérieux, le format serait tout à fait inutile, si ce n'est pas coulé dans le béton. Si vous constatez qu'un Android app amputation des caractères accentués ensuite travailler à partir de l'hypothèse que c'est un bug dans l'application. Ou, plus probablement, qu'il a obtenu de mauvais info d'ailleurs. Votre tentative de correction de l'encodage serait alors la cause plus problèmes parce que votre version de la carte ne sera jamais correspondre à l'original.
Vous convertir à partir de 1252 à l'utf-8 avec le Codage.GetEncoding(1252).GetString(), en passant dans un byte[]. Ne jamais essayer d'écrire du code qui lit une chaîne de caractères et tappe dans un byte[] de sorte que vous pouvez utiliser la méthode de conversion, qui fait juste des problèmes d'encodage d'un beaucoup pire. En d'autres termes, vous avez besoin de lire le fichier avec FileStream, pas StreamReader. Mais encore une fois, éviter la fixation des problèmes des autres.
Vérifiez ce projet: code.google.com/p/android-vcard
dans .net de base , codage 1252 n'existe pas, besoin d'être installé, réf: stackoverflow.com/questions/37870084/...
OriginalL'auteur Hans Passant
Vous ne devriez pas vous convertir à partir d'un encodage à l'autre. Vous devez lire chaque fichier à l'aide de l'encodage qu'il a été créé avec, ou vous allez perdre de l'information.
Une fois que vous lisez le fichier en utilisant l'encodage correct, vous avez le contenu d'une chaîne Unicode, à partir de là, vous pouvez l'enregistrer à l'aide de n'importe quel encodage vous le souhaitez.
Si vous avez besoin de détecter l'encodage, vous pouvez lire le fichier en octets, et ensuite chercher les codes de caractères qui sont spécifiques soit pour l'encodage. Si le fichier ne contient pas de caractères spéciaux, soit de l'encodage de travail que les personnages 32..127 sont les mêmes pour les deux codages.
OriginalL'auteur Guffa
C'est ce que j'utilise en C# (je l'ai utilisé pour convertir de Windows-1252 à UTF8)
OriginalL'auteur djunod
Je faire de cette façon:
OriginalL'auteur Johannes Barta
J'ai trouvé cette question tout en travaillant pour traiter une grande collection d'anciens fichiers texte bien formaté en format Pdf. Aucun des fichiers ont une NOMENCLATURE, et la plus ancienne des fichiers qui contiennent la page de Codes 1252 du code de points que provoquer des erreurs de décodage de l'UTF8. Cela n'arrive que de temps en temps, UTF8 travaille la majorité du temps. Aussi, la dernière en date des données de texte NE contiennent UTF8 points de code, donc c'est un sac mélangé.
Donc, j'ai également mis hors "pour détecter l'encodage du fichier d'entrée a" et après la lecture de Comment détecter l'encodage d'un fichier texte? et Comment faire pour déterminer l'encodage de texte? est arrivé à la conclusion que ce serait difficile, au mieux.
MAIS, j'ai trouvé Le Minimum Absolu que Tout Développeur Doit Absolument, Positivement Savoir Sur Unicode et les Jeux de Caractères dans les commentaires, à le lire, et j'ai trouvé ce bijou:
L'intégralité de l'article est court et bien la peine de le lire.
Donc, j'ai résolu mon problème avec le code suivant. Puisque seule une petite quantité de mon texte contient des données caractère difficile des points de code, je n'ai pas l'esprit de la surcharge de performance de la gestion des exceptions, surtout que ce n'avait qu'à exécuter une seule fois. Peut-être il y a de plus intelligent des moyens d'éviter la
try/catch
mais je n'ai pas de peine à concevoir.Il est également intéressant de noter que le StreamReader classe a des constructeurs qui prennent un Codage spécifique de l'objet, et comme je l'ai montré, vous pouvez ajuster la EncoderFallback/DecoderFallback comportement en fonction de vos besoins. Donc, si vous avez besoin d'un StreamReader ou StreamWriter pour plus fine de travail, cette approche peut encore être utilisé.
OriginalL'auteur MJB
Comment j'ai résolu ce problème:
J'ai le fichier vCard (*.vcf) - 200 contacts dans un seul fichier, la langue russe...
Je l'ai ouvert avec vCardOrganizer 2.1 programme fait ensuite Diviser diviser sur 200....et ce que je vois - contacts avec le désordre des symboles, la seule chose que je peux lire des nombres 🙂 ...
Suit: (lorsque vous effectuez ces étapes, être patient, il faut parfois du temps)
Ouvrir le fichier vCard (ma taille du fichier est de 3 mo) avec "bloc-notes"
Ensuite, allez dans le Menu Fichier-Enregistrer Sous ... " dans la fenêtre qui s'ouvre choisissez le nom de fichier, n'oubliez pas de mettre .vcf et l'encodage ANSI ou UTF-8...et, enfin, cliquez sur Enregistrer..
Je les ai converti en nom de fichier.vcf (UTF-8) de nom de fichier.vcf (ANSI) - rien ne se perd et parfait lisible de la langue russe...si vous avez quête d'écrire: [email protected]
Bonne Chance !!!
OriginalL'auteur user3163460