2012-03-19 14 views
10

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.

  1. ¿Esa es realmente la razón?

  2. ¿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!

+0

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

Respuesta

18

Puede intentar codificar primero el texto en UTF8 (en el evento enlazado a la fila o algo similar). El siguiente código codificará texto en UTF8 y eliminará caracteres no codificables.

private static readonly Encoding Utf8Encoder = Encoding.GetEncoding(
    "UTF-8", 
    new EncoderReplacementFallback(string.Empty), 
    new DecoderExceptionFallback() 
); 

var utf8Text = Utf8Encoder.GetString(Utf8Encoder.GetBytes(text)); 
0

El carácter U+1F60A es un carácter emoji introducido en Unicode 6.0. Su representación UTF-16 (SQL Server (no mencionó la base de datos que está utilizando) utiliza el UCS-2 similar) es 0xD83D 0xDE0A utilizando caracteres sustitutos.

Desde Unicode 6.0 fue lanzado en Oct 2010, mi suposición es que SQL Server, o (ASP) .Net 4, o la conversión entre los datos de SQL Server y.Los datos netos no son compatibles con los puntos del código emoji.

0

que acaba de descubrir que Application Request Routing si se instala en IIS 7.5 obligará %2f para ser manipulados de manera diferente, lo que causa problemas.

Al eliminar ARR resolvió este problema para nosotros.

Cuestiones relacionadas