utf8_encode 或解码没有达到我的预期

问题描述 投票:0回答:3

我正在获取一个 XML 文件并将其读入各种字符串,然后写入数据库,但是我在处理德语字符时遇到困难。

XML 文件开始

<?xml version="1.0" encoding="UTF-8"?>

那么我遇到问题的一个例子就是这部分

<name><![CDATA[PONS Großwörterbuch Deutsch als Fremdsprache Android]]></name>

我的 PHP 有这个相关部分

$dom = new DOMDocument();
$domNode = $xmlReader->expand();
$element = $dom->appendChild($domNode);
$domString = utf8_encode($dom->saveXML($element));
$product = new SimpleXMLElement($domString);

//read in data
$arr = $product->attributes();
$link_ident = $arr["id"];
$link_id =  $platform . "" . $link_ident;
$link_name = $product->name;

因此 $link_name 变为 PONS Groöwörterbuch Deutsch als Fremdsprache Android

然后我做了一个

$link_name = utf8_decode($link_name);

当我在终端回显时效果很好

PONS GroÃwörterbuch Deutsch als Fremdsprache Android as is now 
PONS Großwörterbuch Deutsch als Fremdsprache Android after utf8decode 

但是,当它写入我的数据库时,它显示为:

PONS Kompaktwörterbuch 德语-英语 (Android)

MySQL 中 link_name 的排序规则是 utf8_general_ci

我应该如何做才能将其正确写入我的数据库?

这是我用来写入数据库的代码

$link_name = utf8_decode($link_name);
$link_id = mysql_real_escape_string($link_id);
$link_name = mysql_real_escape_string($link_name);
$description = mysql_real_escape_string($description);
$metadesc = mysql_real_escape_string($metadesc);
$link_created = mysql_real_escape_string($link_created);
$link_modified = mysql_real_escape_string($link_modified);
$website = mysql_real_escape_string($website);
$cost = mysql_real_escape_string($cost);
$image_name = mysql_real_escape_string($image_name);
$query = "REPLACE into jos_mt_links
(link_id, link_name, alias, link_desc, user_id, link_published,link_approved, metadesc, link_created, link_modified, website, price)
VALUES ('$link_id','$link_name','$link_name','$description','63','1','1','$metadesc','$link_created','$link_modified','$website','$cost')";
echo $link_name . " has been inserted ";

当我从 shell 运行它时,我看到了

PONS Kompaktwörterbuch Deutsch-Englisch (Android) has been inserted
php utf-8 utf8-decode
3个回答
1
投票

您从 XML 文件中获得了一个 UTF-8 字符串,并将其放入 UTF-8 数据库中。因此不需要进行编码或解码,只需将原始字符串推入数据库即可。确保您首先使用

mysql_set_charset('utf-8')
告诉数据库有 UTF-8 字符串即将到来。

utf8_decode
utf8_encode
的命名具有误导性。它们“仅”用于 UTF-8 和 ISO-8859-1 编码之间的转换。调用 utf8_decode(它会转换为 ISO-8859-1),自然会丢失任何不适合该编码的字符。一般情况下,您应该避免使用这些功能,除非有特定的地方需要使用 8859-1。

当您回显字符串时,不应考虑终端显示的内容是确定的。终端有其自身的编码问题,尤其是在 Windows 下,可能无法正确输出每个字符。在西方 Windows 上安装系统代码页(终端将使用它来将 PHP 吐出的字节转换为字符以在屏幕上显示)将是代码页 1252,这与 ISO-8859-1 类似但不相同。这就是为什么输出 ISO-8859-1 的

utf8_decode

似乎使文本按您的预期显示。但这没什么用。在内部,您应该对所有字符串使用 UTF-8。

    


1
投票


0
投票

© www.soinside.com 2019 - 2024. All rights reserved.