首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >utf8_encode或decode不是我所期望的

问utf8_encode或decode不是我所期望的
EN

Stack Overflow用户
提问于 2010-06-25 22:37:56
回答 2查看 618关注 0票数 1

在写入数据库之前,我将一个XML文件读入不同的字符串,但是我在处理德语字符时遇到了困难。

XML文件开始

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>

下面就是我遇到问题的一个例子

代码语言:javascript
复制
<name><![CDATA[PONS Großwörterbuch Deutsch als Fremdsprache Android]]></name>

我的PHP有以下相关部分

代码语言:javascript
复制
$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 Android als Fremdsprache Android

然后我做了一个

代码语言:javascript
复制
$link_name = utf8_decode($link_name);

当我在终端回声时,它工作得很好

代码语言:javascript
复制
PONS GroÃwörterbuch Deutsch als Fremdsprache Android as is now 
PONS Großwörterbuch Deutsch als Fremdsprache Android after utf8decode 

然而,当它被写入我的数据库时,它看起来是这样的:

PONS Kompaktwçrterbuch Deutsch-Englisch (Android)

MysQL中link_name的归类为utf8_general_ci

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

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

代码语言:javascript
复制
$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运行它时,我发现

代码语言:javascript
复制
PONS Kompaktwörterbuch Deutsch-Englisch (Android) has been inserted
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-06-25 23:28:26

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

utf8_decode和utf8_encode的名称有误导性。它们仅用于在UTF-8和ISO-8859-1编码之间进行转换。调用转换为utf8_decode -8859-1的ISO-8859-1,自然会丢失任何不适合该编码的字符。除非有特定的地方需要使用8859-1,否则通常应该避免使用这些函数。

你不应该考虑当你回显一个确定的字符串时,终端显示了什么。终端有它自己的编码问题,特别是在Windows下,很可能不可能正确地输出每个字符。在西方Windows安装上,系统代码页(终端将使用它将PHP输出的字节转换为字符以在屏幕上显示)将是代码页1252,它类似于但不同于ISO-8859-1。这就是为什么输出ISO-8859-1的utf8_decode看起来像您所期望的那样显示文本。但这没有什么用处。在内部,您应该对所有字符串使用UTF-8。

票数 1
EN

Stack Overflow用户

发布于 2010-06-25 23:06:43

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3118869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档