为什么我的中文字符在c#字符串中无法正确显示

时间:2009-05-29 00:25:31

标签: c# asp.net sql-server

我将中文和英文文本存储在SQL Server 2005数据库中并将其显示在网页上,但中文显示不正确。 我一直在阅读有关该主题的内容,并做了以下工作:

  • 在我的INSERT语句
  • 中的文本之前使用了N.
  • 将字段类型设置为nvarchar
  • 将页面的charset设置为UTF-8

当我将页面直接插入页面时,正确显示在页面中的中文字符,即不从数据库中获取它们

这些是应该显示的字符:全澳甲流确诊病例已破100

这是从数据库中检索文本时显示的内容:å...æ澳瓲æμ确诊ç-...ä¾<å·²ç'1001

这似乎与c#中字符串的处理方式有关,因为中文可以在经典的asp中正确检索和显示

我还需要做些什么才能将数据从数据库中删除到字符串中并在aspx页面上正确输出?

5 个答案:

答案 0 :(得分:6)

到目前为止,信息是:

  1. 您正在使用直接SQL INSERT脚本插入数据库。
  2. 数据显示在数据库中。
  3. 问题可能出在两个地方:

    1. 在INSERT语句中,您是否在插入值前加上N?

      INSERT INTO #tmp VALUES(N'全澳甲流确诊病例已破100')

    2. 如果前缀值为N,String对象是否包含正确的数据?

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

    3. 这里我假设是一个String对象。

      这个String对象是否包含正确的中文字符?

      尝试打印出其值并查看。

      <强>更新

      我们假设INSERT查询的构造如下:

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

      我认为包含中文字符。

      您是否直接将中文字符赋值?像

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

      上述代码应有效。但是,如果您进行了任何中间处理,则会导致问题。

      之前我做了一个本地化的TC项目;以前的架构师已经完成了ASP中必需的几个编码转换;但它们会在.NET中产生问题:

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

      上述转换不是必需的。在.NET中,只需直接赋值即可:

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

      这是因为String常量和String对象本身是Unicode兼容的。

      框架库,例如File IO,当读取未以Unicode编码的文件时,它们会将外部编码转换为Unicode;换句话说,框架将为您完成这项肮脏的工作。您大多数时间不需要执行手动编码转换。

      更新:了解ASP用于将数据插入SQL服务器。

      我已经编写了一小段ASP来将一些中文字符插入到SQL数据库中并且可以正常工作。

      我有一个名为“trans”的数据库,我在里面创建了一个表“temp”。 ASP页面采用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>
      

      该表在我的数据库中定义如下:

       create table temp (data NVARCHAR(100))
      

      多次提交ASP页面,我的表格包含正确的中文数据:

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

      希望这可以提供帮助。

答案 1 :(得分:1)

角色如何进入数据库?你是通过存储过程输入它们吗?确保存储过程中的参数也是nvarchar和您正在调用proc的命令对象上的参数。

更新:该线程的共识是数据库没有正确编码的NVARCHAR内容。这是我最新的理论:数据库具有UTF8字节。从ASP输出时,这些字节保持不变。 ASP.NET获取UTF8字节并将其解释为单字节字符。

尝试从数据库中获取字节,并将其解码为UTF8,例如:

SqlCommand command = new SqlCommand("SELECT zhtext FROM TestTable", connection);
byte[] byteArray = (byte[])command.ExecuteScalar();
lblText.Text = Encoding.UTF8.GetString(byteArray);

答案 2 :(得分:0)

这绝对是从数据库到c#字符串的往返过程中某些点的字符串编码问题,但是从它的声音中你正确地做了一切。

对于我们的数据库,我们将Unicode数据存储在NVARCHAR()列中,然后将它们读出为普通的C#字符串;不需要文本编码更改。你使用什么样的数据对象(即DataSet,只是一个DataReader,LINQtoSQL)?

在我们的应用程序中,我们使用FetchDataSet读取存储过程的结果,然后执行DataBinder.Eval()以指定最终是标签文本的字符串。

答案 3 :(得分:0)

您是否在Windows中安装了“支持东方语言”?是XP吗? 如果是这种情况,您的数据可能会很好,只是SQL管理工作室没有正确显示它。 (即使没有“支持中文”,所有真实类型字体都显示OK,但系统字体不支持)

答案 4 :(得分:0)

我的摘要如下:

  • 在ASP中正确显示的字符
  • 在SSMS中显示乱码的字符
  • 在ASP.Net中显示乱码的字符

结论:数据库中的数据编码不正确,您需要将数据迁移到unicode以在C#中处理它们,就像Ryan描绘的那样。