Heim  >  Artikel  >  Backend-Entwicklung  >  thinkphp3.1.3连接oracle返回json的奇怪编码问题

thinkphp3.1.3连接oracle返回json的奇怪编码问题

WBOY
WBOYOriginal
2016-06-23 13:33:07851Durchsuche

环境:thinkphp3.1.3+oracle10.2g,oracle的是ZHS16GBK编码,已经可以顺利连接查数据,现在碰到一个奇怪的编码问题,服务器是apache+php5.4.33,第一次启动apache后,简单的一个select查询,无论用ajaxreturn还是php自带的json_encode(),返回的json中中文是乱码,但是再次刷新后就出现正确的中文显示,以后就一直是正常的,如果时间稍长,估计与数据库连接断开后,再次查又是乱码,再刷新又正常了。。。每次重新启动apache,第一次查询都会出现这个现象,已经试了用iconv或者mb_convert_encoding改返回json的编码,但是每次第一次查询都会有这个现象,将查询缓存成文件看了下,第一次的错误中文缓存的文件中是有中文的,不过编码是GB2312,删掉缓存文件,刷新后重新生成缓存,缓存文件的编码就变成utf-8了。。。试了下,如果不用tp框架,直接php用oci连数据库查询后,无论是第一次还是多少次出来的都是正确的中文。这个奇怪问题让人百思不得其解,高人帮忙啊。。。


回复讨论(解决方案)

第一次的错误中文缓存的文件中是有中文的,不过编码是GB2312,删掉缓存文件,刷新后重新生成缓存,缓存文件的编码就变成utf-8了

刷新后的内容是否与之前一样,只是编码变了?

第一次的错误中文缓存的文件中是有中文的,不过编码是GB2312,删掉缓存文件,刷新后重新生成缓存,缓存文件的编码就变成utf-8了

刷新后的内容是否与之前一样,只是编码变了?

内容一样,就是编码不同,我保存了两个缓存文件,用notepad++打开,错误的那个右下角显示编码:GB2312,正确的那个编码就是utf8 no bom,环境我是用的phpstudylite搭的,用的apache+php5。4的fcgi方式。

1、thinkphp 使用 utf-8 字符集工作,并无 gbk 版本
2、json_encode 只支持 utf-8 中文
因此无论是传入还是传出都应是 utf-8 的,所以你连接 oracle 时声明 ZHS16GBK 是错误的。这是问题的根源

1、thinkphp 使用 utf-8 字符集工作,并无 gbk 版本
2、json_encode 只支持 utf-8 中文
因此无论是传入还是传出都应是 utf-8 的,所以你连接 oracle 时声明 ZHS16GBK 是错误的。这是问题的根源

我也怀疑是oracle的编码问题,但是oracle编码不能改,那是固定的,现在tp端全部默认,就是这种第一次查就会获取不到,必须再次查询一下编码才会变成正常的,如果在tp的action中做两次查询操作,输出json也是这样。。。真是奇了怪了

你在连接数据库时将 ZHS16GBK 改为 UTF-8 呢?试过没有

你在连接数据库时将 ZHS16GBK 改为 UTF-8 呢?试过没有

连接数据库就是用的utf8。在tp的config中配置数据库字符集就是utf8。。。如果设置成zhs16gbk,也是这个现象

因为只是第一次连接数据库的时候返回的数据编码不对,再次操作的时候就都没问题了,无疑与oracle的什么机制有关,也不想去深究了,解决问题为上,我直接在所有类都继承的初始化类:common.action.class中加了一句$pre->M();$pre_list =$pre->query('select sysdate from dual');等于所有的数据操作开始之前先连接库查询一下时间,也不用返回,就是这么执行一下就行,相当于初始化连接,这个如果是返回的中文的话应该是编码异常的,不过我也不需要它返回,仅仅是初始化一下,然后再做其他操作时编码正常就ok了。感谢两位版主的回复,结贴给分,谢谢。。。

终于摸索出来了。直接在apache的fcgi配置中配上php的环境:FcgidInitialEnv NLS_LANG AMERICAN_AMERICA.UTF8,因为是fcgi连接,所以许多php的environment中的数据都是没有的,必须在fcgi配置中自己添加,原来我是添加的和win中配置一样的zhs16gbk,但是上次看oracle会根据客户端字符集自动转码,刚才试了下,果然出来的数据由oracle自动返回了utf8编码,这样就不需要通过初始化连接来实现了。。。以后有连接oracle的同学,同时php配的是fcgi方式的可以参考下

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:PHP也20岁了Nächster Artikel:神秘的数组是怎么来的