2011-04-25 28 views
9

Tengo cadenas codificadas en html en una base de datos, pero muchas de las entidades de caracteres no son solo las estándar & y <. Entidades como “ y —. Lamentablemente, necesitamos alimentar estos datos en un lector de rss basado en flash y flash no lee estas entidades, pero sí leen el equivalente de Unicode (ex “).Convertir entidades de caracteres a sus equivalentes Unicode

Usando .Net 4.0, ¿hay algún método de utilidad que convierta la cadena codificada en html para usar entidades de caracteres codificadas en unicode?

Aquí hay un mejor ejemplo de lo que necesito. El PP tiene cadenas HTML como: <p>John &amp; Sarah went to see $ldquo;Scream 4$rdquo;.</p> y lo que necesito para dar salida en el documento RSS/XML con la etiqueta <description> es: &lt;p&gt;John &amp;#38; Sarah went to see &amp;#8220;Scream 4&amp;#8221;.&lt;/p&gt;

estoy usando un XmlTextWriter para crear el documento XML a partir de los registros de bases de datos similares a esta código de ejemplo http://www.dotnettutorials.com/tutorials/advanced/rss-feed-asp-net-csharp.aspx

Necesito reemplazar todas las entidades de caracteres dentro de la cadena html de la base de datos con su equivalente unicode porque el lector de rss basado en flash no reconoce ninguna entidad más allá de las más comunes como &amp;.

+0

¿Estás seguro de que necesita carácter * * entidades en el primer lugar? ¿Por qué no usar los caracteres * unicode * * reales? –

Respuesta

6

Mi primer pensamiento es, puede aceptar su lector de RSS los personajes reales? Si es así, puede utilizar HtmlDecode y alimentar directamente en.

Si es necesario convertirlo a las representaciones numéricas, se puede analizar fuera de cada entidad, HtmlDecode, y luego convertirlo a un int para obtener la base -10 valor unicode. Luego vuelva a insertarlo en la cadena.

EDIT: Aquí hay algo de código para demostrar lo que quiero decir (que no se ha probado, pero tiene la idea de diámetro):

string input = "Something with &mdash; or other character entities."; 
StringBuilder output = new StringBuilder(input.Length); 

for (int i = 0; i < input.Length; i++) 
{ 
    if (input[i] == '&') 
    { 
     int startOfEntity = i; // just for easier reading 
     int endOfEntity = input.IndexOf(';', startOfEntity); 
     string entity = input.Substring(startOfEntity, endOfEntity - startOfEntity); 
     int unicodeNumber = (int)(HttpUtility.HtmlDecode(entity)[0]); 
     output.Append("&#" + unicodeNumber + ";"); 
     i = endOfEntity; // continue parsing after the end of the entity 
    } 
    else 
     output.Append(input[i]); 
} 

es posible que tenga un error off-by-one en algún lugar de ahí, pero debería estar cerca.

+0

Gracias por esto, creo que funcionará. Tiene razón sobre el uso de HtmlDecode para alimentarlo en el lector de flash rss, pero ese código está bajo el control de nuestros clientes y no creo que realmente sepan lo que están haciendo. – Dan

+0

@Dan Suena como un cliente típico :) – ThatMatthew

+0

Hay otra solución aquí http://stackoverflow.com/a/24515287/1021958 usando expresiones regulares – Webbie4

3

¿funcionaría HttpUtility.HtmlDecode para usted?

Me doy cuenta de que no se convierte a entidades equivalentes unicode, sino que lo convierte a unicode. ¿Hay alguna razón específica por la que quieras las entidades equivalentes Unicode?

actualizan edición


 string test = "<p>John &amp; Sarah went to see &ldquo;Scream 4&rdquo;.</p>"; 
     string decode = HttpUtility.HtmlDecode(test); 
     string encode = HttpUtility.HtmlEncode(decode); 

     StringBuilder builder = new StringBuilder(); 
     foreach (char c in encode) 
     { 
      if ((int)c > 127) 
      { 
       builder.Append("&#"); 
       builder.Append((int)c); 
       builder.Append(";"); 
      } 
      else 
      { 
       builder.Append(c); 
      } 
     } 
     string result = builder.ToString(); 
+0

Probablemente deberías editar tu respuesta en lugar de poner comentarios en los comentarios – ChrisWue

+0

No HtmlDecode no funciona.Esto todavía necesita ser un feed rss válido con los caracteres codificados correctamente, pero nuestro cliente también quiere usar este feed rss en un sitio web de publicidad basado en flash. Como dije en mi pregunta, flash no lee estas entidades de caracteres menos comunes, pero lee el equivalente codificado basado en Unicode. – Dan

+1

Desafortunadamente, esto no funciona, ya que codifica todos los caracteres no alfanuméricos en entidades de caracteres, incluidas todas las etiquetas html (corchetes angulares, etc.). Creo que debería haber dado un mejor ejemplo (ver arriba). Gracias por intentarlo, seguiré experimentando con tu código para ver si puedo hacer que funcione. – Dan

0

puede descargar una copia local de las DTDs HTML y/o XHTML apropiadas del W3C. Luego configure un XmlResolver y úselo para expandir cualquier entidad que se encuentre en el documento.

Puede usar una expresión regular para buscar/expandir las entidades, pero eso no sabrá nada sobre el contexto (por ejemplo, cualquier elemento en una sección CDATA no debería expandirse).

-1

esto podría ayudarle a poner en ruta de entrada de texto

 try 
     { 
      FileInfo n = new FileInfo(textBox1.Text); 
      string initContent = File.ReadAllText(textBox1.Text); 
      int contentLength = initContent.Length; 
      Match m; 

      while ((m = Regex.Match(initContent, "[^a-zA-Z0-9<>/\\s(&#\\d+;)-]")).Value != String.Empty) 
       initContent = initContent.Remove(m.Index, 1).Insert(m.Index, string.Format("&#{0};", (int)m.Value[0])); 

      File.WriteAllText("outputpath", initContent); 
     } 

     catch (System.Exception excep) 
     { 

      MessageBox.Show(excep.Message); 

     } 



    } 
+0

reemplaza solo en un archivo que quiero reemplazar en varios archivos ¿Alguien me puede ayudar – user2753776

Cuestiones relacionadas