php中奇怪的utf8转换问题

php中奇怪的utf8转换问题,php,mysql,utf-8,Php,Mysql,Utf 8,所以我在做一个从文件中提取数据的项目,在文件中有些行需要utf8符号,但编码很奇怪,例如它们是\xC6而不是\Æ 如果我这样做: $name = "\xC6ther"; $name = preg_replace('/x([a-fA-F0-9]{2})/', '&#$1;', $name); echo utf8_encode($name); $name = $row['OracleName']; $name = preg_replace('/x([a-fA-F0-9]{2})/', '\

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

如果我这样做:

$name = "\xC6ther";
$name = preg_replace('/x([a-fA-F0-9]{2})/', '&#$1;', $name);
echo utf8_encode($name);
$name = $row['OracleName'];
$name = preg_replace('/x([a-fA-F0-9]{2})/', '\&#$1;', $name);
$name = utf8_encode($name);
它很好用。我明白了:

Æther
但如果我从MySQL中提取相同的数据,并执行以下操作:

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

在第二次怀孕时,更换为什么会出现
\

preg_replace('/x([a-fA-F0-9]{2})/', '&#$1;', $name);
好的,我想这里有些混乱。您的正则表达式正在匹配类似于
x66
的内容,并将其替换为“B”,这对我来说似乎是一些
html实体
编码,但您使用的是
utf8\u编码
,它可以做到这一点(来自手册):

utf8_编码-将ISO-8859-1字符串编码为UTF-8

所以这些东西永远不会被转换。。。(或者更准确地说,B’将保留为B’,因为它们在ISO-8859-1和UTF-8中都是相同的字符)

还需要注意的是,在第一个代码段中,您使用了
\xC6
,但这不会被
preg\u replace
捕获,因为它已经是编码字符。
\x
表示下一个十六进制数(0x00~0xFF)将按原样放入字符串中。它不会生成字符串
xC6

所以我有点困惑你到底想做什么。preg_替换是关于什么的

如果要将HTML实体转换为UTF-8,请查看
mb\u convert\u encoding
(),如果要执行相反的操作,请从一些UTF-8实体转换为HTML实体,查看
htmlentities
()


如果它与所有这些都无关,而你只想改变编码
mb\u convert\u编码仍然存在

解决了问题,在SQL拉取中,我在preg_替换中遗漏了一个“x”

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

一旦我在x中添加了数据,它就发挥了巨大的作用。

当从MySQL中提取数据时,它缺少前导\,尽管数据本身在MySQL表中。很抱歉,我没有领会你的意思,你能告诉我们如何查看
$row['OracleName']
使用
var\u dump
@技巧:我真的不知道你在做什么,但如果你的问题是修复的,那就没问题了nice@Trick:对,数字是十六进制的,所以应该是
和#xNN
,但我仍然担心您的reg-exp匹配,例如
xaa
,是一些不匹配的编码