最近在作一個項目,是對INFORMIX數據庫的數據進行大數據分析,INFORMIX數據庫數據有上億條,沒有linux的Root權限和informix數據的生產權限,只能讀取。客戶要求結果顯示在內網windows WEB服務器上,終端經過瀏覽器來閱讀。python
我採用python+django+pandas+matplotlib。linux
首先要作的是:鏈接數據庫並獲取數據,其次要建立內網WEB服務,而後實現實時數據分析。sql
在作第一步時,就遇到INFORMIX的數據漢字編碼問題。數據庫
現數據採用8859-1字符集,819編碼。經過取數據分析,全部漢字爲GBK編碼的十六進制字符輸出。django
原生輸出確定爲亂碼,解決方案:網上能查到的惟一能解決的就是採用JDBC加鏈接輸出控制實現。編程
咱們既然知道出現亂碼緣由,就能夠編程來實現。如下是我在HTML中和Django模板中解決亂碼的方法。windows
1、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;
}ide
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頁面正確顯示漢字。
2、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轉換便可