Translate: 
EnglishFrenchGermanItalianPolishPortugueseRussianSpanish

UTF-8 w PHP 5.0+: Klasa String wzorowana na języku Java

Jak dobrze wiemy w PHP obsługa UTF-8 jest po dziś dzień dosyć skromna. Co prawda nie jest to cecha charakterystyczna wyłącznie dla tego języka (podobne problemy mają developerzy np. Ruby’ego), to w czasach, gdy większość stron WWW kodowanych jest w unikodzie, staje się to bolesną niedogodnością podczas developmentu.

Co prawda w wersji 5.3 pojawiła się nowa biblioteka ext/intl próbująca nadrobić opóźnienia w stosunku do reszty świata, jest to niestety zmiana prawie kosmetyczna, a nawet nieelegancka. Prawdziwa rewolucja miała nastąpić dopiero w PHP 6.0. Jako że ta wersja nie ujrzy już niestety światła dziennego, a programiści PHP 5.2, którzy z jakichś powodów nie mogą przesiąść się na wersję 5.3, skazani zostali na używanie zbioru różnych klas nie do końca sprawdzonych lub przemyślanych, postanowiłem że napiszę własną wzorując się na klasie String z języka Java.

Skąd pobrać?

Gotowy skrypt można pobrać z serwisu softpedia (bez logowania), lub phpclasses (wymaga zalogowania) lub bezpośrednio z repozytorium mojego blogu (nie wymaga logowania).

Jak to działa?

Ze względów na konieczność zachowania kompatybilności z językiem PHP 5.0+ biblioteka nie używa na chwilę obecną rozszerzenia ext/intl, lecz posługuje się wyłącznie funkcjonalnością biblioteki iconv.

Implementacja z języka Java

Napisana przeze mnie biblioteka implementuje wszystkie publiczne metody opisane w dokumentacji klasy String:

  • String::__construct()
  • String::__destruct()
  • String::offsetExists()
  • String::offsetGet()
  • String::offsetSet()
  • String::offsetUnset()
  • String::isPureAscii()
  • String::isValid()
  • String::length()
  • String::subString()
  • String::charAt()
  • String::compareTo()
  • String::compareToIgnoreCase()
  • String::concat()
  • String::startsWith()
  • String::toLowerCase()
  • String::contentEquals()
  • String::toUpperCase()
  • String::endsWith()
  • String::indexOf()
  • String::hashCode()
  • String::equals()
  • String::equalsIgnoreCase()
  • String::lastIndexOf()
  • String::__toString()
  • String::toString()
  • String::getBytes()
  • String::getCharsArray()
  • String::trimStart()
  • String::trimEnd()
  • String::trim()
  • String::padRight()
  • String::padLeft()
  • String::split()
  • String::matches()
  • String::replace()
  • String::replaceFirst()
  • String::replaceAll()
  • String::regionMatches()

…klasy Pattern:

  • Pattern::compile()
  • Pattern::__construct()
  • Pattern::flags()
  • Pattern::matcher()
  • Pattern::matches()
  • Pattern::Pattern()
  • Pattern::split()

…oraz Matcher języka Java:

  • Matcher::__construct()
  • Matcher::reset()
  • Matcher::find()
  • Matcher::group()
  • Matcher::groupCount()
  • Matcher::start()
  • Matcher::end()
  • Matcher::nextMatch()
  • Matcher::matches()
  • Matcher::getCharIndexFromByteIndex()
  • Matcher::getByteIndexFromCharIndex()
  • Matcher::replaceFirst()
  • Matcher::replaceAll()
  • Matcher::appendReplacement()
  • Matcher::appendTail()
  • Matcher::lookingAt()

Celowo nie opisuję argumentów wejściowych wspomnianych metod, ponieważ argumenty te są w 100% kompatybilne z dokumentacją Javy. Możliwe jest także iterowanie znak-po-znaku po obiekcie klasy String, tak jak ma to miejsce w przypadku tradycyjnych operacji na tekście.

Każde użycie powyższych metod wywołuje walidację kodowania UTF-8 na każdym tekstowym argumencie wejściowym.

Klasy dodatkowe

Dodatkowo biblioteka udostępnia klasy pomocnicze, niekompatybilne z mechanizmami Javy:

Klasa Int odpowiedzialna za obsługę wartości liczbowych:

  • Int::isInt()
  • Int::isBetween()
  • Int::isMin()
  • Int::isMax()
  • Int::nativeCapacity()
  • Int::nativeBitsCapacity()
  • Int::isNativeOverflow()
  • Int::getUnsigned()

Klasa DataArray symulująca PHPowe tablice, lecz przechowująca obiekty typu String.

  • DataArrray::__construct()
  • DataArrray::offsetExists()
  • DataArrray::offsetGet()
  • DataArrray::offsetSet()
  • DataArrray::offsetUnset()
  • DataArrray::pushFromArray()
  • DataArrray::push()
  • DataArrray::unshift()
  • DataArrray::pop()
  • DataArrray::shift()
  • DataArrray::get()
  • DataArrray::hasValue()
  • DataArrray::length()
  • DataArrray::__toString()
  • DataArrray::toString()
  • DataArrray::current()
  • DataArrray::next()
  • DataArrray::key()
  • DataArrray::rewind()
  • DataArrray::valid()
  • DataArrray::getKeys()

Oraz klasa Locale, służąca do lokalizowania stringów (ważne np. przy porównywaniu stringów ze sobą):

  • Locale::getOsType()
  • Locale::setLocale()
  • Locale::setDefault()
  • Locale::getDefault()
  • Locale::getVariant()
  • Locale::__construct()
  • Locale::getISOLanguages()
  • Locale::getISOCountries()
  • Locale::getAvailableLocales()
  • Locale::getSupportedLocales()
  • Locale::getLocaleName()
  • Locale::getLanguage()
  • Locale::getCountry()
  • Locale::getCharsetName()

Tagi: , , , , , ,

Dodaj odpowiedź