Maison > développement back-end > tutoriel php > thinkphp3.1.3连接oracle返回json的奇怪编码问题

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

WBOY
Libérer: 2016-06-23 13:33:07
original
924 Les gens l'ont consulté

环境: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方式的可以参考下

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal