En un sitio web ASP.NET 4 y obtengo el siguiente error al intentar cargar datos de la base de datos en un GridView.ASP.NET - No se puede traducir el carácter Unicode XXX en el índice YYY a la página de códigos especificada
No se puede traducir el carácter Unicode \ uD83D en el índice 49 a la página de códigos especificada.
he descubierto que esto ocurre cuando una fila de datos contiene: Texto Texto Texto
Según tengo entendido este texto no se puede traducir en una respuesta válida UTF-8.
¿Esa es realmente la razón?
¿Hay alguna manera de limpiar el texto antes de cargarlo en la vista de cuadrícula para evitar tales errores?
ACTUALIZACIÓN:
tengo algunos progresos he descubierto que sólo recibe este error cuando estoy usando el método subcadena en una cadena. (estoy usando una subcadena para mostrar parte del texto como una vista previa para el usuario).
Por ejemplo en un formulario Web ASP.NET hago esto:
String txt = test ;
//txt string can also be created by
String txt = char.ConvertFromUtf32(116) + char.ConvertFromUtf32(101) +char.ConvertFromUtf32(115) + char.ConvertFromUtf32(116) + char.ConvertFromUtf32(32) + char.ConvertFromUtf32(128148);
// this works ok txt is shown in the webform label.
Label1.Text = txt;
//length is equal to 7.
Label2.Text = txt.Length.ToString();
//causes exception - Unable to translate Unicode character \uD83D at index 5 to specified code page.
Label3.Text = txt.Substring(0, 6);
sé que la cadena NET se basa en UTF-16 que soporta pares suplentes.
Cuando utilizo la función SubString, rompo accidentalmente el par suplente y causa la excepción. descubrí que puedo usar clase StringInfo:
var si = new System.Globalization.StringInfo(txt);
var l = si.LengthInTextElements; // length is equal to 6.
Label3.Text = si.SubstringByTextElements(0, 5); //no exception!
Otra alternativa es simplemente eliminar los pares suplentes:
Label3.Text = ValidateUtf8(txt).Substring(0, 3); //no exception!
public static string ValidateUtf8(string txt)
{
StringBuilder sbOutput = new StringBuilder();
char ch;
for (int i = 0; i < body.Length; i++)
{
ch = body[i];
if ((ch >= 0x0020 && ch <= 0xD7FF) ||
(ch >= 0xE000 && ch <= 0xFFFD) ||
ch == 0x0009 ||
ch == 0x000A ||
ch == 0x000D)
{
sbOutput.Append(ch);
}
}
return sbOutput.ToString();
}
Es esto realmente un problema de los pares suplentes?
¿Qué caracteres usan pares de sustitutos? hay una lista?
¿Debo mantener el soporte para parejas sustitutas? ¿Debo ir con el uso de StringInfo Class o simplemente eliminar los caracteres no válidos?
Gracias!
RuSh: Preguntándose qué usó para resolver el problema. El método de su solución funciona perfectamente para mi caso, mientras que la solución de LaserJesus no parece limpiar los caracteres Uniciode ofensivos. – Crulex