php中奇怪的utf8转换问题

时间:2009-11-18 02:53:54

标签: php mysql utf-8

所以我正在研究一个从文件中获取数据的项目,在文件中有些行需要utf8符号但编码很奇怪,例如它们是\ xC6而不是\Æ

如果我这样做:

$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

任何人都知道这是为什么?

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

的vardump
string(15) "xC6ther Barrier" 

2 个答案:

答案 0 :(得分: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抓住,因为它已经是编码字符。 xC6表示字符串中的下一个十六进制数(0x00~0xFF)将按原样丢弃。它不会创建字符串mb_convert_encoding

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

如果你想将HTML实体转换为UTF-8,请查看htmlentitiesmanual),如果你想反过来,那么来自某些UTF-8的HTML实体中的代码会查看{{ 1}}(manual

如果它与所有这些无关,你只想改变编码mb_convert_encoding仍然存在。

答案 1 :(得分:0)

想出了问题,在SQL中我错过了preg_replace中的'x'

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

一旦我添加了x,它就像一个魅力。