Estoy almacenar el Chino y el inglés texto en un SQL Server 2005 de la base de datos y mostrarlo en una página web, pero los Chinos no se muestra correctamente.
He estado leyendo sobre el tema y se han realizado las siguientes:

  • usado N antes de que el texto en mi instrucción INSERT
  • establecer el campo de tipo nvarchar
  • establecer el juego de caracteres de la página a UTF-8

Caracteres chinos se muestran en la página correctamente al insertar directamente en la página, es decir, no obtiene de la base de datos

Estos son los personajes que se debe mostrar:全澳甲流确诊病例已破100

Esto es lo que se muestra cuando el texto está extraído de la base de datos: å…æ¾3ç»2æµç¡®èŠç—…ä¾»å·2ç 1001

Esto parece ser algo que está relacionado con cómo se tratan las cadenas en c# porque los Chinos pueden obtener recuperan y se muestran correctamente en asp clásico

¿Hay algo más que necesita hacer para obtener los datos de la base de datos, en una cadena y salida correctamente en una página aspx?

  • creo que te refieres SQL Server 2005?
  • Hacer los caracteres chinos parecen bien cuando nos fijamos en los datos en SQL Management Studio?
  • Sí sql server. Pregunta actualizado. No, los personajes se muestran como se muestra en el segundo ejemplo, cuando buscando en ellos en el SQL Management Studio, estoy muy confundido porque asp clásico es el de tener ningún problema en la visualización de los caracteres correctos
  • ¿Cómo insertar los datos en la base de datos? Los VALORES de (N’全澳甲流确诊病例已破100′) o VALORES (‘全澳甲流确诊病例已破100’)?
  • Los VALORES de (N’全澳甲流确诊病例已破100′) se utiliza
  • Pls ver la Codificación.UTF8.GetString(byteArray) a continuación. En lugar de emitir el resultado de conjunto de datos a una cadena de fundición a un byte[] y tratar de conseguir una cadena de Codificación.UTF8.GetString(byteArray).

InformationsquelleAutor Sean | 2009-05-29

