2011-11-22 90 views
1

這裏的編碼完全拙劣地描述了一個簡單的操作。我只想檢查一個字符串的第一個字符是否是£。我的php文件本身編碼爲UTF8-沒有BOM。謝謝!字符串的奇怪的字符編碼問題

<?php 
print "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.1//EN' "; 
print "'http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd'>\n"; 
print "<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='eng' lang='en'>\n"; 
print "<head>\n"; 
print "<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />\n"; 
print "<title>WAMP</title>\n"; 
print "<meta name='Description' content='Website Under Construction' />\n"; 
print "</head>\n"; 
print "<body>\n"; 
print "<p>\n"; 

$temp = "£Hello"; 
$charArray = preg_split('//', $temp, -1); 
// preg_match_all('/./', $temp, $charArray); 

print_r ($charArray); 
print "<br />First Char: $temp[0]"; 

print "</p>\n"; 
print "</body>\n"; 
print "</html>"; 
?> 

輸出:

Array ([0] => [1] => � [2] => � [3] => H [4] => e [5] => l [6] => l [7] => o [8] =>) 
First Char: � 

所需的輸出:

Array ([0] => [1] £ [2] => H [3] => e [4] => l [5] => l [6] => o [7] =>) 
First Char: £ 
+0

我不知道PHP,但我知道這對正則表達式一個Unicode標誌。當你執行'$ charArray = preg_split('// u',$ temp,-1)時,你會得到什麼?''? –

+0

是的,這有效,但我真的這條線正常工作:if($ temp [0] =='£'){print'Yay!'} – skibulk

+0

我不明白你的意思。數組的第一項總是空的,因爲空正則表達式匹配字符串開始處的空白空間。如何使用'preg_match_all('/./ u',$ temp,$ charArray);'? –

回答

1

而不是$temp[0]這是不是多字節意識到,嘗試mb_substr()

if(mb_substr($temp, 0, 1, 'UTF-8') == '£') 
{ 
    ... 
} 
2

既然你要發送適當的內容類型標頭的HTML,我猜你是通過運行這個Apache網絡服務器。如果不是,那麼請忽略我,但可能有一個設置在服務器配置的其他地方做這個...

我跑到這個問題之前,絕對一切都必須在UTF8模式下工作。

具體在這裏,我懷疑你需要創建一個.htaccess文件在同一目錄中包含這樣的腳本:

AddDefaultCharset UTF-8 

的重新啓動Apache明顯。

這裏另外要注意的,如果你打算使用MySQL數據庫,您還需要確保連接是UTF8編碼,通過連接後運行以下SQL命令:

SET NAMES utf8 
+0

謝謝Neil,我正在使用本地WAMP安裝。我添加了.htaccess文件,但仍然收到相同的結果。我將連接到MySQL,所以感謝那個珍聞。我將進一步研究apache UTF8設置... – skibulk

+0

我可能錯過了一件事,有時使用標頭來設置內容類型還不夠,而且您必須執行類似這也是(在PHP中): 'header(「Content-type:text/html; charset = utf-8」);' –