2011-10-03 16 views
5

Estoy intentando reemplazar algunos caracteres no deseados en una cadena recuperada de una hoja de cálculo de Excel. El motivo es que nuestra base de datos Oracle está utilizando el juego de caracteres WE8ISO8859P1, que no define varios caracteres que Excel "útilmente" inserta para usted en texto (comillas, em y en guiones, etc.) ya que no tengo control sobre la base de datos o cómo se crean las hojas de cálculo de Excel, necesito reemplazar los caracteres con algo más.Reemplazo de caracteres Unicode específicos en cadenas leídas de Excel

puedo recuperar los contenidos de las celdas en una cadena de este modo:

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

Visualización de la cadena en Visualizador de texto de Visual Studio muestra el texto a ser completa y recuperado correctamente. Siguiente I tratar de reemplazar a uno de los personajes indeseables (en este caso el símbolo cita de rizado de la derecha):

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

pero no hace nada (visualizador de texto demuestra que todavía estuviera allí). Para probar y verificar que el personaje que yo quiero reemplazar es en realidad allí, he intentado:

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

pero vuelve falsa. Sin embargo:

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

devuelve verdadero.

Mi (algo deficiente) comprensión de las cadenas en .NET es que están codificadas en UTF-16, mientras que Excel probablemente usaría ANSI. Entonces, ¿eso significa que necesito cambiar la codificación del texto tal como sale de Excel? ¿O estoy haciendo algo más mal aquí? Cualquier consejo sería muy apreciado. He leído y releído todos los artículos que puedo encontrar sobre Unicode y codificación, pero aún no soy más prudente.

Respuesta

4

Sí, las cadenas en .Net son UTF-16.

Lo estás haciendo bien; tal vez su matemática hexadecimal es incorrecta. El personaje que ha probado no es "\u0094" (No estoy seguro de que sea eso lo que quiso decir). Los siguientes trabajó para mí:

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

"”" == "\u201D" devuelve true

"\u0094" == "" (lado derecho es la cadena vacía) devuelve false

Una gran cantidad de UTF-16 caracteres parecerá tan una cadena vacía por el visualizador de texto, pero pueden ser un personaje indiscutible o parte de un sustituto (es decir, es posible que algunos caracteres deban escribirse "\UXXXXXXXX", mientras que otros pueden caber n hacer con (cuatro dígitos) "\uXXXX"). Mi conocimiento de este dominio es muy limitado.

Referencias - Jon Skeet 's artículos sobre: ​​

+0

Sí, tienes razón, mis valores hexadecimales estaban muy lejos. Resulta que estaba usando puntos de código para el juego de caracteres WIN1252 en lugar de UTF-16. Algún día entenderé todo esto (sobre lo cual será reemplazado por algo mucho más complicado en incomprensible). Gracias por la respuesta. –

2

Puede utilizar NVARCHAR y NTEXT en lugar de VARCHAR y texto para las columnas que necesitan para dar cabida a esos caracteres . De esta forma, no tiene que convertir toda la base de datos, y es una prueba futura, porque las columnas serán Unicode.

+0

Sí, eso sería ideal, pero lamentablemente no tengo control sobre la base de datos. –

+0

@SidHolland ¿Alguna ayuda aquí, por favor? :) http://stackoverflow.com/questions/36393449/special-characters-in-oracle-nclob –