2012-12-21 12 views
10

Nel mio codice C#, sto estraendo il testo da un documento PDF. Quando lo faccio, ottengo una stringa in codifica UTF-8 o Unicode (non sono sicuro su quale). Quando uso Encoding.UTF8.GetBytes(src); per convertirlo in un array di byte, noto che lo spazio bianco è in realtà due caratteri con valori di byte di 194 e 160.Come risolvere la codifica UTF per gli spazi bianchi?

Ad esempio la stringa "azione CLE" si presenta come

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

in un array di byte, dove lo spazio bianco è 194 e 160 ... E a causa di questo src.IndexOf("CLE action"); restituisce -1 quando ne ho bisogno per restituire 1.

Come posso risolvere la codifica della stringa?

risposta

17

194 160 è la codifica UTF-8 di un codice NO-BREAK SPACE (lo stesso codice che l'HTML chiama  ).

Quindi non è davvero uno spazio, anche se sembra uno. (Vedrai che non verrà eseguito il word-wrap, ad esempio). Una corrispondenza di espressioni regolari per \s potrebbe corrispondere, ma un confronto semplice con uno spazio non lo farà.

sostituire semplicemente spazi no-break si possono fare le seguenti:

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

Come posso sostituire uno spazio non interrotto con uno spazio comune? – omega

+4

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

1

Interpretazione \xC2\xA0 (= 194, 160) come UTF8 produce effettivamente \xA0 che è unicode spazio unificatore. Questo è un personaggio diverso rispetto allo spazio ordinario e, quindi, non corrisponde agli spazi ordinari. Devi abbinare lo spazio senza interruzioni o usare la corrispondenza sfocata contro qualsiasi spazio bianco.

1

In UTF8 valore di carattere c2 a0 (194 160) è definito come no-break SPACE. Secondo ISO/IEC 8859 questo è uno spazio che non consente l'inserimento di un'interruzione di linea. Normalmente il software di elaborazione del testo presuppone che un'interruzione di riga possa essere inserita in qualsiasi carattere di spazio bianco (in questo modo viene normalmente implementato il ritorno a capo automatico). Dovresti essere in grado di eseguire semplicemente una sostituzione nella stringa dei caratteri con uno spazio normale per risolvere il problema.

+0

Come posso scrivere la funzione di sostituzione stringa? – omega

+1

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

Problemi correlati