2009-09-04 39 views
6

Tengo un problema con la codificación. Quiero poner datos de un archivo codificado en UTF-8 en una base de datos de SQL Server 2008. SQL Server solo presenta codificación UCS-2, por lo que decidí convertir explícitamente los datos recuperados.Insertar datos UTF8 en un servidor SQL 2008

// connect to page file 
_fsPage = new FileStream(mySettings.filePage, FileMode.Open, FileAccess.Read); 
_streamPage = new StreamReader(_fsPage, System.Text.Encoding.UTF8); 

Aquí está la rutina de conversión de los datos:

private string ConvertTitle(string title) 
{ 
    string utf8_String = Regex.Replace(Regex.Replace(title, @"\\.", _myEvaluator), @"(?<=[^\\])_", " "); 
    byte[] utf8_bytes = System.Text.Encoding.UTF8.GetBytes(utf8_String); 
    byte[] ucs2_bytes = System.Text.Encoding.Convert(System.Text.Encoding.UTF8, System.Text.Encoding.Unicode, utf8_bytes); 
    string ucs2_String = System.Text.Encoding.Unicode.GetString(ucs2_bytes); 

    return ucs2_String; 
} 

Al recorrer el código de títulos críticos, reloj variable muestra los caracteres correctos para ambas cadena UTF-8 y UCS-2. Pero en la base de datos está parcialmente equivocado. Algunos caracteres especiales se guardan correctamente, otros no.

  • incorrecto: n se convierte en un n
  • Derecha: E o E son, por ejemplo, ha introducido correctamente.

¿Alguna idea de dónde podría estar el problema y cómo solucionarlo?

thans de antelación, Frank

Respuesta

6

yo creo que hay una mala interpretación de lo que son las codificaciones. Una codificación se usa para convertir un grupo de bytes en una cadena de caracteres. Una cadena no tiene una codificación asociada a ella.

Internamente, las cadenas se almacenan en la memoria como bytes UTF-16LE (razón por la cual Windows persiste en confundir a todos llamando a la codificación UTF-16LE simplemente "Unicode"). Pero no es necesario que lo sepas, para ti, son solo cadenas de caracteres.

¿Qué hace su función es:

  1. toma una cadena y la convierte a UTF-8 bytes.
  2. Toma esos bytes UTF-8 y los convierte en bytes UTF-16LE. (Podría haber codificado directamente en UTF-16LE en lugar de UTF-8 en el paso uno).
  3. Toma esos bytes UTF-16LE y los convierte de nuevo en una cadena. ¡Esto le da exactamente la misma Cadena que tenía en primer lugar!

Esta función es redundante; en realidad puede pasar un String a SQL Server normal desde .NET y no preocuparse por ello.

El bit con las barras diagonales hace algo, presumiblemente específico de la aplicación. No entiendo para qué sirve. Pero nada en esa función hará que Windows aplaste caracteres como ñ a n.

Lo que hará/causará ese tipo de aplanamiento es cuando intenta colocar caracteres que no están en la propia codificación de la base de datos en la base de datos. Es de suponer que é está bien porque ese carácter está en su codificación predeterminada de cp1252 Europeo occidental, pero ñ no es así que se destroza.

SQL Server utiliza 'UCS2' (realmente UTF-16LE otra vez) para almacenar cadenas Unicode, pero se lo dices, normalmente usando un tipo de columna CARACTER NACIONAL (NCHAR/NVARCHAR) en lugar de CHAR simple.

+0

Yap, este material de codificación/Unicode/UTF todavía me da dolores de cabeza. De todos modos, golpeas el clavo en la cabeza. Después de cambiar mi columna de varchar a nvarchar, el carácter se almacena correctamente. ¡Muchas gracias! – Aaginor

11

servidor SQL 2008 se encarga de la conversión de UTF-8 en UCS-2 para usted.

Primero asegúrese de que sus tablas SQL utilicen tipos de datos nchar, nvarchar para las columnas. Entonces necesita decirle a SQL Server que envíe datos Unicode agregando una N al frente de la cadena codificada.

INSERT INTO tblTest (test) VALUES (N'EncodedString') 

de Microsoft http://support.microsoft.com/kb/239530

Ver mi pregunta y la solución aquí: How do I convert UTF-8 data from Classic asp Form post to UCS-2 for inserting into SQL Server 2008 r2?

+0

muchas gracias. Hiciste mi momento;) –

0

Para los futuros lectores que utilizan versiones más recientes, tenga en cuenta que SQL Server 2016 es compatible con UTF-8 en su utilidad bcp.

Cuestiones relacionadas