A lightweight Unicode character map viewer built with PyQt6 — no dependencies beyond Qt itself.
Browse all 1,114,112 code points across all 17 Unicode planes (U+0000 – U+10FFFF) in a fast, scrollable 16-column grid. Characters are rendered on demand by a virtual model, so the table stays responsive regardless of how large the covered range is. Double-click any glyph to collect it in the text box below, then copy the whole string to the clipboard in one click.
-
Full Unicode coverage — all 1,114,112 code points across all 17 planes (
U+0000–U+10FFFF) -
Virtual rendering — only visible rows are drawn at any time; no pre-allocation of cell objects
-
Plane / block dropdown — snap instantly to any Unicode plane or notable block (CJK, Emoji, Arabic, etc.)
-
Jump to character — paste a glyph or enter a hex code point (e.g.
1F600) and press Enter -
Glyph collector — double-click cells to build up a string in the text box
-
Copy / Clear — one-click clipboard copy and field clear
-
Ctrl + F keyboard shortcut to focus the search bar from anywhere in the window
| Dependency | Version | Notes |
|---|---|---|
| Python | ≥ 3.10 | |
| PyQt6 | ≥ 6.4 | |
| Noto Sans | any | Optional, but recommended — see note below. |
Font note: the grid uses Noto Sans as its primary face because it covers a far wider range of scripts than most system defaults. If Noto Sans is not installed Qt will fall back to the system sans-serif, which will show tofu □ for many code points.
-
#!/usr/bin/env sh sudo apt install fonts-noto -
#!/usr/bin/env sh sudo dnf install google-noto-sans-fonts -
#!/usr/bin/env sh sudo pacman -S noto-fonts
-
#!/usr/bin/env sh git clone https://github.com/scarlion1/qtcharmap.git && \ cd qtcharmap
-
-
#!/usr/bin/env sh python -m venv .venv -
-
#!/usr/bin/env sh source .venv/bin/activate
-
#!/usr/bin/env pwsh & .venv\Scripts\activate
-
-
-
#!/usr/bin/env sh pip install PyQt6
#!/usr/bin/env sh
python qtcharmap.py| Shortcut | Action |
|---|---|
| Ctrl + F | Focus the search bar |
| Enter (search bar) | Jump to the entered character |
| Double-click cell | Insert glyph at cursor in collector box |
Characters are arranged in a table with 16 columns (0 – F):
-
The row header shows the Unicode block start address (e.g.
U+0060). -
The column headers show the low hex nibble
0–F.
So the cell at row U+0060, column 5 contains U+0065 → e.
Non-printable code points (control characters, lone surrogates, unassigned blocks) are left blank.
The table covers all 17 Unicode planes:
| Planes | Range | Contents |
|---|---|---|
| 0 (BMP) | U+0000 – U+FFFF |
Almost all modern scripts, symbols, CJK |
| 1 (SMP) | U+10000 – U+1FFFF |
Historic scripts, emoji, musical symbols |
| 2 (SIP) | U+20000 – U+2FFFF |
Rare/classical CJK ideographs |
| 3 (TIP) | U+30000 – U+3FFFF |
Oracle Bone script, CJK Extension I |
| 4–13 | U+40000 – U+DFFFF |
Unassigned (reserved for future use) |
| 14 (SSP) | U+E0000 – U+EFFFF |
Language tags, variation selectors |
| 15–16 (PUA) | U+F0000 – U+10FFFF |
Private use (icon fonts, custom applications) |
The plane / block dropdown lets you snap directly to any of these ranges without scrolling.
You can add Qt Character Map to your application launcher with a .desktop file. This works as-is if PyQt6 is installed system-wide (e.g. via your distro's package manager such as python3-pyqt6). See below for suggestions with a virtual env.
-
#!/usr/bin/env sh chmod +x /path/to/qtcharmap.py -
-
#!/usr/bin/env sh ln -s /path/to/qtcharmap.py ~/.local/bin/qtcharmap.py
-
#!/usr/bin/env sh ln -s /path/to/qtcharmap.py /usr/local/bin/qtcharmap.py
-
-
-
#!/usr/bin/env sh touch $HOME/.local/share/applications/qtcharmap.desktop
-
#!/usr/bin/env sh touch /usr/local/share/applications/qtcharmap.desktop
-
…with content:
[Desktop Entry]
Type=Application
Name=Pure Qt Character Map
Comment=Inline-searching alternative character grid
Exec=qtcharmap.py
Icon=accessories-character-map
Terminal=false
Categories=Utility;Accessibility;Qt;
Keywords=character;map;unicode;font;glyphs;Point Exec= at your venv's own interpreter:
Exec=/path/to/your/venv/bin/python /path/to/qtcharmap.pyReplace the paths with wherever your venv and script actually live. Absolute paths are required; ~ and $HOME are not expanded in Exec= lines.