Bootstrap
本文主要介绍.NET Core中使用Dapper操作Sybase数据库中文乱码问题。服务器端用的是cp850字符集编码。下面分享一下解决方案。

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