Buduję API dla aplikacji mobilnej i wydaje mi się, że mam problem z policzeniem długości łańcucha zawierającego emotikony. Mój kod:PHP - długość łańcucha zawierającego emotikony/znaki specjalne
$str = "✌️ @mention";
printf("strlen: %d" . PHP_EOL, strlen($str));
printf("mb_strlen UTF-8: %d" . PHP_EOL, mb_strlen($str, "UTF-8"));
printf("mb_strlen UTF-16: %d" . PHP_EOL, mb_strlen($str, "UTF-16"));
printf("iconv UTF-16: %d" . PHP_EOL, iconv_strlen(iconv("UTF-8", "UTF-16", $str)));
printf("iconv UTF-16: %d" . PHP_EOL, iconv_strlen(iconv("ISO-8859-1", "UTF-16", $str)));
odpowiedź to:
strlen: 27
mb_strlen UTF-8: 14
mb_strlen UTF-16: 13
iconv UTF-16: 14
iconv UTF-16: 27
jednak powinien dostać 17 jako wynik. Próbowaliśmy połączyć długość ciągu w telefonach z systemem iOS, Android i Windows, wszędzie jest ich 17. iOS (swift):
var str = "✌️ @mention"
(str as NSString).length // 17
count(str) // 13
count(str.utf16) // 17
count(str.utf8) // 27
Musimy użyć NSString z powodu biblioteki. Potrzebuję tego, aby uzyskać początkową i końcową pozycję "@mention". Jeśli ciąg zawiera tylko tekst lub tylko emotikony, działa dobrze, więc prawdopodobnie występuje problem z mieszaną zawartością.
Co robię źle? Jakie inne informacje mogę wam zapewnić, abyście poszli we właściwym kierunku?
Dzięki!
spróbuj mb_substr, mb_str długość może być opcja –