gpt4 book ai didi

php - 使用 Oracle、PHP 和 Oci8 处理 eacute 和其他特殊字符

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:40:10 26 4
gpt4 key购买 nike

您好,我正在尝试将名称存储到 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;
}

似乎可行,但不确定它是否是最佳解决方案


更新: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 对其进行编码。
所以é作为%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);

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

似乎环境变量在第一次执行脚本时没有正确设置或发送,但在第二次执行时可用。

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

最佳答案

我想你知道这些事实:

  • 有许多不同的字符集:您必须选择一个,当然,知道您使用的是哪一个。
  • Oracle 完全能够存储没有 HTML 实体的文本 (é)。 HTML 实体用在 HTML 中。 Oracle 不是 Web 浏览器 ;-)

您还必须知道 HTML 实体不绑定(bind)到特定的字符集;相反,它们用于表示与字符集无关的上下文中的字符。

您模糊地谈论 ISO-8859-1 和 UTF-8。你想使用什么字符集? ISO-8859-1 易于使用,但它只能存储某些拉丁语言(例如西类牙语)的文本,并且缺少一些常见的字符,例如 € 符号。 UTF-8 使用起来比较棘手,但它可以存储 Unicode 联盟定义的所有字符(包括您需要的所有字符)。

做出决定后,您必须配置 Oracle 以在此类字符集中保存数据并选择合适的列类型。例如,VARCHAR2 适用于纯 ASCII,NVARCHAR2 适用于 UTF-8。

关于php - 使用 Oracle、PHP 和 Oci8 处理 eacute 和其他特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2357680/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com