如何在PHP表单和MySQL/MariaDB中插入UTF8字符

ktecyv1j  于 12个月前  发布在  PHP
关注(0)|答案(3)|浏览(90)

我想在一个列中替换UTF8字符与其他UTF8字符,使用PHP的形式和REGEXP_REPLACE在MySQL/MariaDB.

$search = mysqli_real_escape_string($id_mysql, $_POST['search']);
$new = mysqli_real_escape_string($id_mysql, $_POST['new']);
mysqli_query ($id_mysql,
    "UPDATE table_name
    SET column_name = REGEXP_REPLACE(column_name, '$search', '$new')
    WHERE column_name REGEXP '$search'"
    ) or die(mysqli_error($id_mysql));

编辑:
为了更好地理解这个问题,我剥离了mysqli_真实的_escape_string。
抱歉,\x{26 A1}在搜索中使用PHP REGEX,而不是MySQL REGEX。MySQL使用\u{26 A1}。
(忘记十六进制代码,这是一个例子。
有:

$search = "\u{264B}";
$new = "\u{264C}";

有时灵
但是:如果我在搜索中使用表单发送\u{264 B}或“\u{264 B}”,则不起作用。

$search = $_POST['search'];
$new = "\u{264C}";

看起来,使用表单和$_POST,\u{264 B}变成了一个字符串。
我知道双引号很重要。PHP需要双引号来理解它是一个Unicode字符。对于单引号,PHP认为它是一个字符串。我认为这是问题的关键。但是我不知道如何在$_POST中使用双引号。我尝试了不同的方法,但没有成功。
这是个简单的例子。我想使用更复杂的搜索和替换。
@stackoverflow你的相关问题与我的问题无关。

n3schb8v

n3schb8v1#

在PHP中将十六进制字符串转换为Unicode字符:

mb_convert_encoding('&#'.hexdec($_POST['new']), 'UTF-8', 'HTML-ENTITIES');

或者你可以使用PHP的Unicode字符转义(假设你试图插入高压字符:

$_POST['new'] = "\u{26A1}";
ghg1uchk

ghg1uchk2#

我们需要知道更多关于艾美洛的事。
假设HTML需要UTF-8:

  • 最终用户应将实际字符粘贴到<form> <input>中。
  • 不应该在PHP中进行转换
  • MySQL中的目标列应该声明为CHARACTER SET utf8mb4COLLATION并不重要(至少对于本讨论而言)。
  • 当字符被送入INSERT语句时,正确地转义或绑定字符。

例如,在执行SELECT HEX(col)...时,输入应显示E29AA1,以查看表中字符的十六进制。
如果你想对用户“友好”,你可以允许他们输入0xE29AA1U+26A1。前者是UTF-8(utf8 mb 4)十六进制,0x作为此类的常见指示符。后者是为同一个字符拼写Unicode“codepoint”的常用方法。Ox和U+需要你的PHP代码来发现它,把它转换成字符,等等。
在某些情况下,\u{26A1}将自动转换为单个字符。
HTML“entities”--&#x26A1;将在呈现页面时显示为字符。是的,您可以将这8个字符存储在数据库中,假设文本的唯一用途是通过HTML呈现它。
&#9889;&#x26A1;的十进制等价物--两者在HTML页面上同样有效。
参见https://unicode.scarfboy.com/?s=%E2%9A%A1
注意:%E2%9A%A1是字符的“URL编码”。

5n0oy7gb

5n0oy7gb3#

最好的方法和唯一的方法是直接在表单中复制/传递UTF8字符。
感谢Slaakso和Rick James。

相关问题