Convierta entidades de caracteres a sus equivalentes de Unicode

Tengo html cadenas codificadas en una base de datos, pero muchas de las entidades de caracteres no son solo el 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 ).

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 archivo db tiene cadenas html como:

John & Sarah went to see $ldquo;Scream 4$rdquo;.

John & Sarah went to see $ldquo;Scream 4$rdquo;.

y lo que necesito mostrar en el documento rss / xml con la etiqueta es: <p>John & Sarah went to see “Scream 4”.</p> <p>John & Sarah went to see “Scream 4”.</p>

Estoy usando un XmlTextWriter para crear el documento xml a partir de los registros de la base de datos similares a este código de ejemplo http://www.dotnettutorials.com/tutorials/advanced/rss-feed-asp-net-csharp.aspx

Así que necesito reemplazar todas las entidades de caracteres dentro de la cadena html de la base de datos con su equivilante Unicode porque el lector de RSS basado en flash no reconoce ninguna entidad más allá de las más comunes como & .

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

Si necesita convertirlo a representaciones numéricas, podría analizar cada entidad, HtmlDecode it y luego convertirla en un int para obtener el valor unicode de base 10. Luego vuelva a insertarlo en la cadena.

EDITAR: Aquí hay un código para demostrar a qué me refiero (no está probado, pero transmite la idea):

 string input = "Something with — 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 en algún lugar, pero debe estar cerca.

¿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?

edición actualizada


  string test = "

John & Sarah went to see “Scream 4”.

"; 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();

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

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

esto podría ayudarte a poner la ruta de entrada en el cuadro 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); } }