This library is mainly for CLI programs that carefully produce output for Terminals.
The stable version of this package is maintained on pypi, install or upgrade, using pip:
pip install --upgrade wcwidth
As of Python 3.15, all string-formatting functions, textwrap.wrap(), str.ljust(), str.rjust(), and str.center() incorrectly measure the displayed width of a string as equal to the number of codepoints.
Some examples of incorrect results:
>>> # result consumes 16 total cells, 11 expected,
>>> 'コンニチハ'.rjust(11, 'X')
'XXXXXXコンニチハ'
>>> # result consumes 5 total cells, 6 expected,
>>> 'café'.center(6, 'X')
'caféX'
>>> # result consumes 2 total cells, 4 expected.
>>> print('👨👩👧'.center(4, 'X'))
👨👩👧The base of this library is POSIX.1-2001 and POSIX.1-2008 functions wcwidth(3) and wcswidth(3)
which this python module's functions precisely copy by interface as wcwidth() and wcswidth(),
and are brought up-to-date to support the latest unicode releases.
You may find that support varies for complex unicode sequences or codepoints.
A companion utility, jquast/ucs-detect was authored to gather and publish the results of Wide character support and version level, language support, zero-width joiner, and variation-16 support as a General Tabulated Summary by terminal emulator software and version.
A brief overview, through examples, for all of the public API functions.
Full API Documentation at https://wcwidth.readthedocs.io
Measures width of a single codepoint,
>>> # '♀' narrow emoji
>>> wcwidth.wcwidth('\u2640')
1Use function wcwidth() to determine the length of a single unicode character.
See Specification of character measurements. More
briefly, return values of function wcwidth() are:
-1- Indeterminate (not printable) control codes (C0 and C1).
0- Does not advance the cursor, such as NULL or Combining.
2- Characters of category East Asian Wide (W) or East Asian Full-width (F) which are displayed using two terminal cells.
1- All others.
Measures width of a string, returns -1 for control codes.
>>> # '♀️' emoji w/vs-16
>>> wcwidth.wcswidth('♀️')
2Use function wcswidth() to determine the length of many, a string of unicode characters
See Specification of character measurements. More briefly, return
values of function wcswidth() is the sum of wcwidth() with some additional account for some
kinds of sequences. Similarly, -1 is returned if control codes occurs anywhere in the string.
Install wcwidth in editable mode:
pip install -e .
Execute all code generation, autoformatters, linters and unit tests using tox:
tox
Or execute individual tasks, see tox -lv for all available targets:
tox -e pylint,py36,py314
Regenerate python code tables from latest Unicode Specification data files:
tox -e update
The script is located at bin/update-tables.py, requires Python 3.9 or
later. It is recommended but not necessary to run this script with the newest
Python, because the newest Python has the latest unicodedata for generating
comments.
This project is using sphinx 4.5 to build documentation:
tox -e sphinx
The output will be in docs/_build/html/.
This project is using pip-tools to manage requirements.
To upgrade requirements for updating unicode version, run:
tox -e update_requirements_update
To upgrade requirements for testing, run:
tox -e update_requirements38,update_requirements39
To upgrade requirements for building documentation, run:
tox -e update_requirements_docs
Supplementary tools for browsing and testing terminals for wide unicode
characters are found in the bin/ of this project's source code. Just ensure
to first pip install -r requirements-develop.txt from this projects main
folder. For example, an interactive browser for testing:
python ./bin/wcwidth-browser.py
This library is used in:
- jquast/blessed: a thin, practical wrapper around terminal capabilities in Python.
- prompt-toolkit/python-prompt-toolkit: a Library for building powerful interactive command lines in Python.
- dbcli/pgcli: Postgres CLI with autocompletion and syntax highlighting.
- thomasballinger/curtsies: a Curses-like terminal wrapper with a display based on compositing 2d arrays of text.
- selectel/pyte: Simple VTXXX-compatible linux terminal emulator.
- astanin/python-tabulate: Pretty-print tabular data in Python, a library and a command-line utility.
- rspeer/python-ftfy: Fixes mojibake and other glitches in Unicode text.
- nbedos/termtosvg: Terminal recorder that renders sessions as SVG animations.
- peterbrittain/asciimatics: Package to help people create full-screen text UIs.
- python-cmd2/cmd2: A tool for building interactive command line apps
- stratis-storage/stratis-cli: CLI for the Stratis project
- ihabunek/toot: A Mastodon CLI/TUI client
- saulpw/visidata: Terminal spreadsheet multitool for discovering and arranging data
- jquast/ucs-detect: Utility for unicode support detection.
There are similar implementations of the wcwidth() and wcswidth() functions in other languages.
- timoxley/wcwidth: JavaScript
- janlelis/unicode-display_width: Ruby
- alecrabbit/php-wcwidth: PHP
- Text::CharWidth: Perl
- bluebear94/Terminal-WCWidth: Perl 6
- mattn/go-runewidth: Go
- grepsuzette/wcwidth: Haxe
- aperezdc/lua-wcwidth: Lua
- joachimschmidt557/zig-wcwidth: Zig
- fumiyas/wcwidth-cjk: LD_PRELOAD override
- joshuarubin/wcwidth9: Unicode version 9 in C
- spectreconsole/wcwidth: C#
- 0.2.14 2025-09-22
- 0.2.13 2024-01-06
- Bugfix zero-width support for Hangul Jamo (Korean)
- 0.2.12 2023-11-21
- Bugfix Re-release to remove .pyi files misplaced in wheel Issue #101.
- 0.2.11 2023-11-20
- 0.2.10 2023-11-13
- Bugfix accounting of some kinds of emoji sequences using U+FE0F Variation Selector 16 (PR #97).
- Updated Specification.
- 0.2.9 2023-10-30
- Bugfix zero-width characters used in Emoji ZWJ sequences, Balinese, Jamo, Devanagari, Tamil, Kannada and others (PR #91).
- Updated to include Specification of character measurements.
- 0.2.8 2023-09-30
- Include requirements files in the source distribution (PR #82).
- 0.2.7 2023-09-28
- Updated tables to include Unicode Specification 15.1.0.
- Include
bin,docs, andtox.iniin the source distribution
- 0.2.6 2023-01-14
- Updated tables to include Unicode Specification 14.0.0 and 15.0.0.
- Changed developer tools to use pip-compile, and to use jinja2 templates for code generation in bin/update-tables.py to prepare for possible compiler optimization release.
- 0.2.1 .. 0.2.5 2020-06-23
- Repository changes to update tests and packaging issues, and begin tagging repository with matching release versions.
- 0.2.0 2020-06-01
- Enhancement: Unicode version may be selected by exporting the
Environment variable
UNICODE_VERSION, such as13.0, or6.3.0. See the jquast/ucs-detect CLI utility for automatic detection. - Enhancement: API Documentation is published to readthedocs.io.
- Updated tables for all Unicode Specifications with files published in a programmatically consumable format, versions 4.1.0 through 13.0
- Enhancement: Unicode version may be selected by exporting the
Environment variable
- 0.1.9 2020-03-22
- Performance optimization by Avram Lubkin, PR #35.
- Updated tables to Unicode Specification 13.0.0.
- 0.1.8 2020-01-01
- Updated tables to Unicode Specification 12.0.0. (PR #30).
- 0.1.7 2016-07-01
- Updated tables to Unicode Specification 9.0.0. (PR #18).
- 0.1.6 2016-01-08 Production/Stable
LICENSEfile now included with distribution.
- 0.1.5 2015-09-13 Alpha
- Bugfix: Resolution of "combining character width" issue, most especially those that previously returned -1 now often (correctly) return 0. resolved by Philip Craig via PR #11.
- Deprecated:
The module path
wcwidth.table_combis no longer available, it has been superseded by module pathwcwidth.table_zero.
- 0.1.4 2014-11-20 Pre-Alpha
- Feature:
wcswidth()now determines printable length for (most) combining characters. The developer's tool bin/wcwidth-browser.py is improved to display combining characters when provided the--combiningoption (Thomas Ballinger and Leta Montopoli PR #5). - Feature: added static analysis (prospector) to testing framework.
- Feature:
- 0.1.3 2014-10-29 Pre-Alpha
- Bugfix: 2nd parameter of wcswidth was not honored. (Thomas Ballinger, PR #4).
- 0.1.2 2014-10-28 Pre-Alpha
- Updated tables to Unicode Specification 7.0.0. (Thomas Ballinger, PR #3).
- 0.1.1 2014-05-14 Pre-Alpha
- Initial release to pypi, Based on Unicode Specification 6.3.0
This code was originally derived directly from C code of the same name, whose latest version is available at https://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c:
* Markus Kuhn -- 2007-05-26 (Unicode 5.0) * * Permission to use, copy, modify, and distribute this software * for any purpose and without fee is hereby granted. The author * disclaims all warranties with regard to this software.