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; } }