2009-11-18 70 views
0

因此,我正在从一个文件中获取数据的项目,在文件中一些行需要utf8符号,但奇怪地编码,他们是\ xC6例如而不是\ Æ奇怪的utf8转换问题在php

如果我做如下:

$name = "\xC6ther"; 
$name = preg_replace('/x([a-fA-F0-9]{2})/', '&#$1;', $name); 
echo utf8_encode($name); 

它工作正常。我得到这个:

Æther 

但是,如果我拉从MySQL相同的数据,并做如下:

$name = $row['OracleName']; 
$name = preg_replace('/x([a-fA-F0-9]{2})/', '\&#$1;', $name); 
$name = utf8_encode($name); 

然后我收到此作为输出:

\&#C6;ther 

谁知道为什么这是?

根据要求,vardump $ row ['OracleName'];

string(15) "xC6ther Barrier" 

回答

1
在你的第二个的preg_replace

为什么有\

preg_replace('/x([a-fA-F0-9]{2})/', '&#$1;', $name); 

好,我觉得这里存在一些混乱。你正则表达式匹配类似x66和将取代由“&#66”,这似乎是一些html entities编码给我,但你使用utf8_encode该做(从手动):

函数utf8_encode - 编码一个ISO-8859-1字符串转换为UTF-8

这样的事情绝不会转化...(或更精确的“&#66”会保持“&#66”,因为它们都是ISO-8859-1和UTF-8中的相同字符)

也会在您使用\xC6的第一个片段中注明,但由于preg_replace已经被编码,因此这个片段永远不会被抓到。 \x意味着下一个十六进制数字(0x00〜0xFF)将按原样放入字符串中。它不会产生一个字符串xC6

所以我对你真正想做的事感到困惑。 preg_replace是关于什么的?

如果你想为HTML实体转换为UTF-8的外观为 mb_convert_encodingmanual),如果你想从一些UTF-8的外观做相反,代码HTML实体为 htmlentitiesmanual

和如果它与所有这一切无关,你想简单地改变编码mb_convert_encoding仍然存在。

+0

从MySQL中提取数据时,它缺少前导\,尽管数据位于mysql表本身中。 – 2009-11-18 03:21:25

+0

对不起,我错过了你的观点,你能告诉我们如何查看'$ row ['OracleName']'var_dump' – RageZ 2009-11-18 03:22:56

0

想通了这个问题,在SQL拉我错过了的preg_replace

preg_replace('/x([a-fA-F0-9]{2})/', '&#x$1;', $name); 

有一次,我在x增加,它的工作就像一个魅力的“X”。

+0

@Trick:我真的不知道你在做什么**但**如果你的问题是解决这是不错 – RageZ 2009-11-18 06:03:01

+0

@Trick:正确的数字是十六进制的,所以应该是'&#xNN',但我仍然担心你的reg exp匹配例如'xaa'是一些编码,它不是 – RageZ 2009-11-18 06:07:54