PHP连接Oracle US7ASCII字符集时韩文显示乱码问题咨询
PHP连接Oracle时US7ASCII字符集导致韩文乱码的问题解决
问题原因
说白了,US7ASCII字符集根本不支持韩文!它是仅包含ASCII字符(0-127号编码)的单字节字符集,而韩文属于多字节的Unicode字符,完全不在它的覆盖范围内。当你用US7ASCII作为连接字符集时,Oracle会尝试把数据库中的韩文字符转换为US7ASCII编码——但转不了啊,所以只能用问号?替代那些无法识别的字符,最终返回的JSON里就全是乱码了。
解决方法
按照下面的步骤来,很快就能搞定:
第一步:确认Oracle数据库的字符集
先查一下你的Oracle数据库实际用的是什么字符集,推荐用支持全Unicode的AL32UTF8(现在大部分Oracle数据库默认都是这个)。执行这条SQL语句就能查到:SELECT value FROM nls_database_parameters WHERE parameter = 'NLS_CHARACTERSET';第二步:修改连接字符串的字符集
把连接时指定的字符集改成和数据库一致的,比如数据库用的是AL32UTF8,那连接代码就改成:$link = oci_connect("test", "test", "//localhost/xe",'AL32UTF8');AL32UTF8是Oracle对UTF-8的实现,完美支持韩文等所有Unicode字符,这样数据在传输过程中就不会被截断或替换了。第三步:确保PHP输出JSON的编码正确
输出JSON的时候,一定要设置正确的响应头,告诉客户端这是UTF-8编码的内容,避免客户端解析时再次乱码:header('Content-Type: application/json; charset=utf-8'); echo json_encode($your_data);额外提醒
如果你的数据库字符集不是AL32UTF8这类支持韩文的编码,那可能需要考虑迁移数据库字符集(这个操作要谨慎,最好先备份数据),不过现在新安装的Oracle基本都是默认支持Unicode的,所以大概率前面两步就够了。
内容的提问来源于stack exchange,提问作者Suraj Monde
相关产品推荐
相关产品推荐

