2012-12-21 4 views
10

In meinem C# -Code extrahiere ich Text aus einem PDF-Dokument. Wenn ich das mache, bekomme ich eine Zeichenfolge, die in UTF-8 oder Unicode codiert ist (ich bin mir nicht sicher, welche). Als ich Encoding.UTF8.GetBytes(src); verwenden Sie es in eine Byte-Array zu konvertieren, merke ich, dass die Leerzeichen tatsächlich zwei Zeichen mit Byte-Werten von 194 und 160Wie UTF-Codierung für Leerzeichen zu beheben?

Zum Beispiel der Zeichenfolge „CLE Aktion“ sieht aus wie

[67, 76, 69, 194 ,160, 65 ,99, 116, 105, 111, 110] 

in einem Byte-Array, wo der Whitespace ist 194 und 160 ... Und deshalb src.IndexOf("CLE action"); gibt -1 zurück, wenn ich brauche, um 1 zurückzugeben.

Wie kann ich die Codierung der Zeichenfolge beheben?

Antwort

17

194 160 ist die UTF-8-Codierung eines NO-BREAK SPACE Codepoints (derselbe Codepoint, den HTML aufruft  ).

Also es ist wirklich kein Leerzeichen, auch wenn es wie eins aussieht. (Sie werden sehen, dass zum Beispiel kein Zeilenumbruch erfolgt.) Eine Übereinstimmung mit einem regulären Ausdruck für \s würde dazu passen, ein einfacher Vergleich mit einem Leerzeichen jedoch nicht.

einfach NO-BREAK Leerzeichen ersetzen Sie Folgendes tun können:

src = src.Replace('\u00A0', ' '); 
+0

Wie kann ich ein schadloses Feld durch ein normales ersetzen? – omega

+4

@omega: src = src.Replace ('\ u00A0', ''); – RichieHindle

1

Interpretieren \xC2\xA0 (= 194, 160) als UTF8 \xA0 tatsächlich ergibt, die Unicode non-breaking Raum ist. Dies ist ein anderes Zeichen als der gewöhnliche Raum und entspricht daher keinen gewöhnlichen Räumen. Sie müssen mit dem nicht-brechenden Leerzeichen übereinstimmen oder Fuzzy-Matching für jedes Leerzeichen verwenden.

1

In UTF8-Zeichenwert c2 a0 (194 160) als NO-BREAK SPACE definiert ist. Laut ISO/IEC 8859 ist dies ein Leerzeichen, das das Einfügen eines Zeilenumbrüchens nicht zulässt. Normalerweise geht Textverarbeitungssoftware davon aus, dass ein Zeilenumbruch bei jedem Leerzeichen eingefügt werden kann (so wird Word-Umbruch normalerweise implementiert). Sie sollten in der Lage sein, einfach eine Zeichenfolge in der Zeichenfolge mit einem normalen Leerzeichen zu ersetzen, um das Problem zu beheben.

+0

Wie kann ich die String-Replace-Funktion schreiben? – omega

+1

@omega: src = src.Replace ('\ u00A0', ''); – RichieHindle

Verwandte Themen