1、先查看一下服务器上安装的字符集
isql -Usa -P
>use master
>go
>select id,name from syscharsets
>go
id name
--- ----------------
0 ascii_8
1 iso_1
2 cp850
2、尝试检测字符编码
下面代码是从数据库中查出乱码的字符串,尝试用所有支持的编码解析,在转换成中文,如果能正常显示,说明就是这个编码。
class Program
{
static void Main(string[] args)
{
var result = DapperUtils.GetModelListSybase<Summary>(DapperUtils.SybaseConn,
"select DEPT_NAME valName,sum(C.XSJE) val from XSJL L,XSJLC C,BM M WHERE L.SKTNO=C.SKTNO AND L.JLBH=C.JLBH AND L.JZRQ>convert(datetime, substring(convert(char,dateadd(dd,-4,getdate()),102), 1, 10)) AND substRing(C.DEPTID,1,4)=M.DEPTID GROUP BY DEPT_NAME"
);
//处理 乱码
string cTxt = result[0].valName;
//找出 乱码对应的编码格式
StringBuilder sb = new StringBuilder();
foreach (EncodingInfo ei in Encoding.GetEncodings())
{
Byte[] mybyte = System.Text.Encoding.GetEncoding(ei.CodePage).GetBytes(cTxt.ToCharArray());
sb.Append(ei.Name + "(" + ei.CodePage + "):" + System.Text.Encoding.GetEncoding("gb2312").GetString(mybyte, 0, mybyte.Length) + "\r\n");
}
Console.WriteLine(sb.ToString());
}
}
注意:如果上面代码执行,尝试所有编码,控制台上没有能正常显示的,可能是引用的Sybase的库有问题,在找找其它的试试。
3、解决中文乱码问题
.NET对cp850编码中文支持不是很好,我的解决方案是自己将cp850字符串转中文编码,具体如下,
1)连接字符串
Data Source=192.168.0.215; Port=8000; Database=mydb; Uid=sa; Pwd=vabcd;Charset=cp850;
2)转换代码
public static string CP850ToGB2312(string str)
{
try
{
Encoding cp850 = Encoding.GetEncoding(850);
Encoding gb2312 = Encoding.GetEncoding("gb2312");//Encoding.Default ,936
byte[] temp = cp850.GetBytes(str);
return Encoding.GetEncoding("gb2312").GetString(temp, 0, temp.Length);
}
catch (Exception ex)//(UnsupportedEncodingException ex)
{
Console.Write(ex.Message);
return null;
}
}