5 Comentarios

  1. 6

    Hasta el momento la información es:

    1. Está utilizando SQL directo script de INSERCIÓN para insertar en la base de datos.
    2. Los datos aparece roto en la base de datos.

    El problema podría estar en dos lugares:

    1. En su instrucción INSERT, hizo el prefijo de la inserción valor de N?

      INSERT INTO #tmp VALORES (N’全澳甲流确诊病例已破100′)

    2. Si el prefijo de el valor de N, que hace la Cadena objeto de mantener los datos correctos?

      String sql = «INSERT INTO #tmp VALORES de (N’ » + valor + «‘)»

    Aquí supongo valor es un objeto String.

    Hace esta Cadena objeto de mantener la correcta caracteres Chinos?

    Intente imprimir su valor y ver.

    Actualizado:

    Vamos a suponer que la consulta de INSERCIÓN se construye de la siguiente manera:

    String sql = "INSERT INTO #tmp VALUES (N' " + value + "')"

    Supongo valor tiene el carácter Chino.

    Hizo de asignar los caracteres Chinos en valor directamente? Como

    String value = "全澳甲流确诊病例已破100";

    El anterior código de trabajo. Sin embargo, si usted ha hecho alguna de procesamiento intermedio, va a causar problema.

    Hice una versión localizada del proyecto de CT antes; el arquitecto había hecho en varias codificación de las conversiones que sean necesarias en ASP; pero van a crear un problema .NET:

      String value = "全澳甲流确诊病例已破100";
      Encoding tc = Encoding.GetEncoding("BIG5");
      byte[] bytes = tc.GetBytes(value);
      value = Encoding.Unicode.GetString(bytes);

    La anterior conversiones son innecesarios. En .RED, simplemente directo a una asignación de trabajo:

      String value = "全澳甲流确诊病例已破100";

    Que es debido a que las constantes de Cadena y la Cadena de objeto en sí mismo son compatible con Unicode.

    El marco de la biblioteca, tales como e /s de Archivo, cuando la lectura de un archivo que no está codificado en Unicode, se va a convertir en el extranjero codificación de Unicode; en otras palabras, el marco va a hacer este trabajo sucio por usted. Usted no necesita realizar el manual de codificación de la conversión de la mayor parte del tiempo.

    Actualización: Entendido de que ASP se utiliza para insertar datos en un servidor SQL server.

    He escrito un pequeño trozo de ASP para insertar algunos de los caracteres Chinos en la base de datos SQL y funciona.

    Tengo una base de datos llamada «trans» y he creado una tabla de «temp» en el interior. La página ASP está codificado en UTF-8.

    <html>
    <head title="Untitled">
    <meta http-equiv="content-type" content="text/html";charset="utf-8">
    </head>
    <body>
    <script language="vbscript" runat="server">
    
    If Request.Form("Button1") = "Submit" Then
    
        SqlQuery = "INSERT INTO trans..temp VALUES (N'" + Request.Form("Text1") + "')"
    
        Set cn = Server.CreateObject("ADODB.Connection")
        cn.Provider = "sqloledb"
        cn.Properties("Data Source").Value = *********
        cn.Properties("Initial Catalog").Value = "TRANS"
        cn.Properties("User ID").Value = "sa"
        cn.Properties("Password").Value = **********
        cn.Properties("Persist Security Info").Value = False
    
        cn.Open
        cn.Execute(SqlQuery)
        cn.Close
    
        Set cn = Nothing
    
        Response.Write SqlQuery
    End If
    
    </script>
    <form name="form1" method="post" action="input.asp">
        <input name="Text1" type="text" />
        <input name="Button1" value="Submit" type="submit" />
    </form>        
    </body>
    </html>

    La tabla se define como belows en mi base de datos:

     create table temp (data NVARCHAR(100))

    Presentar la página ASP varias veces y mi tabla contiene Chino adecuado de los datos:

    select * from trans..temp
    
    data
    ----------------
    test
    测试
    全澳甲流确诊病例已破100

    Espero que esto pueda ayudar.

    • La inserción a la base de datos se realiza en asp no .Net. La recuperación se realiza en .Net. ¿Sabes de algo en especial que tiene que ser hecho en el asp?
    • Esta respuesta me salvó la vida 🙂 yo no sabía que el uso de N, como «los valores de (N’……’) «. Muchas gracias.
  2. 1

    Cómo son los personajes de entrar en la base de datos? Está usted entrando en ellos a través de un procedimiento almacenado? Asegúrese de que los parámetros en el procedimiento almacenado son también de tipo nvarchar Y en los parámetros en el comando del objeto que se está llamando el proc de.

    Actualización: el consenso en el hilo es que la base de datos no tiene correctamente codificado NVARCHAR contenido. Aquí está mi última teoría: la base de datos UTF8 bytes. Estos bytes permanecen intactas cuando se de la salida a partir de la ASP. ASP.NET toma la UTF8 bytes y lo interpreta como caracteres de un byte.

    Tratar de obtener los bytes de la base de datos, y decodificar como UTF8, por ejemplo:

    SqlCommand command = new SqlCommand("SELECT zhtext FROM TestTable", connection);
    byte[] byteArray = (byte[])command.ExecuteScalar();
    lblText.Text = Encoding.UTF8.GetString(byteArray);
    • Se insertan con una consulta INSERT no un procedimiento almacenado
    • Intente girar la INSERCIÓN en una parametrización de consulta: comando SqlCommand = conexión.CreateCommand(); comando.CommandText = «INSERT INTO Info (ZhText) VALUES (@ZhText)»; comando.Los parámetros.Add(new SqlParameter(«@ZhText», SqlDbType.NVarChar).Valor = idcliente;
    • No creo que este es el problema, porque los personajes se muestran en nuestro mayores asp software sin problema. El problema está relacionado de alguna manera a cómo yo soy el manejo de los datos recuperados .net
    • Si los caracteres aparecen rotos en su base de datos – entonces algo anda mal conseguirlas allí. Son los caracteres que se almacenan en el software más antiguo bien en SQL Management Studio? Vale la pena intentar el parámetro enfoque de arriba – al menos se puede excluir que el razonamiento si no funciona.
    • otro pensamiento: si los caracteres se introducen en la base de datos a través de otro medio (i.e a partir de la edad de software, en Management Studio) – hacer que la pantalla está bien?
    • Se insertan con el software antiguo, por lo que la pantalla como en el segundo ejemplo. La asp y .neto código de recuperar los datos, pero sólo el asp inserta he intentado insertar directamente en la base de datos utilizando SQL Management studio y los caracteres que se muestran son diferentes y no se mostrará correctamente en la asp. Voy a tratar de cambiar el tipo de consulta
    • Déjeme saber si estoy ladrando al árbol equivocado aquí.. estoy claro sobre lo que funciona / no funciona: el Texto es SIEMPRE entró en ASP? El texto puede ser MOSTRADO en ASP – pero no ASP.NET? El texto SIEMPRE se ve como basura en Management studio?
    • Sí, estás en lo correcto. El texto SIEMPRE es introducido en ASP. El texto puede ser MOSTRADO en ASP – pero no ASP.NET. El texto SIEMPRE se ve como basura en Management studio. Gracias por tu ayuda en esto
    • Bien.. entonces mi hipótesis acerca de los parámetros son probablemente equivocado. Si hago esto es management studio puedo ver los caracteres chinos de la multa: CREAR TABLA zhtesting(zhtext de tipo nvarchar(max)) INSERT INTO zhtesting (zhtext) los VALORES de (N’本港首次有’); SELECT * FROM zhtesting
    • Yo sólo corrí a sus consultas en management studio y los caracteres no se muestran en absoluto (sustituido con plazas). Impar. Podría ser esto una base de datos de configuración del sistema o de configuración en algún lugar?
    • Estoy bastante fresco de ideas.. Te defn no debería estar viendo basura en management studio. Las plazas sugieren que usted no tiene oriental idioma instalado. Si ese era el caso de no ver los caracteres chinos en mi comentario anterior. Puedes intentar esto: tratar de insertar el texto en su base de datos copiando/cambio de mi INSERTAR arriba. Ahora trate de ver que la fila en ASP & ASP.NET…
    • hola sean – he actualizado mi respuesta con otro teoría. no estoy seguro si stackoverflow le informa de este tipo de actualizaciones?

  3. 0

    Este es definitivamente un problema con la codificación de las cadenas en algún punto de su viaje de ida a partir de la base de datos a la c# cadena, pero a partir de los sonidos de lo que usted está haciendo todo correctamente.

    Para nuestra base de datos almacenamos los datos Unicode en NVARCHAR() columnas y, a continuación, leer a normal C# cadenas; sin codificación de texto los cambios eran necesarios. ¿Qué tipo de de objetos de datos que se está utilizando (i.e conjuntos de datos, sólo un DataReader, LINQtoSQL)?

    En nuestra aplicación podemos leer los resultados del procedimiento almacenado utilizando FetchDataSet y, a continuación, hacer un DataBinder.Eval() para asignar la cadena que es, finalmente, el texto de una etiqueta.

    • Estoy utilizando un conjunto de datos y el casting de la fila a una cadena
  4. 0

    Tienen instalado el «apoyo para el este de idiomas» en tu windows? es XP?
    si ese es el caso, sus datos podrían ser todos así, sólo el SQL management studio no se muestre correctamente. (todas las fuentes true type mostrar ACEPTAR incluso sin el «apoyo para el chino», pero fuentes del sistema no)

    • NOTA: «los caracteres Chinos se muestran en la página correctamente al insertar directamente en la página, es decir, no obtiene de la base de datos»
  5. 0

    El resumen me parece:

    • caracteres que se visualizan correctamente en ASP
    • caracteres que aparecen distorsionados en SSMS
    • caracteres que aparecen distorsionados en ASP.Net

    conclusión: los datos en la base de datos no está codificado correctamente, y es necesario migrar los datos unicode para tratar con ellos en C#, como Ryan esbozado.

Dejar respuesta

Please enter your comment!
Please enter your name here