2009-11-18 135 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