2015-07-18 4 views
-2

Fondamentalement, je fais des conversions de PDF en texte, puis j'analyse et clippe des parties de ce texte en utilisant une bibliothèque en Python. Le "clipping" de Python ne coupe pas le texte en fichiers séparés, il a simplement un caractère de début et une position de fin pour l'extraction de chaîne. Par exemple:Différence de codage C#/Python

the quick brown fox jumped over the lazy dog 

Mon code python peut découper « rapide » en spécifiant 4, 9. Ensuite, je me sers C# pour un programme graphique et essayer de prendre ces valeurs affectées par Python, et il fonctionne ... pour la plupart. Il semble que le programme de reconnaissance optique de caractères qui a transformé le fichier pdf en un fichier texte incluait des caractères UTF impairs qui modifieraient les comptes du côté C#. Les caractères de conversion des caractères impairs PDF-TXT incluent un caractère "fi", au lieu d'un caractère "f" et "i" (éventuellement d'autres caractères, ce sont des fichiers volumineux). Cela ne poserait plus de problème , sauf que C# indique qu'il s'agit d'un caractère et que Python (ainsi que Notepad ++) considère ces 3 positions de caractères.

C#: "fi" longueur = 1 caractère.

Python/Notepad ++: longueur "fi" = 3 caractères.

Ce que cela finit par faire est de me donner un clip de décalage en raison de la différence de nombre de caractères. Comme je l'ai dit quand je l'ai exécuté en python (linux) et que j'ai essayé de sortir l'écrêtage parfait, j'ai ensuite transféré le fichier texte sur Windows et Notepad ++ confirme que ce sont les bonnes positions. C# compte vraiment le "fi" comme un caractère et Notepad ++ ainsi que Python compte comme 3 caractères pour une raison quelconque.

J'ai besoin d'un moyen de combler cette divergence du côté Python OU du côté C#.

Répondre

1

Vous devez faire la distinction entre les caractères et les octets. utf8 est un encodage de caractères, où un caractère peut avoir jusqu'à 4 octets. Donc, notepad ++ affiche probablement des positions d'octets, où Python peut travailler avec des octets et des chaînes de caractères. En C# ont probablement lu le fichier en tant que fichier texte, qui produit également des chaînes de caractères.

Pour lire des chaînes de caractères utilisé python:

import codecs 
with codecs.open(filename, encoding="utf-8") as inp: 
    text = inp.read() 
+0

En python J'utilise f = open (fichier) str = pour obtenir les emplacements f.read() puis str.find(), que l'habitude être une chaîne de caractères? – projectgonewrong

+0

non, sera chaîne d'octets. – Daniel