php连接Oracle的时候遇到的编码集问题
利用ODBC_CONNECT 连接Oracle数据库,再用ODBC_EXEC执行sql,然后在用ODBC_FETCH_ARRAY获取每一个元素。
因为开始只是想用一个接口循环输出一个二级联动的select 元素,只能用json去传送。开始发现var_dump出来的都是正常的,
但是一json_encode就不行,而且页面会白板。开始逐一分析,在fetch每一项的时候都去做encode,发现汉字的内容都显示false。
然后自信去看库函数才发现,原来json_encode操所的字符集只能是UTF-8,再去查询Oracle数据库的编码集,居然是ZHS16HBK。
已经处理过由于模板和后台由于字符集不同导致的乱码问题。发现没有找到控制读取数据流时设置编码集的方法,就只能想法逐一处理。
好在利用ODBC处理结果集的时候本来就是逐一的。所以最后找到了iconv()方法:
iconv
(PHP 4 >= 4.0.5, PHP 5, PHP 7)
iconv — 字符串按要求的字符编码来转换
说明
$in_charset , string $out_charset , string $str )将字符串 str 从 in_charset 转换编码到 out_charset。
参数
in_charset-
输入的字符集。
out_charset-
输出的字符集。
如果你在
out_charset后添加了字符串 //TRANSLIT,将启用转写(transliteration)功能。这个意思是,当一个字符不能被目标字符集所表示时,它可以通过一个或多个形似的字符来近似表达。 如果你添加了字符串 //IGNORE,不能以目标字符集表达的字符将被默默丢弃。 否则,会导致一个E_NOTICE并返回FALSE。Caution//TRANSLIT 运行细节高度依赖于系统的 iconv() 实现(参见
ICONV_IMPL)。 据悉,某些系统上的实现会直接忽略//TRANSLIT,所以转换也有可能失败,out_charset会是不合格的。 str-
要转换的字符串。
最后就用这个函数,iconv('','UTF-8',$fetch_row)的方法完美解决啦~
posted on 2017-11-13 22:57 Simplife_xd 阅读(196) 评论(0) 收藏 举报
浙公网安备 33010602011771号