在Apache + Python 架构的一个Webserver上有一些报表的内容,其中之一是从Access数据库中读取报警信息,并显示在网页上。当报警内容是英文时,一切正常。当报警信息是俄语或中文时,都显示????????。
经过分析,在Python中从数据库查询到数据时,其结果就已经是?????的,初步分析与Python脚本对结果的处理关系不大。应该是操作系统、Python、Apcahe、数据库之间的编码和解码问题。
当操作系统是英文并且Non-Unicode程序的语言也是英语时,,
分析从数据库中查询回来的结果,其长度是19字节,而且显示全是????,因为实际的中文描述是“打标器工作站热印上部/下部温度过低警报”如果按每个字符一个字节,正好是19个字节。
当操作系统是中文,并把Non-Unicode程序的语言也选成中文时,分析从数据库中返回的结果,其长度变成了37,正好是把中文算成了2个字节,中间的/算成1个字节。看上去更接近正常显示了:
'\xb4\xf2\xb1\xea\xc6\xf7\xb9\xa4\xd7\xf7\xd5\xbe\xc8\xc8\xd3\xa1\xc9\xcf\xb2\xbf/\xcf\xc2\xb2\xbf\xce\xc2\xb6\xc8\xb9\xfd\xb5\xcd\xbe\xaf\xb1\xa8'
当在中文操作系统下把以上内容赋值给一个变量并打印时,正好就是打标器工作站热印上部/下部温度过低警报”。看来的确是编码、解码问题。
经过在网上询问,果然有人建议把网页的字符集设成utf-8
提问网址
<meta charset="utf-8" />
但是我这里是Apache+Python的架构,怎么找到设字符集的地方呢?
去Apcahe的配置文件里一找,果然有一个:
AddDefaultCharset ISO-8859-1
ISO-8859-1编码是单字节编码,所以把中文字符都当成一个字节了。
于是把这个设置改成:
AddDefaultCharset utf-8
但是设定成utf-8并不能正常显示。
再试试gbk:
AddDefaultCharset gbk
一测之下,果然中文正常显示了, 更令人惊奇的是,连俄文也正常显示了!!!
这下等于一次解决了两个问题,简直太好了!!!!
在英文操作系统下,修改IE的internet选项》字体时,原来是拉丁语,改成简体中文确定后,并不能成功修改,而是又回到了拉丁语。后来在控制面板把Non-Unicode程序的语言改成简体中文,回到IE的internet选项一看,字体果然自动改成了简体中文。网页上的???也变成了和上面图中的乱码一样了。于是按以上操作,把英文系统的乱码问题也改正好了。