加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用Oracle,PHP和Oci8处理eacute和其他特殊字符

发布时间:2020-12-12 16:24:50 所属栏目:百科 来源:网络整理
导读:嗨,我正在尝试将名称存储到Oracle数据库中,并使用 PHP和oci8将其获取回来. 但是,如果我将é直接插入Oracle数据库并使用oci8将其取回,我只会收到一封电子邮件 在插入数据库之前,我是否必须将所有特殊字符(包括é)编码为html实体(即: eacute;)或者我错过了什
嗨,我正在尝试将名称存储到Oracle数据库中,并使用 PHP和oci8将其获取回来.

但是,如果我将é直接插入Oracle数据库并使用oci8将其取回,我只会收到一封电子邮件

在插入数据库之前,我是否必须将所有特殊字符(包括é)编码为html实体(即:& eacute;)或者我错过了什么?

谢谢

更新: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;
}

似乎工作,虽然不确定它是否是最佳解决方案

更新:3月8日15:45

Oracle的字符集是ISO-8859-1.
在PHP中我添加了:

putenv("NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1");

强制oci8连接使用该字符集.
从PHP中使用oci8检索é现在工作了! (对于varchars,但不是CLOB必须执行utf8_encode来提取它)
那么我尝试将数据从PHP保存到Oracle ……并且它无法工作……从PHP到Oracle的过程中,é成为了一个?

更新时间:3月9日14:47

所以越来越近了.
添加NLS_LANG变量后,使用é工作直接执行oci8插入.

问题实际上是在PHP方面.
通过使用ExtJs框架,在提交表单时,它使用encodeURIComponent对其进行编码.
因此é以é发送,然后重新编码为é.
但它的长度现在是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);

运行一次并直接登录到Oracle数据库后,我看到STRING_FIELD设置为|?|.显然不是我以前的经历所期望的.
但是,如果我快速刷新那个PHP页面……它有效!!!
在Oracle中我正确地看到了|é|.

看起来环境变量可能未在第一次执行脚本时正确设置或发送,但可用于第二次执行.

我的下一个实验是将变量导出到PHP的环境中,但是,我需要为此重置Apache …所以我们将看到会发生什么,希望它能正常工作.

我猜你知道这些事实:

>有许多不同的字符集:你必须选择一个,当然,你知道你正在使用哪一个.
> Oracle完全能够存储没有HTML实体的文本(& eacute;). HTML实体用于HTML. Oracle不是Web浏览器;-)

您还必须知道HTML实体未绑定到特定的字符集;相反,它们习惯于在独立于字符集的环境中表示字符.

你模糊地谈论ISO-8859-1和UTF-8.你想用什么字符集? ISO-8859-1易于使用,但它只能以一些拉丁语言(例如西班牙语)存储文本,并且它缺少像

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读