我正在取一个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;
So $link_name becomes脑桥Groürterbuch多伊奇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
但是,当它被写入我的数据库时,它显示为:
脑桥Kompaktwörterbuch Deutsch-Englisch(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
2条答案
按热度按时间yquaqz181#
您从XML文件中获得了一个UTF-8字符串,并将其放入UTF-8数据库中。因此,不需要进行编码或解码,只需将原始字符串推入数据库即可。请确保您首先使用了
mysql_set_charset('utf-8')
来告诉数据库有UTF-8字符串。utf8_decode
和utf8_encode
的命名具有误导性。它们 * 仅 * 用于在UTF-8和ISO-8859-1编码之间转换。调用转换为ISO-8859-1的utf8_decode
,自然会丢失任何不适合该编码的字符。除非有特定的地方需要使用8859-1,否则通常应避免使用这些函数。当你回显一个字符串时,你不应该考虑终端显示什么。终端有自己的编码问题,特别是在Windows下,很可能不可能正确输出每个字符。在西方的Windows安装系统代码页(终端将使用它将PHP吐出的字节转换为字符显示在屏幕上)将是代码页1252,这与ISO-8859-1类似但不相同。这就是为什么
utf8_decode
,它吐出ISO-8859-1,似乎使文本显示为您所期望的。但那没什么用。在内部,你应该对所有字符串使用UTF-8。jchrr9hc2#
在写入数据库之前,必须使用mb_convert_encoding或iconv函数。