PHPackages                             wikimedia/equivset - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. wikimedia/equivset

ActiveLibrary

wikimedia/equivset
==================

Visually Equivalent Set of UTF-8 Characters

1.7.1(1y ago)3212.8k↓22.6%GPL-2.0-or-laterPHPPHP &gt;=7.4.3

Since Oct 6Pushed 2mo ago11 watchersCompare

[ Source](https://github.com/wikimedia/mediawiki-libs-Equivset)[ Packagist](https://packagist.org/packages/wikimedia/equivset)[ Docs](https://www.mediawiki.org/wiki/Equivset)[ RSS](/packages/wikimedia-equivset/feed)WikiDiscussions master Synced 1mo ago

READMEChangelogDependencies (11)Versions (15)Used By (0)

Equivset
========

[](#equivset)

A mapping of "equivalent" or similar-looking characters ([homoglyphs](https://en.wikipedia.org/wiki/Homoglyph)) to prevent spoofing. This is similar to the Unicode Consortium's [confusables.txt](https://www.unicode.org/Public/security/15.1.0/confusables.txt) with some significant differences. Confusables.txt lists character pairs that are visually identical or nearly identical, for example, Latin "A" and Greek "Α" (alpha). This list is much broader, including pairs that merely look similar, for example, "S" and "$". Another difference is that this list only includes letters and punctuation. It does not include symbols, emoji, or graphical elements.

Installation
------------

[](#installation)

Using composer: Add the following to the composer.json file for your project:

```
{
  "require": {
     "wikimedia/equivset": "^1.0.0"
  }
}
```

And then run `composer update`.

Usage
-----

[](#usage)

```
use Wikimedia\Equivset\Equivset;

$equivset = new Equivset();

// Normalize a string
echo $equivset->normalize( 'sp00f' ); // SPOOF

// Get a single character.
if ( $equivset->has( 'ɑ' ) ) {
	$char = $equivset->get( 'ɑ' );
}
echo $char; // A

// Loop over entire set.
foreach ( $equivset as $char => $equiv ) {
	// Do something.
}

// Get the entire set.
$all = $equivset->all();
```

Contributing
------------

[](#contributing)

All changes should be made to `./data/equivset.in`. Then run `bin/console generate-equivset` to generate the JSON, PHP, and plain text versions of the equivset in `./dist`.

When releasing, update HISTORY.md with `git log --format='* %s (%aN)' --topo-order`to consistently list commits.

###  Health Score

53

—

FairBetter than 97% of packages

Maintenance68

Regular maintenance activity

Popularity36

Limited adoption so far

Community23

Small or concentrated contributor base

Maturity71

Established project with proven stability

 Bus Factor2

2 contributors hold 50%+ of commits

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~208 days

Recently: every ~139 days

Total

14

Last Release

437d ago

PHP version history (3 changes)1.0.0PHP &gt;=5.5.9

1.4.0PHP &gt;=7.2.0

1.5.0PHP &gt;=7.4.3

### Community

Maintainers

![](https://www.gravatar.com/avatar/b94d9718c06ec7c3fd7a104bc44966fb7464b9ec7411582343ea35a7a6a85f08?d=identicon)[mediawiki](/maintainers/mediawiki)

![](https://www.gravatar.com/avatar/716c86d71cbf921e7912a505f89d799de398fc0a3af0bd4c8862834b2d642bd7?d=identicon)[wikimedia](/maintainers/wikimedia)

![](https://www.gravatar.com/avatar/f281fc1a5701e1e7002129e0198e12bff5c8ce049377bf1f75b022d588a5bd94?d=identicon)[legoktm](/maintainers/legoktm)

---

Top Contributors

[![thiemowmde](https://avatars.githubusercontent.com/u/6576639?v=4)](https://github.com/thiemowmde "thiemowmde (53 commits)")[![umherirrender](https://avatars.githubusercontent.com/u/1174884?v=4)](https://github.com/umherirrender "umherirrender (52 commits)")[![jdforrester](https://avatars.githubusercontent.com/u/881572?v=4)](https://github.com/jdforrester "jdforrester (20 commits)")[![legoktm](https://avatars.githubusercontent.com/u/81392?v=4)](https://github.com/legoktm "legoktm (10 commits)")[![reedy](https://avatars.githubusercontent.com/u/67615?v=4)](https://github.com/reedy "reedy (7 commits)")[![Huji](https://avatars.githubusercontent.com/u/84526?v=4)](https://github.com/Huji "Huji (4 commits)")[![Krinkle](https://avatars.githubusercontent.com/u/156867?v=4)](https://github.com/Krinkle "Krinkle (3 commits)")[![kaldari](https://avatars.githubusercontent.com/u/1707155?v=4)](https://github.com/kaldari "kaldari (3 commits)")[![Daimona](https://avatars.githubusercontent.com/u/38216014?v=4)](https://github.com/Daimona "Daimona (3 commits)")[![xSavitar](https://avatars.githubusercontent.com/u/4872561?v=4)](https://github.com/xSavitar "xSavitar (1 commits)")[![DannyS712](https://avatars.githubusercontent.com/u/46829944?v=4)](https://github.com/DannyS712 "DannyS712 (1 commits)")[![dayllanmaza](https://avatars.githubusercontent.com/u/680583?v=4)](https://github.com/dayllanmaza "dayllanmaza (1 commits)")[![MarcoAurelioWM](https://avatars.githubusercontent.com/u/30000615?v=4)](https://github.com/MarcoAurelioWM "MarcoAurelioWM (1 commits)")[![mdaniels5757](https://avatars.githubusercontent.com/u/8762511?v=4)](https://github.com/mdaniels5757 "mdaniels5757 (1 commits)")[![mszabo-wikia](https://avatars.githubusercontent.com/u/2721291?v=4)](https://github.com/mszabo-wikia "mszabo-wikia (1 commits)")[![The-Voidwalker](https://avatars.githubusercontent.com/u/22969267?v=4)](https://github.com/The-Voidwalker "The-Voidwalker (1 commits)")

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/wikimedia-equivset/health.svg)

```
[![Health](https://phpackages.com/badges/wikimedia-equivset/health.svg)](https://phpackages.com/packages/wikimedia-equivset)
```

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
