php - UTF-8 特殊字符作为奇怪字符插入表中

标签 php mysql xml

我在这个网站上搜索了很多答案,但没有一个对我有用。我正在尝试使用 PHP simplexml_load_string 解析以下 XML。

我的 XML 是:

<?xml version="1.0" encoding="utf-8"?>
<address>
<name>Peter</name>
<country>Großbritannien</country>
</address>

当我使用 print_r 打印它时,结果显示如下:

SimpleXMLElement Object
(
    [name] => Peter
    [country] => Großbritannien
 )

当我使用 ini_set('default_charset', 'UTF-8') 或 header('Content-Type: text/html; charset=utf-8') 时,结果是:

SimpleXMLElement Object
(
    [name] => Peter
    [country] => Großbritannien
)

但是当我尝试使用 PHP( header 设置为 utf8)在数据库(MySQL)中插入国家/地区值时,它会插入为 Groàbritannien。我的表字符集是 UTF8,列的排序规则是 utf8_unicode_ci。但是,当我直接将国家/地区值插入表中(使用 phpMyAdmin 或终端)时,它会正确插入。

我想知道为什么国家/地区值没有从我的 PHP 解析页面正确插入。

我的 PHP 示例代码如下:

$notificationXml  = simplexml_load_string($xml); 
$con = $notificationXml->country;
mysql_query("INSERT INTO test_1 (con) values ('$con')");

请帮帮我。提前感谢大家。

最佳答案

a) 提供 mysql_* 函数的扩展被标记为已弃用。最好从 pdo_mysql or mysqli 开始
b) 你必须照顾connection charset ,即 MySQL 服务器希望客户端在发送/接收数据时使用的字符集。避免使用诸如 SET NAMES ... 之类的东西,因为它会让客户端 mysql 库对新的字符集/编码规则一无所知,因此某些字符处理可能无法按预期工作,甚至可能导致安全相关问题。请改用专用的客户端机制来更改字符集。对于 mysql_* 来说是 mysql_set_charset() ., 对于 mysqli_* mysqli::set_charset()对于 PDO,您应该将该信息放入 DSN 中,例如

$pdo = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8')

(并使用 php 版本 >= 5.3.6)

关于php - UTF-8 特殊字符作为奇怪字符插入表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17341293/

相关文章:

mysql - Laravel GroupBy 和 Count 使用 Eloquent 模型

xml - 具有多个谓词的 Xpath 表达式

Python:在理解中重复函数调用的更好解决方案

PHP 过滤器 vs PHP htmlspecialchars vs sqli 准备

Python MySQLdb 转换列表数据以从 SELECT 输出 CSV

javascript - 我想向 myTable 添加过滤、分页

mysql - 子查询将 NULL 值驱动到外部查询

xml - 如何在没有单独结构的情况下获取 xml 名称标签变体

php - 在新服务器上部署 Symfony3 时遇到问题

php - magento 如何获取搜索查询