dda*_*ala 5 php oracle oci8 utf-8 character-encoding
嗨,我正在尝试将名称存储到Oracle数据库中,并使用PHP和oci8将其获取回来.
但是,如果我é直接插入Oracle数据库并使用oci8来获取它我只是收到一个e
在插入数据库之前,我是否必须将所有特殊字符(包括é)编码为html实体(即:):é或者我错过了什么?
谢谢
更新:3月1日18:40
发现这个功能:http: //www.php.net/manual/en/function.utf8-decode.php#85034
function charset_decode_utf_8($string) {
if(@!ereg("[\200-\237]",$string) && @!ereg("[\241-\377]",$string)) {
return $string;
}
$string = preg_replace("/([\340-\357])([\200-\277])([\200-\277])/e","'&#'.((ord('\\1')-224)*4096 + (ord('\\2')-128)*64 + (ord('\\3')-128)).';'",$string);
$string = preg_replace("/([\300-\337])([\200-\277])/e","'&#'.((ord('\\1')-192)*64+(ord('\\2')-128)).';'",$string);
return $string;
}
Run Code Online (Sandbox Code Playgroud)
似乎工作,虽然不确定它是否是最佳解决方案
更新:3月8日15:45
Oracle的字符集是ISO-8859-1.
在PHP中我添加了:
putenv("NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1");
Run Code Online (Sandbox Code Playgroud)
强制oci8连接使用该字符集.é从PHP中检索使用oci8现在工作了!(因为varchars,但不是CLOBs必须utf8_encode提取它)
所以然后我尝试将数据从PHP保存到Oracle ...它不起作用..从PHP到Oracle的过程中的é某个地方变成了?
更新时间:3月9日14:47
所以越来越近了.添加NLS_LANG变量后,执行带有é工作的直接oci8插入.
问题实际上是在PHP方面.通过使用ExtJs框架,在提交表单时,使用它对其进行编码encodeURIComponent.
因此é被发送%C3%A9,然后重新编码成é.
但它的长度现在是2 (strlen($my_sent_value) = 2)而不是1.如果在PHP中我尝试:$ my_sent_value == é= FALSE
我想如果我能够将PHP中的所有这些字符重新编码为字节大小为1的长度,然后将它们插入到Oracle中,它应该可以工作.
但是仍然没有运气
更新时间:3月10日11:05
我一直在想我是如此接近(但距离很远).
putenv("NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P9"); 工作非常零星.
我创建了一个小的PHP脚本来测试:
header('Content-Type: text/plain; charset=ISO-8859-1');
putenv("NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P9");
$conn= oci_connect("user", "pass", "DB");
$stmt = oci_parse($conn, "UPDATE temp_tb SET string_field = '|é|'");
oci_execute($stmt, OCI_COMMIT_ON_SUCCESS);
Run Code Online (Sandbox Code Playgroud)
运行一次并直接登录到Oracle数据库后,我看到STRING_FIELD设置为|¿|.显然不是我以前的经历所期望的.
但是,如果我快速刷新那个PHP页面......它有效!!!
在Oracle中我正确地看到了|é|.
看起来环境变量可能未在第一次执行脚本时正确设置或发送,但可用于第二次执行.
我的下一个实验是将变量导出到PHP的环境中,但是,我需要为此重置Apache ...所以我们将看到会发生什么,希望它能正常工作.
这就是我最终为解决这个问题所做的事情:
修改运行 PHP 的守护进程的配置文件,使其具有:
NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
Run Code Online (Sandbox Code Playgroud)
这样oci8连接就使用ISO-8859-1。
然后在我的 PHP 配置中将默认内容类型设置为 ISO-8859-1:
default_charset = "iso-8859-1"
Run Code Online (Sandbox Code Playgroud)
当我通过 oci8 从 PHP 插入 Oracle 表时,我会执行以下操作:
utf8_decode($my_sent_value)
Run Code Online (Sandbox Code Playgroud)
当从 Oracle 接收数据时,打印变量应该像这样工作:
echo $my_received_value
Run Code Online (Sandbox Code Playgroud)
然而,当通过 ajax 发送数据时,我不得不使用:
utf8_encode($my_received_value)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9270 次 |
| 最近记录: |