在数据库中使用ANSI字符编码
FROM URL: http://www.cnblogs.com/samuel/archive/2004/03/25/4182.html下载演示项目 - 45 Kb (VS7.1, ASP.NET, C#) Introduction
Title: 在 ASP.NET 中使用字符编码
Author: Samuel Email: samuel_xp#msn.com
Environment: .Net Framework 1.1, Win2k+ Keywords: ASP.NET, Encoding Level: Intermediate Description: 提交你的数据到不支持当前语言的后台系统 / 数据库
Section: ASP.NET SubSection: General
这篇文章介绍了如何 提交你的数据到不支持当前语言的后台系统 / 数据库。
当进行 web application 开发时,经常会用到各种操作系统和数据库,其中不乏像 SCO5 之类不支持 utf 和 gb2312 这类双字或者多字节的操作系统或者数据库。因此,如何将你的文本数据完好的存入或者取出就成了一个重要的问题。
在我的一个项目中,需要将亚洲文字页面的内容保存到 SCO5.05 + Informix7.3 的后台数据库。如果直接使用 sql 语句保存,发现数据库相应的数据并不是传入的字符,而是变成了 “ à ” ,编码是 0x7F 的字符,所有的字符都是一样。这是什么原因呢?
这就是文字编码的问题。
打开项目的 web.config 文件,查看 globalization 项的属性 requestEncoding 是 utf-8 ,说明提交的数据是按照 utf8 编码的。由于 SCO5.05 不支持 utf-8 ,因此直接将数据传入会导致数据错误(实际情况是变成 0x7F ),因此需要将数据先转换为 SCO 所能识别的西文 ISO8859-1 编码,然后再传递,而取出后再反向编码,这样就解决了我的问题。
例如要将 ” 你好 Pi(\u03a0)” 保存到数据库的 memo 字段中:
string unicodeStr = "你好Pi(\u03a0)";
OdbcConnection conn = new OdbcConnection();
System.Data.IDbCommand cmd = conn.CreateCommand();
conn.ConnectionString = "your connection string";
cmd.Connection = conn;
// Encoding here
cmd.CommandText = "INSERT INTO encoding VALUES ('"
+ CEncoding.unicode_iso8859(unicodeStr) + "')";
cmd.Connection = conn;
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
上面我用到了 unicode_iso8859() 这样的一个函数,该函数的作用是将 utf-8 编码的字符转换到 iso8859-1 编码,代码如下:
public class CEncoding
{
public static string unicode_iso8859( string src) {
Encoding iso = Encoding.GetEncoding("iso8859-1");
Encoding unicode = Encoding.UTF8;
byte [] unicodeBytes = unicode.GetBytes(src);
return iso.GetString(unicodeBytes);
}
public static string iso8859_unicode( string src) {
Encoding iso = Encoding.GetEncoding("iso8859-1");
Encoding unicode = Encoding.UTF8;
byte [] isoBytes = iso.GetBytes(src);
return unicode .GetString(isoBytes);
}
}
打开数据库看看,是不是都变成了你不认识的西文符号?取出后,只需要使用 iso8859_unicode() 这一逆向函数进行反向编码即可,当然你也可以使用任何编码 ( 比如 gb2312) 进行逆向编码以适应你的需要。
即使你使用的是 adapter 和 dataset 来填充 datagrid ,也可以很容易的使用这两个函数来进行转换,所需的代价是大约 2~3 倍的时间,自己斟酌了 J 。代码如下:
OdbcAdapter adapter = new OdbcAdapter();
DataSet1 ds = new DataSet1();
DataGrid grid = new DataGrid();
OdbcConnection conn = new OdbcConnection();
// adapter, dataset and datagrid were initialized
conn.ConnectionString = "your connection string";
adapter.Connection = conn;
conn.Open();
adapter.Fill(ds);
string xml = ds.GetXml();
ds.Clear();
// encoding here
ds.ReadXml( new System.IO.StringReader(CEncoding.iso8859_unicode(xml)));
grid.DataBind();