2011-10-03 12 views
5

che sto cercando di sostituire alcuni caratteri indesiderati in una stringa ricavato da un foglio di calcolo Excel. Il motivo è che il nostro database Oracle sta usando il set di caratteri WE8ISO8859P1, che non definisce diversi personaggi che Excel "utilmente" Inserti per voi nel testo (virgolette curve, em e en trattini, etc.) Dal momento che non ho alcun controllo sul database o come vengono creati i fogli di calcolo Excel Ho bisogno di sostituire i caratteri con qualcos'altro.Sostituzione caratteri Unicode specifiche nelle stringhe lette da Excel

a recuperare il contenuto della cella in una stringa così:

string s = xlRange.get_Range("A1", Missing.Value).Value2.ToString().Trim(); 

Visualizzazione della stringa nel Visualizzatore di testo di Visual Studio mostra il testo per essere completa e correttamente recuperato. Avanti provo e sostituire uno dei personaggi indesiderati (in questo caso il simbolo citazione riccio di destra):

s = Regex.Replace(s, "\u0094", "\u0022"); 

Ma non fa nulla (Visualiser Testo dimostra ancora di essere lì). Per provare e verificare che il carattere che voglio sostituire sia effettivamente lì, ho provato:

bool a = s.Contains("\u0094"); 

ma restituisce falso. Tuttavia:

bool b = s.Contains("”"); 

restituisce true.

mia (un po 'carente) comprensione delle stringhe in .NET è che sono codificati in UTF-16, mentre Excel sarebbe probabilmente usando ANSI. Quindi vuol dire che ho bisogno di cambiare la codifica del testo mentre esce da Excel? O sto facendo qualcos'altro di sbagliato qui? Qualsiasi consiglio sarebbe molto apprezzato. Ho letto e riletto tutti gli articoli che posso trovare su Unicode e la codifica, ma non ne ho ancora la più saggia.

risposta

4

Sì stringhe in .Net sono UTF-16.

Stai facendo bene; forse la tua matematica esadecimale non è corretta. Il personaggio per cui hai provato non è "\u0094" (non è sicuro che si tratti di ciò che intendevi). Di seguito ha lavorato per me:

((int)"”"[0]).ToString("X") rendimenti "201D"

"”" == "\u201D" restituisce true

"\u0094" == "" (lato destro è una stringa vuota) restituisce false

Un sacco di UTF-16 caratteri sembreranno come una stringa vuota dal visualizzatore di testo, ma possono essere sia un carattere non visualizzabili o parte di un surrogato (cioè alcuni caratteri può essere necessario digitare "\UXXXXXXXX" mentre altri si ca n fare con (quattro cifre) "\uXXXX".). La mia conoscenza di questo dominio è molto limitata.

Referenze - Jon Skeet 's articoli su:

+0

Sì, hai perfettamente ragione, i miei valori esadecimali erano lontani. Risulta che stavo usando punti codice per il set di caratteri WIN1252 invece di UTF-16. Un giorno capirò tutto questo (sul quale sarà sostituito da qualcosa di molto più complicato in incomprensibile). Grazie per la risposta. –

2

È possibile utilizzare NVARCHAR e NTEXT invece di VARCHAR e TEXT per le colonne che devono accogliere quei personaggi . In questo modo non è necessario convertire l'intero database e si è a prova di futuro, perché le colonne saranno Unicode.

+0

Sì, sarebbe l'ideale, ma purtroppo non ho alcun controllo sul database. –

+0

@ SidHolland Qualsiasi aiuto qui per favore? :) http://stackoverflow.com/questions/36393449/special-characters-in-oracle-nclob –