2015-07-21 19 views
1

我在cp1251_general_ci歸類中有一個mysql varchar(50)行。 在php中mysql_fetch_row之後,我得到了一個$字符串。 然後我做到以下幾點:從MySQL cp1251_general_ci歸類(Windows-1251)轉換爲UTF-8 php

echo mb_detect_encoding($string,'CP1251,UTF-8,Windows-1251'); // echoes Windows-1251 
$string = mb_convert_encoding($string, 'UTF-8', 'Windows-1251'); 
echo mb_detect_encoding($string,'CP1251,UTF-8,Windows-1251'); // again echoes Windows-1251 

爲什麼第二次字符串不是UTF-8?

我也試過

$string = iconv('Windows-1251', 'UTF-8', $string); 

但再出字符集爲Windows-1251。

而在最後的結果我得到了我的文件名中由$ string變量組成的編碼。

我怎樣才能從MySQL cp1251_general_ci整理(Windows-1251)轉換爲UTF-8?

P.S.

echo $string; \\ echoes ������ 
echo bin2hex($string); \\ echoes cce5e3e0f4eeed 
$string = mb_convert_encoding($string, 'UTF-8', 'Windows-1251'); 
echo $string; \\ echoes Мегафон 
echo bin2hex($string); \\ echoes d09cd0b5d0b3d0b0d184d0bed0bd 

fopen("../tmp/$string.log", "w"); 

創建一個文件.../tmp目錄/ ??????????????。日誌(在Linux)

+0

究竟是字符串的內容的精確編碼的決心?什麼是它的十六進制值('echo bin2hex($ string)')? – deceze

+0

我在您的評論後更新了我的問題 – cofirazak

回答

0

找到了這種奇怪的情況的原因!

簡而言之:如果您在服務器(終端中)以不可讀的符號顯示正確編碼的UTF-8字符串 - 請檢查服務器區域設置。 如果您看到mb_detect_encoding()方法的奇怪行爲,請不要忘記 - mb_detect_encoding不會爲您提供精確的字符串編碼確定。

在文件名中不正確編碼的原因:.../tmp/?????????????? .log文件是服務器上的語言環境!這裏是服務器上的locale命令的結果,其中該文件位於:

$ locale 
LANG= 
LC_CTYPE="C" 
LC_COLLATE="C" 
LC_TIME="C" 
LC_NUMERIC="C" 
LC_MONETARY="C" 
LC_MESSAGES="C" 
LC_ALL= 

對於服務器語言環境必須是utf-8也是在服務器上的文件名正確顯示UFT-8符號。

而且關於問題中的所有轉換。這兩種方法:

iconv('Windows-1251', 'UTF-8', $string); 

mb_convert_encoding($string, 'UTF-8', 'Windows-1251'); 

工作正常,在這種情況下。

唯一的問題就是爲什麼

echo mb_detect_encoding($string,'CP1251,UTF-8,Windows-1251'); // echoes Windows-1251 
$string = mb_convert_encoding($string, 'UTF-8', 'Windows-1251'); 
echo mb_detect_encoding($string,'CP1251,UTF-8,Windows-1251'); // again echoes Windows-1251 

第二回聲是不是UTF-8?

答案是 - mb_detect_encoding不給你一個字符串