zoukankan      html  css  js  c++  java
  • informix 通过ADO或ODBC连接提取数据时出现中文乱码的解决方法

    最近在做一个项目,是对INFORMIX数据库的数据进行大数据分析,INFORMIX数据库数据有上亿条,没有linux的Root权限和informix数据的生产权限,只能读取。客户要求结果显示在内网windows WEB服务器上,终端通过浏览器来阅读。

    我采用python+django+pandas+matplotlib。

    首先要做的是:连接数据库并获取数据,其次要创建内网WEB服务,然后实现实时数据分析。

    在做第一步时,就遇到INFORMIX的数据汉字编码问题。

    现数据采用8859-1字符集,819编码。通过取数据分析,所有汉字为GBK编码的十六进制字符输出。

    原生输出肯定为乱码,解决方案:网上能查到的唯一能解决的就是采用JDBC加连接输出控制实现。

    我们既然知道出现乱码原因,就可以编程来实现。以下是我在HTML中和Django模板中解决乱码的方法。

    一、ASP

    <%
    var _chrs = new Array();
    var _db = new ActiveXObject("ADODB.Connection");
    _db.Open("provider = microsoft.jet.oledb.4.0;data source=" + Server.MapPath("data\gbkdb.mdb"));
    var _rs = new ActiveXObject("ADODB.Recordset");
    var _sql="Select * From gbk "
    _rs.open(_sql, _db);
    var _tempi;
    var _tempchr;
    while(! (_rs.eof )) {
    _tempchr=_rs('GBK').value;
    _tempi=parseInt(_tempchr, 16);
    _chrs[_tempi]=_rs('CHRS').value;
    _rs.movenext;
    }
    _rs.close();
    _db.close();

    function gbk2chr(_str){
    var _temp="??";
    var _xiabiao=parseInt(_str, 16);
    if (!((_chrs[_xiabiao]=="undefined")||(_chrs[_xiabiao]==null)))
    {_temp=_chrs[_xiabiao]}
    return _temp;
    }

    function tounicode(str){
    var tounicode1="";
    var len=str.length;
    var code1=0;
    var code2=0;
    var code161="";
    var code162="";
    var _str1="";
    var _temp="";
    for(var i=0;i<len;i++){
    code1 = str.charCodeAt(i);
    code161 = code1.toString(16);
    if (code1>159) {
    code2 = str.charCodeAt(i+1);
    code162 = code2.toString(16);
    _str1=code161+code162;
    tounicode1=tounicode1+gbk2chr(_str1);
    i++
    }
    else {
    tounicode1=tounicode1+code161;
    }
    }
    return tounicode1;
    }

    %>

    数据库后台取数后调用 tounicode()转换一下,即可在HTML页面正确显示汉字。

    二、Django(这个要简单些)

     def uni2gbk2(_str):

      if type(_str)!=str:
        return _str
      strl=len(_str)
      a=""
      i=0
      while i<strl:
        if ord(_str[i])>128:
        a1=hex(ord(_str[i]))
        a2=hex(ord(_str[i+1]))
        i=i+2
        ab=str(a1)[2:]+str(a2)[2:]
        abb=bytearray.fromhex(ab)
        a=a+abb.decode("gbk")
      else:
        a=a+_str[i]
        i=i+1
      return a

    取数后,调用uni2gbk2转换即可

  • 相关阅读:
    2019.9.18 csp-s模拟测试46 反思总结
    2019.9.17 csp-s模拟测试45 反思总结
    矩阵求导(包含极大似然估计)
    sir
    Square into Squares. Protect trees!(平方数分解平方和)
    最小二乘法
    2.5&2.6 numpy&pandas 笔记
    2.4 python学习笔记
    2.3 python学习笔记
    2.1&2.2python学习笔记
  • 原文地址:https://www.cnblogs.com/cjtds/p/9137901.html
Copyright © 2011-2022 走看看