所以我正在研究一个从文件中获取数据的项目,在文件中有些行需要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'];
的vardumpstring(15) "xC6ther Barrier"
答案 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,请查看htmlentities
(manual),如果你想反过来,那么来自某些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,它就像一个魅力。