利用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 — 字符串按要求的字符编码来转换
说明
string iconv ( string$in_charset
, string $out_charset
, string $str
)将字符串 str
从 in_charset
转换编码到 out_charset
。
参数
-
in_charset
-
输入的字符集。
-
out_charset
-
输出的字符集。
如果你在
Cautionout_charset
后添加了字符串 //TRANSLIT,将启用转写(transliteration)功能。这个意思是,当一个字符不能被目标字符集所表示时,它可以通过一个或多个形似的字符来近似表达。 如果你添加了字符串 //IGNORE,不能以目标字符集表达的字符将被默默丢弃。 否则,会导致一个E_NOTICE
并返回FALSE
。//TRANSLIT 运行细节高度依赖于系统的 iconv() 实现(参见
ICONV_IMPL
)。 据悉,某些系统上的实现会直接忽略//TRANSLIT,所以转换也有可能失败,out_charset
会是不合格的。 -
str
-
要转换的字符串。
最后就用这个函数,iconv('','UTF-8',$fetch_row)的方法完美解决啦~