{"id":34637061,"url":"https://github.com/unixwzrd/unicodefix","last_synced_at":"2026-04-02T17:02:30.407Z","repository":{"id":289806088,"uuid":"972439575","full_name":"unixwzrd/UnicodeFix","owner":"unixwzrd","description":"Normalizes Unicode to ASCII equivalents and remove Unicode from AI generated text from ChatGPT, Anthropic, Google and more.","archived":false,"fork":false,"pushed_at":"2026-03-28T20:26:35.000Z","size":3560,"stargazers_count":24,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-03-28T22:26:16.544Z","etag":null,"topics":["clean-unicode","clean-utf8","remove-unicode","unicode-characters","unicode-converter","unicode-no","utf-8-conversion-tool","utf8-normalization","utf8-sanitizer"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/unixwzrd.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":null,"patreon":"unixwzrd","open_collective":null,"ko_fi":"unixwzrd","tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"lfx_crowdfunding":null,"polar":null,"buy_me_a_coffee":"unixwzrd","thanks_dev":null,"custom":null}},"created_at":"2025-04-25T04:50:56.000Z","updated_at":"2026-03-28T20:24:24.000Z","dependencies_parsed_at":"2025-09-19T04:16:10.588Z","dependency_job_id":"70e7919f-b67b-417d-bd3a-bcf0325efbcc","html_url":"https://github.com/unixwzrd/UnicodeFix","commit_stats":null,"previous_names":["unixwzrd/unicodefix"],"tags_count":22,"template":false,"template_full_name":null,"purl":"pkg:github/unixwzrd/UnicodeFix","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/unixwzrd%2FUnicodeFix","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/unixwzrd%2FUnicodeFix/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/unixwzrd%2FUnicodeFix/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/unixwzrd%2FUnicodeFix/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/unixwzrd","download_url":"https://codeload.github.com/unixwzrd/UnicodeFix/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/unixwzrd%2FUnicodeFix/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31311028,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-02T12:59:32.332Z","status":"ssl_error","status_checked_at":"2026-04-02T12:54:48.875Z","response_time":89,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["clean-unicode","clean-utf8","remove-unicode","unicode-characters","unicode-converter","unicode-no","utf-8-conversion-tool","utf8-normalization","utf8-sanitizer"],"created_at":"2025-12-24T17:03:46.475Z","updated_at":"2026-04-02T17:02:30.394Z","avatar_url":"https://github.com/unixwzrd.png","language":"Python","funding_links":["https://patreon.com/unixwzrd","https://ko-fi.com/unixwzrd","https://buymeacoffee.com/unixwzrd"],"categories":[],"sub_categories":[],"readme":"# UnicodeFix - *Wolf Edition v1.2.2\" - it solves \"problems.\"\n\n*Last updated: 2026-03-28*\n\n![UnicodeFix Hero Image](docs/controlling-unicode.png)\n\n[![Python](https://img.shields.io/badge/Python-3.9%2B-blue)](#) [![Platforms](https://img.shields.io/badge/Platforms-macOS%20%7C%20Ubuntu-informational)](#) [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE) [![Release](https://img.shields.io/github/v/tag/unixwzrd/UnicodeFix?label=release)](https://github.com/unixwzrd/UnicodeFix/releases) [![CI](https://github.com/unixwzrd/UnicodeFix/actions/workflows/ci.yml/badge.svg)](.github/workflows/ci.yml)\n\n- [UnicodeFix - \\*Wolf Edition v1.2.2\" - it solves \"problems.\"](#unicodefix---wolf-edition-v122---it-solves-problems)\n    - [**Finally - a tool that blasts AI fingerprints, torches those infuriating smart quotes, and leaves your code \\\u0026 docs squeaky clean for real humans.**](#finally---a-tool-that-blasts-ai-fingerprints-torches-those-infuriating-smart-quotes-and-leaves-your-code--docs-squeaky-clean-for-real-humans)\n    - [Two modes (cleaner + auditor)](#two-modes-cleaner--auditor)\n  - [Why Is This Happening?](#why-is-this-happening)\n  - [Installation](#installation)\n  - [Usage](#usage)\n    - [New options](#new-options)\n      - [When to preserve invisible characters (`-i`)](#when-to-preserve-invisible-characters--i)\n  - [Python API Usage](#python-api-usage)\n  - [Brief Examples](#brief-examples)\n    - [Pipe / Filter (STDIN to STDOUT)](#pipe--filter-stdin-to-stdout)\n    - [Batch Clean](#batch-clean)\n    - [In-Place (Safe) Clean](#in-place-safe-clean)\n    - [Preserve Temp File for Backup](#preserve-temp-file-for-backup)\n    - [Audit only (no changes), human-readable](#audit-only-no-changes-human-readable)\n    - [Audit as JSON](#audit-as-json)\n    - [Audit with Semantic Metrics (experimental)](#audit-with-semantic-metrics-experimental)\n    - [Report without blocking commits](#report-without-blocking-commits)\n    - [Fail CI if anomalies exceed threshold](#fail-ci-if-anomalies-exceed-threshold)\n    - [Using in vi/vim/macvim](#using-in-vivimmacvim)\n  - [What's New / What's Cool](#whats-new--whats-cool)\n    - [CodexExorcism+ Release (Sept 2025)](#codexexorcism-release-sept-2025)\n    - [CodexExorcism+ Release (Sept 2025)](#codexexorcism-release-sept-2025-1)\n    - [Keep It Fresh](#keep-it-fresh)\n  - [Shortcut for macOS](#shortcut-for-macos)\n    - [To add the Shortcut](#to-add-the-shortcut)\n  - [What's in This Repository](#whats-in-this-repository)\n  - [Testing and CI/CD](#testing-and-cicd)\n  - [Contributing](#contributing)\n  - [Support This and Other Projects](#support-this-and-other-projects)\n  - [Changelog](#changelog)\n  - [License](#license)\n\n---\n\n### **Finally - a tool that blasts AI fingerprints, torches those infuriating smart quotes, and leaves your code \u0026 docs squeaky clean for real humans.**\n\nEver open up a file and instantly know it came from ChatGPT, Copilot, or one of their AI cousins? (Yeah, so can everyone else now.)\nUnicodeFix vaporizes all the weird dashes, curly quotes, invisible space ninjas, and digital \"tells\" that out you as an AI user - or just make your stuff fail linters and code reviews.\n\n**Whether you're a student, a dev, or an open-source rebel: this is your \"eraser for AI breadcrumbs.\"**\n\n*Yes, it helps students cheat on their homework.*\nIt also makes blog posts and AI-proofed emails look like you sweated over every character.\nNearly a thousand people have grabbed it. Nobody's bought me a coffee yet, but hey… there's a first time for everything.\n\n---\n\n### Two modes (cleaner + auditor)\n\n- **Clean mode (default):** scrub Unicode artifacts from files or stdin → stdout.\n- **Audit mode (`--report`):** scan text for anomalies + (optional) semantic metrics. Works for CI gates, pre-commit hooks, and yes - professors looking for shenanigans.\n\nA combination of Jules and Vincent... plus Winston Wolf. It solves problems.\n\n---\n\n## Why Is This Happening?\n\nSome folks think all this Unicode cruft is a side-effect of generative AI's training data. Others believe it's a deliberate move - baked-in \"watermarks\" to ID machine-generated text. Either way: these artifacts leave a trail. UnicodeFix wipes it.\n\nBe careful, professors and reviewers may even start planting Unicode honeypots in starter code or essays - UnicodeFix torches those too. In this \"AI Arms Race,\" `diff` and `vimdiff` are your night-vision goggles.\n\n---\n\n## Installation\n\nClone the repository and run the setup script:\n\n```bash\ngit clone https://github.com/unixwzrd/UnicodeFix.git\ncd UnicodeFix\n\n# Installs from pyproject.toml.\n# Reuses an active non-base Conda env if you already have one.\n# Otherwise it creates or reuses a local .venv.\n./setup.sh\n```\n\nThe `setup.sh` script:\n\n- Uses `pyproject.toml` as the single source of truth for dependencies\n- Reuses your active non-base Conda environment when one is already active\n- Otherwise creates or reuses a local `.venv`\n- Installs the package directly instead of requiring a second manual `pip install` step\n\nOptional install modes:\n\n```bash\n./setup.sh --dev   # editable install + dev tooling\n./setup.sh --nlp   # optional NLP/metrics dependencies\n```\n\n`./setup.sh` now also installs a local Git `pre-push` hook by default when run inside the repo. That hook runs the same local gate as CI:\n\n```bash\nscripts/run_checks.sh\n```\n\nUse `./setup.sh --no-hooks` if you need to skip hook installation.\n\nSee [setup.sh](setup.sh) for the nitty-gritty. If the executable bit is stripped by your tooling, `bash setup.sh --nlp` works too.\n\nFor serious environment nerds: [VenvUtil](https://github.com/unixwzrd/venvutil) is my full-featured Python env toolkit.\n\n---\n\n## Usage\n\nOnce installed and activated:\n\n```bash\n(ConnectomeAI) [unixwzrd@xanax: unicodefix]$ cleanup-text --help\nusage: cleanup-text [-h] [-i] [-Q] [-D] [--keep-fullwidth-brackets] [-n] [-o OUTPUT] [-t] [-p] [--report] [--csv | --json] [--label LABEL] [--threshold THRESHOLD] [--metrics] [--metrics-help] [--exit-zero] [--no-color] [-q] [infile ...]\n\nClean Unicode quirks from text. STDIN→STDOUT if no files; otherwise writes .clean files or -o.\n\npositional arguments:\n  infile                Input file(s)\n\noptions:\n  -h, --help            show this help message and exit\n  -i, --invisible       Preserve invisible Unicode (ZW*, bidi controls)\n  -Q, --keep-smart-quotes\n                        Preserve Unicode smart quotes\n  -D, --keep-dashes     Preserve Unicode EN/EM dashes\n  --keep-fullwidth-brackets\n                        Preserve fullwidth square brackets (【】)\n  -n, --no-newline      Do not add a final newline\n  -o OUTPUT, --output OUTPUT\n                        Output filename or '-' for STDOUT (only valid with one input)\n  -t, --temp            In-place clean via .tmp swap, then write back\n  -p, --preserve-tmp    With -t, keep the .tmp file after success\n  --report              Audit counts per category (no changes)\n  --csv                 With --report, emit CSV (one row per file)\n  --json                With --report, emit JSON\n  --label LABEL         When reading from STDIN ('-'), use this display name in report/CSV\n  --threshold THRESHOLD\n                        With --report, exit 1 if total anomalies \u003e= N\n  --metrics             Include semantic metrics and imply report mode\n  --metrics-help        Explain metrics and arrows (↑/↓).\n  --exit-zero           Always exit with code 0 (useful for pre-commit reporting)\n  --no-color            Disable ANSI colors (plain output)\n  -q, --quiet           Suppress status lines on stderr\n```\n\n### New options\n\n- `-Q`, `--keep-smart-quotes`: Preserve Unicode smart quotes (curly single/double quotes). Useful when preparing prose/blog posts where typographic quotes are intentional. Default behavior converts them to ASCII for shell/CI safety.\n- `-D`, `--keep-dashes`: Preserve Unicode dash and hyphen variants. Useful when stylistic punctuation is desired in prose. Default behavior folds non-breaking hyphens and EN-style dashes to `-`, and EM-style bars to ` - `.\n- `--keep-fullwidth-brackets`: Preserve fullwidth square brackets (`【】`). By default, they are folded to ASCII `[]` to keep monospace alignment in terminals and fixed-width tables.\n- `-R`, `--report`: Audit text for anomalies, human-readable.\n- `-J`, `--json`: Audit text for anomalies, JSON format.\n- `-T`, `--threshold`: Fail CI if anomalies exceed threshold.\n- `--metrics`: Attach experimental semantic metrics (entropy, AI-score, etc.) and implicitly switch to report mode unless you explicitly request cleaned output with `-o` or `-t`, in which case the clean output is written and the report is shown on `stderr`.\n- `--metrics-help`: Print friendly descriptions of each metric and the ↑/↓ hints.\n- `--exit-zero`: Force a zero exit code for report mode (handy for informative hooks/CI jobs).\n- `-H`, `--help`: Show help message and exit.\n- `-V`, `--version`: Show version and exit.\n\n#### When to preserve invisible characters (`-i`)\n\nIn most code/CI workflows, invisible/bidi controls are accidental and should be removed (default). Rare cases to preserve (`-i`):\n\n- Linguistic text where ZWJ/ZWNJ influence shaping\n- Intentional watermarks/markers in text\n- Forensic/debug inspections before deciding what to strip\n\n## Python API Usage\n\nUnicodeFix provides a clean Python API for programmatic text cleaning and analysis. Import and use the functions directly in your Python code:\n\n```python\nfrom unicodefix.transforms import clean_text, handle_newlines\nfrom unicodefix.scanner import scan_text_for_report\nfrom unicodefix.report import print_human, print_json\nfrom unicodefix.metrics import compute_metrics  # Experimental\n\n# Clean text with default settings (aggressive normalization)\ncleaned = clean_text(\"\"Hello\" — world…\")\n\n# Clean with preservation options\ncleaned = clean_text(\n    text=\"'Smart quotes' and — dashes\",\n    preserve_quotes=True,      # Keep smart quotes\n    preserve_dashes=True,       # Keep em/en dashes\n    preserve_invisible=False    # Remove invisible chars (default)\n)\n\n# Scan text for anomalies (report mode)\nanomalies = scan_text_for_report(\"\"text\"\\u200b\")\n# Returns: {'unicode_ghosts': {...}, 'typographic': {...}, ...}\n\n# Generate human-readable report\nprint_human(\"file.txt\", anomalies)\n\n# Generate JSON report\nprint_json({\"file.txt\": anomalies})\n\n# Compute semantic metrics (experimental, requires NLTK)\nmetrics = compute_metrics(\"Some text to analyze...\")\n# Returns: {'entropy': 0.85, 'ai_score': 0.42, ...}\n```\n\n**See [API Documentation](docs/API.md) for complete details on all available functions, parameters, and return values.**\n\n## Brief Examples\n\n### Pipe / Filter (STDIN to STDOUT)\n\n```bash\ncat file.txt | cleanup-text \u003e cleaned.txt\n```\n\n### Batch Clean\n\n```bash\ncleanup-text *.txt\n```\n\n### In-Place (Safe) Clean\n\n```bash\ncleanup-text -t myfile.txt\n```\n\n### Preserve Temp File for Backup\n\n```bash\ncleanup-text -t -p myfile.txt\n```\n\n### Audit only (no changes), human-readable\n\n```bash\ncleanup-text --report foo.txt\n```\n\n### Audit as JSON\n\n```bash\ncleanup-text --report --json foo.txt\n```\n\n### Audit with Semantic Metrics (experimental)\n\n```bash\ncleanup-text --metrics foo.txt\ncleanup-text --report --json --metrics foo.txt\n```\n\n`--metrics` now implies report mode, so the first command prints a human-readable report with metrics and the second emits JSON. If you explicitly request cleaned output with `-o` or `-t`, the clean output is still written and the human-readable report is emitted on `stderr`. Install the optional NLP support with `./setup.sh --nlp`.\n\n### Report without blocking commits\n\n```bash\ncleanup-text --report --metrics --exit-zero foo.txt\n```\n\nEmits the full report (and metrics if requested) but always returns exit code 0, so informational pre-commit hooks and dashboards can surface issues without aborting the workflow.\n\n### Fail CI if anomalies exceed threshold\n\n```bash\ncleanup-text --report --threshold 1 some/*.txt\n```\n\n### Using in vi/vim/macvim\n\n```vim\n:%!cleanup-text\n```\n\nWorks great for vi/Vim purists, VS Code hipsters, or anyone who just wants their text to behave like text.\nAlso handy if you’re trying to slip your AI-generated code past your CS prof without curly quotes giving you away.\n\nYou can run it from Vim, VS Code in Vim mode, or as a pre-commit. Use it for email, blog posts, whatever. Ignore the naysayers - this is *real-world convenience.*\n\nSee [cleanup-text.md](docs/cleanup-text.md) for deeper dives and arcane options.\n\n- **Make sure your Python environment is activated** before launching your editor, or wrap it in a shell script that does it for you.\n- Adjust your editor's shell settings as needed for best results.\n\n---\n\n## What's New / What's Cool\n\n\n### CodexExorcism+ Release (Sept 2025)  \n\n- **CI/CD pipeline hardened**: full cross-platform test matrix (Ubuntu/macOS × Python 3.9–3.12) with integration tests + lint + shellcheck.\n- **Cross-platform verified**: tested on GitHub Actions `ubuntu-latest` and `macos-latest` runners across Python 3.9–3.12 (see `.github/workflows/ci.yml` for the current OS images).\n- **Regression protection**: added/strengthened newline preservation validation to prevent accidental line-collapsing failures.\n- **CLI/report consistency**: clarified and aligned filter vs file modes, output handling, and audit/report formatting.\n- **Scanner improvements**: improved anomaly detection and reporting accuracy; cleaner category breakdowns.\n- **Transform refinements**: tightened Unicode cleaning behavior while preserving text structure (EOL handling, whitespace normalization).\n- **Docs refresh**: README + CLI docs updated to better explain “clean mode vs audit mode” and the “forensics” use case.\n\n### CodexExorcism+ Release (Sept 2025)  \n\nThe follow-up release keeps the Unicode exorcism vibe but layers on early-stage semantics:  \n\n- **Semantic metrics preview** – opt into `--metrics` for entropy, diversity, repetition, and a heuristic AI-likeness score; it automatically switches into report mode.  \n- **Metrics legend on demand** – `--metrics-help` explains every stat plus the ↑/↓ hints.  \n- **Hook-friendly reporting** – `--exit-zero` means pre-commit hooks can flag anomalies without blocking your commit.  \n- **Slimmer all-in-one test harness** – `tests/test_all.sh` derives its run list from `data/`, handles STDIN/STDOUT quirks, and drops per-scenario diffs/word-count deltas.  \n\n\u003e *Fun fact*: Even Python will execute code with \"curly quotes.\" Your IDE, email client, and browser all sneak these in. UnicodeFix hunts them down and torches them, ...so your coding homework looks *lovingly hand-crafted* at 4:37 a.m., rather than LLM spawn.\n\n### Keep It Fresh\n\nPull requests/issues always welcome - especially if your AI friend slipped a new weird Unicode gremlin past me, I found a few more while preparing this release too...🙄\n\n---\n\n## Shortcut for macOS\n\nUnicodeFix ships with a macOS Shortcut for direct Finder integration.\n\nRight-click files, pick a Quick Action, and - bam - no terminal required.\n\n### To add the Shortcut\n\n1. Open the **Shortcuts** app.\n2. Choose `File -\u003e Import`.\n   ![Shortcuts App Menu](docs/Screenshot%202025-04-25%20at%2005.50.57.png)\n3. Select the Shortcut in `macOS/Strip Unicode.shortcut`.\n   ![Import Shortcut](docs/Screenshot%202025-04-25%20at%2005.51.54.png)\n4. Edit it to point to the `cleanup-text` executable in your active environment.\n   ![Edit Shortcut Script Path](docs/Screenshot%202025-04-25%20at%2005.07.47.png)\n5. Relaunch Finder (`Cmd+Opt+Esc` → select Finder → Relaunch) if needed.\n6. After setup, right-click files, choose `Quick Actions`, select `Strip Unicode`.\n   ![Select Shortcut File](docs/Screenshot%202025-04-25%20at%2005.47.51.png)\n\n---\n\n## What's in This Repository\n\n- [src/unicodefix/cli.py](src/unicodefix/cli.py) - CLI entry point\n- [src/unicodefix/transforms.py](src/unicodefix/transforms.py) - Unicode normalization logic\n- [src/unicodefix/scanner.py](src/unicodefix/scanner.py) - Audit/report scanner\n- [pyproject.toml](pyproject.toml) - Packaging metadata and dependency source of truth\n- [setup.sh](setup.sh) - Unified bootstrap/install script\n- [bin/uniclean.sh](bin/uniclean.sh) - Shell helper\n- [data/](data/) - Example test files\n- [tests/](tests/) - Automated test suite for features and regressions\n- [docs/](docs/) - Documentation and screenshots\n- [LICENSE](LICENSE)\n- [README.md](README.md) - This file\n\n---\n\n## Testing and CI/CD\n\nUnicodeFix comes with a full, automated test suite:\n\n- Drives every scenario against the canonical file list in `data/`\n- Writes diffs and normalized word-count summaries into `test_output/\u003cscenario\u003e/`\n- Run it with: `tests/test_all.sh`\n- Clean up with: `tests/test_all.sh clean`\n- STDIN/STDOUT coverage skips the binary fixtures (everything else still runs on them)\n- Plug into your CI/CD pipeline or just use it as a \"paranoia check\" before shipping anything\n\n**Pro tip:** Run the tests before you merge, publish, or email a \"final\" version.\n\nSee [docs/test-suite.md](docs/test-suite.md) for the deep dive.\n\n---\n\n## Contributing\n\nFeedback, bug reports, and patches welcome.\n\nIf you've got a better integration path for your favorite platform, let's make it happen.\nPull requests with attitude, creativity, and clean diffs appreciated.\n\n---\n\n## Support This and Other Projects\n\nIf UnicodeFix (or my other projects) saved your bacon or made you smile, please consider fueling my caffeine habit and indie dev obsession...\n\n- [Patreon](https://patreon.com/unixwzrd)\n- [Ko-Fi](https://ko-fi.com/unixwzrd)\n- [Buy Me a Coffee](https://buymeacoffee.com/unixwzrd)\n\nQuite a bit of effort goes into preparing these releases. *One coffee = one more tool released to the wild...*🤔\n\nThank you for keeping solo development alive!\n\n---\n\n## Changelog\n\n**See [CHANGELOG.md](CHANGELOG.md) for the latest drop.**\n\n---\n\n## License\n\nCopyright 2025  \n[unixwzrd@unixwzrd.ai](mailto:unixwzrd@unixwzrd.ai)\n\n[MIT License](LICENSE)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Funixwzrd%2Funicodefix","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Funixwzrd%2Funicodefix","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Funixwzrd%2Funicodefix/lists"}