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

时间:2010-06-25 14:37:56

标签: php utf-8 utf8-decode

在写入数据库之前,我正在读取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成为PONSGroörterbuchDeutschals 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 

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

PONSKompaktwörterbuchDeutsch-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 个答案:

答案 0 :(得分:1)

在写入数据库之前,必须使用mb_convert_encoding或iconv -ction。

答案 1 :(得分:1)

你有一个来自XML文件的UTF-8字符串,你将它放入UTF-8数据库。因此,没有编码或解码可以完成,只需将原始字符串推入数据库即可。确保首先使用mysql_set_charset('utf-8')告诉数据库有UTF-8字符串。

utf8_decodeutf8_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作为所有字符串。