oracle thinphp 中文乱码_thinkphp3.1.3连接oracle返回json的奇怪编码问题

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

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:php中文网

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值