我将中文和英文文本存储在SQL Server 2005数据库中并将其显示在网页上,但中文显示不正确。 我一直在阅读有关该主题的内容,并做了以下工作:
当我将页面直接插入页面时,正确显示在页面中的中文字符,即不从数据库中获取它们
这些是应该显示的字符:全澳甲流确诊病例已破100
这是从数据库中检索文本时显示的内容:å...æ澳瓲æμ确诊ç-...ä¾<å·²ç'1001
这似乎与c#中字符串的处理方式有关,因为中文可以在经典的asp中正确检索和显示
我还需要做些什么才能将数据从数据库中删除到字符串中并在aspx页面上正确输出?
答案 0 :(得分:6)
到目前为止,信息是:
问题可能出在两个地方:
在INSERT语句中,您是否在插入值前加上N?
INSERT INTO #tmp VALUES(N'全澳甲流确诊病例已破100')
如果前缀值为N,String对象是否包含正确的数据?
String sql =“INSERT INTO #tmp VALUES(N'”+ value +“')”
这里我假设值是一个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)
我的摘要如下:
结论:数据库中的数据编码不正确,您需要将数据迁移到unicode以在C#中处理它们,就像Ryan描绘的那样。