php连接Oracle的时候遇到的编码集问题

时间:2022-10-25 22:09:18

    利用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

输出的字符集。

如果你在 out_charset 后添加了字符串 //TRANSLIT,将启用转写(transliteration)功能。这个意思是,当一个字符不能被目标字符集所表示时,它可以通过一个或多个形似的字符来近似表达。 如果你添加了字符串 //IGNORE,不能以目标字符集表达的字符将被默默丢弃。 否则,会导致一个 E_NOTICE并返回 FALSE

Caution

//TRANSLIT 运行细节高度依赖于系统的 iconv() 实现(参见 ICONV_IMPL)。 据悉,某些系统上的实现会直接忽略//TRANSLIT,所以转换也有可能失败,out_charset 会是不合格的。

str

要转换的字符串。

最后就用这个函数,iconv('','UTF-8',$fetch_row)的方法完美解决啦~