A tool of its own
Encoding Checker

Broken accents.Organized diagnosis.

A tool of its own for investigating text-encoding problems in projects.

Finds and points to every broken accent in a project.

Desktop appUTF-8Personal

  • Tauri 2
  • Rust
  • React 18
  • TypeScript
A tool of its ownProject
scan
Occurrences
in context
Diagnostic
reports
Encoding Checker

Broken accents.Organized diagnosis.

A tool of its own for investigating text-encoding problems in projects.

  • Tauri 2
  • Rust
  • React 18
  • TypeScript

Finds and points to every broken accent in a project.

Desktop appUTF-8Personal

  • Tauri 2
  • Rust
  • React 18
  • TypeScript

PortfolioEncoding Checker

The problem

VEÍCULOS turned into VE?CULOS.

A broken accent is almost never a typo: it's a file saved in one character standard and read in another. On the outside the word just looks odd; inside, the bytes tell what happened. Pick a situation and tap or hover over the letters.

Four situations

LetterBytes in the file

What the program says

  • OKValid UTF-8. The Í takes two bytes (C3 8D), as it should.

Today's standard: every accented letter becomes two bytes, and any program reads it the same.

The bytes are the real ones for each standard; the messages follow the Rust core's checks (analyze_file).

Project scene: the program open on a laptop, with a magnifying glass and code icons

From file to context. See where to look.

Occurrences by file, line and column to support maintenance.

File, line and columnContext of each occurrenceFilters by severity

A project has hundreds of files, and the broken accent can be in any of them. The program reads them all and hands over the list: which are fine, which need attention and, in each one, the line, the column and the surrounding text, so you go straight to the spot.

  • Character standard: windows-1252Line ending: CRLF

    1. 12 <label>Ve�culo</label>FFFD_REPLACEMENTLine 12 · column 18
    2. 27 placeholder="Endere�o"FFFD_REPLACEMENTLine 27 · column 23

The report comes in three formats

# HUNT Encoding Checker - Report

**Scan Date:** 2026-10-16 15:42:07

**Path:** D:/Projetos/loja-exemplo

**Total:** 6 files | **Critical:** 3 | **Warning:** 1 | **OK:** 1

---

## src/pages/cadastro.tsx [CRITICAL]

- Encoding: windows-1252
- BOM: No
- Line ending: CRLF

| Line | Type | Context |
|------|------|---------|
| 12 | FFFD_REPLACEMENT |   <label>Ve�culo</label> |
| 27 | FFFD_REPLACEMENT |   placeholder="Endere�o" |

The files are examples. The occurrence types, severities and report format are the ones in the code (analyze_file and export_report_md); the report's text is in English, as in the program.

The safety net

Before touching it, a copy.

Fixing project files is scary: what if it gets worse? That's why the program requires a backup folder. Before any fix it copies the files into a folder with date and time and writes a manifest of where each one came from. If you don't like the result, one click puts everything back.

Pick the fixes

Saved copies

  1. _manifest.json

    {
      "id": "snapshot-20261014-092611",
      "timestamp": "2026-10-14 09:26:11",
      "files": [
        { "original_path": "D:/Projetos/loja-exemplo/src/pages/cadastro.tsx",
          "backup_name": "D__Projetos_loja-exemplo_src_pages_cadastro.tsx" },
        { "original_path": "D:/Projetos/loja-exemplo/README.md",
          "backup_name": "D__Projetos_loja-exemplo_README.md" }
      ]
    }

The folder and manifest names are the ones the program writes (create_snapshot); the fixes are those in apply_corrections. The backup folder is required to fix.

Project scene: the compare-folders screen and two glass folders side by side

Desktop tool

A tool of its own. A lighter routine.

Built in-house to support the quality of the projects.

ReportsEncoding
comparison
Assisted
fixes

After fixing, the question is: did it work? The program puts the original folder and the fixed one side by side and points out, file by file, what changed in the character standard, where the diamond disappeared and what exists on only one side.

5 differences in 7 files

Original folderloja-exemplo/Fixed folderloja-exemplo-corrigida/
src/pages/cadastro.tsxwindows-1252�Standard changedsrc/pages/cadastro.tsxUTF-8
docs/manual.txtUTF-8�Diamond gonedocs/manual.txtUTF-8
README.mdUTF-8 BOMStandard changedREADME.mdUTF-8
src/styles/tema.cssASCIISamesrc/styles/tema.cssASCII
src/utils/log.tsUTF-8Samesrc/utils/log.tsUTF-8
notas-antigas.txtUTF-8Only in original—
—Only in fixeddocs/changelog.mdUTF-8

The comparison looks at each file's detected character standard, replacement character and size (compare_directories); it doesn't check the text line by line. The folders are examples.

What it reads

Reads what's text, skips the dead weight.

A project folder carries a lot nobody wrote by hand: downloaded libraries, built versions, history. The program runs the folder through a sieve: it reads text and code file types and skips the heavy folders that would only slow the scan down.

A project folderSkipped

  • .ts
  • node_modules
  • .tsx
  • .next
  • .js
  • .git
  • .jsx
  • dist
  • .html
  • build
  • .css
  • .cache
  • .md
  • .vercel
  • .json
  • .turbo
  • .sql
  • coverage
  • .prisma
  • __pycache__
  • .env
  • target
  • .txt
  • .svn
  • .yml
  • .hg
  • .yaml

Read

  • 14file types read
  • 13folders skipped by name
  • 12Rust core functions

Folders whose name starts with { are left out too. Before reading, the program counts how many files it will look at.

The lists are the core's (SCAN_EXTENSIONS and EXCLUDED_DIRS in main.rs); the functions, those in generate_handler.

The technologies

What it is made of, piece by piece

A desktop program that reads projects byte by byte: the screen is React inside Tauri 2, and the Rust core walks the folders, estimates the character standard, points to each occurrence and keeps the copies. Pick a piece to see what it does here and which file it is in.

14technologies, in 3 layers

Screen

Window and core

Reading the files