2010-10-14 13 views

回答

3

我會去的:

$len = mb_strlen(html_entities_decode($myString, ENT_QUOTES, 'UTF-8'),'UTF-8'); 

雖然我爲什麼你有你的字符串中的HTML實體,而不是實際的操作UTF-8編碼字符串的第一個問題。

另外,要小心你的HTML實體沒有被正確寫入(它們需要以分號結尾)。如果您不添加分號,則任何與實體相關的函數都將失敗,並且許多瀏覽器將無法正確呈現您的實體。

-1
mb_strlen('string' , 'UTF-8'); 
+0

他的字符串不是UTF-8,它們實際上包含&#00f9 – 2010-10-14 12:37:06

+0

@Paul Dixon - 問題已被編輯。當最初提出問題時,它不包含實體;這些實體已經被編輯過了,我不相信它們是提問者的意圖。 (我認爲是你downvoted所有的mb_strlen()答案?) – Spudley 2010-10-14 13:23:48

2

當你的字符串包含Unicode字符的文本編碼(而不是,比方說,UTF-8編碼),你可以通過簡單地用虛擬字符替換它們來獲得長度,因此:

$length=strlen(preg_replace('/&#[0-9a-f]{4}/', '_', $raw)); 

如果t嘿分別是編碼與PHP理解的東西,如UTF-8,你可以使用mb_strlen() intead。

+0

由於Unicode規範化,這可能錯誤地報告'&#101&#769'的長度爲2,當它應該只有1(字母' é')。 – 2010-10-14 12:56:20

+0

他使用的編碼的確切規格沒有被指定,但正則表達式可能被放寬,讀者的練習以及所有這些:)我會猜測OP預期的html樣式實體,在這種情況下,Gumbo的答案是好的一。 – 2010-10-14 13:05:31

1

strlen是一個單字節字符串函數,它在多字節字符串上失敗,因爲它只返回字節數而不是字符數(因爲在單字節字符串中每個字節代表一個字符)。

對於多字節字符串,請使用strlen的多字節對應mb_strlen,而不要忘記指定正確的字符編碼。

並擁有HTML字符引用被解釋爲單個字符,使用html_entity_decode由字符替換他們,他們表示:

$str = html_entity_decode('Stackù', ENT_QUOTES, 'UTF-8'); 
var_dump(mb_strlen($str, 'UTF-8')); // int(6) 

注意&#00f9不是有效的字符引用,因爲它缺少一個xX之後&#爲十六進制表示法和;之後的十六進制值。

相關問題