Skip to main content

Downloads codecov.io Code Coverage MIT License

Introduction

This Python and C11 library is mainly for CLI/TUI programs that carefully produce output for Terminals. This page is about the Python library, see libwcwidth for the portable C11 library.

Installation

The stable version of this package is maintained on pypi, install or upgrade, using pip:

pip install --upgrade wcwidth

Problem

All Python 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 their codepoints.

Some examples of incorrect results:

>>> # result consumes 16 total cells, 11 expected,
>>> 'コンニチハ'.rjust(11, 'X')
'XXXXXXコンニチハ'

>>> # combining acute accent: result consumes 5 total cells, 6 expected,
>>> 'cafe\u0301'.center(6, 'X')
'caféX'

Solution

The lowest-level functions in this library are derived from POSIX.1-2001 and POSIX.1-2008 wcwidth(3) and wcswidth(3), which this library precisely copies by interface as wcwidth() and wcswidth(). These functions return -1 when C0 and C1 control codes are present.

An easy-to-use width() function is provided as a wrapper of wcswidth() that is also capable of measuring most terminal control codes and sequences, like colors, bold, tabstops, and horizontal cursor movement. width() argument term_program may provide more accurate terminal measurement Corrections as a wrapper of wcstwidth().

Text-justification is solved by the sequence-aware functions ljust(), rjust(), center(), and the grapheme-aware function wrap(), serving as drop-in replacements to python standard functions.

The clip() function extracts substrings by their displayed column positions, and strip_sequences() removes terminal escape sequences from text altogether.

The iterator functions iter_graphemes() and iter_sequences() allow for careful navigation of grapheme and terminal control sequence boundaries as required by editors or REPLs with cursor control. iter_graphemes_reverse() and grapheme_boundary_before() are necessary for backward cursor control over complex unicode.

Discrepancies

You may find that support varies for complex unicode sequences or codepoints.

This library may be considered to presume the terminal is enabled for DEC Private Mode 2027 (“Grapheme Clustering”) by default, which may require to be enabled by a TUI application but is often the default mode for those terminals that support it.

This library does support any specific “legacy width” measurement by API, but it does provide Corrections for those terminals without grapheme support.

See also:

The jquast/ucs-detect project publishes automatic results of compliance to our standard for Wide character, Languages, grapheme clustering, complex or combining scripts, emojis, zero-width joiner, variations, and regional indicator (flags) as a General Tabulated Summary by terminal emulator software and version. The results of the ucs-detect project create our correction tables.

Overview

A brief overview, through examples, for all of the public API functions.

Full API Documentation at https://wcwidth.readthedocs.io/en/latest/api.html

wcwidth()

Measures width of a single codepoint,

>>> # '♀' narrow emoji
>>> wcwidth.wcwidth('\u2640')
1

Use function wcwidth() to determine the length of a single unicode character.

See specification of character measurements. Note that -1 is returned for control codes.

wcswidth()

Measures width of a string, returns -1 for control codes.

>>> # '♀️' emoji w/vs-16
>>> wcwidth.wcswidth('\u2640\ufe0f')
2

Use function wcswidth() to determine the length of many, a string of unicode characters.

See specification of character measurements. Note that -1 is returned if control codes occurs anywhere in the string.

wcstwidth()

Same behavior as wcswidth() with automatic terminal-specific Corrections, reading TERM_PROGRAM or TERM when True (default), or caller can provide terminal query XTVERSION or ENQ response:

>>> # '♀️' emoji w/vs-16, uncorrected:
>>> wcwidth.wcswidth('\u2640\ufe0f')
2
>>> # corrected,
>>> wcwidth.wcstwidth('\u2640\ufe0f', term_program='vte')
1

width()

Use function width() to measure a string with improved handling of control_codes and measurement Corrections through term_program:

>>> # same support as wcswidth(), eg. regional indicator flag:
>>> wcwidth.width('\U0001F1FF\U0001F1FC')
2
>>> # set term_program=True to use wcstwidth()
>>> wcwidth.width('\U0001F1FF\U0001F1FC', term_program=True)
1
>>> # or set term_program for measurement of a specific terminal
>>> wcwidth.width('\U0001F1FF\U0001F1FC', term_program='contour')
2
>>> # but also supports sequences, like SGR colored text, "WARN", followed by reset
>>> wcwidth.width('\x1b[38;2;255;150;100mWARN\x1b[0m')
4
>>> # tabs are measured as though the string begins at a tabstop,
>>> wcwidth.width('\t', tabsize=4)
4
>>> # or, all control characters can be ignored (including tab)
>>> wcwidth.width('\t\n\a\r', control_codes='ignore')
0
>>> # sequences with "indeterminate" effects like Home + Clear are zero-width
>>> wcwidth.width('\x1b[H\x1b[2J')
0
>>> # horizontal cursor movements are parsed,
>>> wcwidth.width('hello\b\b\b\b\bworld')
5
>>> wcwidth.width('hello\x1b[5Dworld')
5
>>> # or ignored,
>>> wcwidth.width('hello\x1b[5Dworld', control_codes='ignore')
10
>>> # Measure width of text using kitty text sizing protocol (OSC 66),
>>> width('\x1b]66;w=2;XY\x07')
2
>>> # Scaled text sizing: each grapheme occupies 'scale' cells
>>> width('\x1b]66;s=2;ABC\x07')
6

Use control_codes='ignore' when the input is known not to contain any control characters or terminal sequences for slightly improved performance. Note that TAB ('\t') is a control character and is also ignored, you may want to use str.expandtabs(), first.

Use control_codes='strict' when input is known to contain some control sequences, such as SGR color, bold, hyperlinks and cursor movement. Any sequence that cannot be accurately parsed for horizontal measurement, such as clearing the screen, vertical, or absolute cursor movement will raise ValueError:

>>> # or, raise ValueError for "indeterminate" effects using control_codes='strict'
>>> wcwidth.width('\n', control_codes='strict')
Traceback (most recent call last):
...
ValueError: Vertical movement character 0xa at position 0


>>> wcwidth.width('\x1b[H\x1b[2J', control_codes='strict')
Traceback (most recent call last):
...
ValueError: Indeterminate cursor sequence at position 0, '\x1b[H'


>>> # cursor left movement beyond string start raises in strict mode,
>>> wcwidth.width('a\x1b[5Da', control_codes='strict')
Traceback (most recent call last):
...
ValueError: Cursor left movement at position 1 would move 5 cells left from column 1, exceeding string start

iter_sequences()

Iterates through text, segmented by terminal sequence,

>>> list(wcwidth.iter_sequences('hello'))
[('hello', False)]
>>> list(wcwidth.iter_sequences('\x1b[31mred\x1b[0m'))
[('\x1b[31m', True), ('red', False), ('\x1b[0m', True)]

Use iter_sequences() to split text into segments of plain text and escape sequences. Each tuple contains the segment string and a boolean indicating whether it is an escape sequence (True) or text (False).

iter_graphemes()

Use iter_graphemes() to iterate over grapheme clusters of a string.

>>> from wcwidth import iter_graphemes
>>> # ok + Regional Indicator 'Z', 'W' (Zimbabwe)
>>> list(wcwidth.iter_graphemes('ok\U0001F1FF\U0001F1FC'))
['o', 'k', '🇿🇼']

>>> # cafe + combining acute accent
>>> list(wcwidth.iter_graphemes('cafe\u0301'))
['c', 'a', 'f', 'é']

>>> # ok + Emoji Man + ZWJ + Woman + ZWJ + Girl
>>> list(wcwidth.iter_graphemes('ok\U0001F468\u200D\U0001F469\u200D\U0001F467'))
['o', 'k', '👨\u200d👩\u200d👧']

A grapheme cluster is what a user perceives as a single character, even if it is composed of multiple Unicode codepoints. This function implements Unicode Standard Annex #29 grapheme cluster boundary rules.

ljust()

Use ljust() as replacement of str.ljust():

>>> 'コンニチハ'.ljust(11, '*')             # don't do this
'コンニチハ******'
>>> wcwidth.ljust('コンニチハ', 11, '*')    # do this!
'コンニチハ*'

rjust()

Use rjust() as replacement of str.rjust():

>>> 'コンニチハ'.rjust(11, '*')             # don't do this
'******コンニチハ'
>>> wcwidth.rjust('コンニチハ', 11, '*')    # do this!
'*コンニチハ'

center()

Use center() as replacement of str.center():

>>> 'cafe\u0301'.center(6, '*')             # don't do this
'café*'
>>> wcwidth.center('cafe\u0301', 6, '*')
'*café*'                                    # do this!

wrap()

Use function wrap() to wrap text containing terminal sequences, Unicode grapheme clusters, and wide characters to a given display width.

>>> from wcwidth import wrap
>>> # Basic wrapping
>>> wrap('hello world', 5)
['hello', 'world']

>>> # Wrapping CJK text (each character is 2 cells wide)
>>> wrap('コンニチハ', 4)
['コン', 'ニチ', 'ハ']

>>> # Text with ANSI color sequences - SGR codes are propagated by default
>>> # Each line ends with reset, next line starts with restored style
>>> wrap('\x1b[1;31mhello world\x1b[0m', 5)
['\x1b[1;31mhello\x1b[0m', '\x1b[1;31mworld\x1b[0m']

clip()

Use clip() to extract a substring by column positions, preserving terminal sequences.

>>> from wcwidth import clip
>>> # Wide characters split to Narrow boundaries using fillchar=' '
>>> clip('中文字', 0, 3)
'中 '
>>> clip('中文字', 1, 5, fillchar='.')
'.文.'

>>> # 'end' defaults to -1, meaning "to the end of the line"
>>> clip('中文字', 1)
' 文字'
>>> clip('\x1b[1;31mHello world\x1b[0m', 6)
'\x1b[1;31mworld\x1b[0m'

>>> # SGR codes are propagated by default - result begins with active style
>>> # and ends with reset if styles are active
>>> clip('\x1b[1;31mHello world\x1b[0m', 6, 11)
'\x1b[1;31mworld\x1b[0m'

>>> # Disable SGR propagation to preserve sequence order outside of clip boundary
>>> clip('\x1b[31m中文\x1b[32m', 0, 3, propagate_sgr=False)
'\x1b[31m中 \x1b[32m'

>>> # Cursor-left overwrites previous text (painter's algorithm)
>>> clip('hello\x1b[2DXY', 0, 5)
'helXY'
>>> # Carriage return resets to column 0, overwriting earlier cells
>>> clip('abc\rXY', 0, 5)
'XYc'

>>> # even OSC 8 hyperlink text may be clipped, 'Click This link' -> 'is link' !
>>> clip('\x1b]8;;http://example.com\x07Click This link\x1b]8;;\x07', 8, 15)
'\x1b]8;;http://example.com\x07is link\x1b]8;;\x07'

>>> # and OSC 66 kitty text sizing, supporting width and scale, 'Look' -> '...ook'
>>> clip('\x1b]66;w=4:s=4;Look\x07', 1, 16, fillchar='.')
'...\x1b]66;s=4:w=3;ook\x07'

Use overtyping=False when the input is known not to contain any cursor movement characters (\b, \r, CSI C, CSI D, CSI G) for improved performance. When overtyping=None (default), a slower “Painter’s algorithm” may be used after testing for the presence of these characters. overtyping has no effect when control_codes='ignore'.

strip_sequences()

Use strip_sequences() to remove all terminal escape sequences from text.

>>> from wcwidth import strip_sequences
>>> strip_sequences('\x1b[31mred\x1b[0m')
'red'

Ambiguous Width

Some Unicode characters have “East Asian Ambiguous” (A) width. These characters display as 1 cell by default, matching Western terminal contexts, but many CJK (Chinese, Japanese, Korean) environments may have a preference for 2 cells. This is often found as boolean option, “Ambiguous width as wide” in Terminal Emulator software preferences.

The ambiguous_width parameter is available on all width-measuring functions: wcwidth(), wcswidth(), width(), ljust(), rjust(), center(), wrap(), and clip().

By default, wcwidth treats ambiguous characters as narrow (width 1). For CJK environments where your terminal is configured to display ambiguous characters as double-width, pass ambiguous_width=2:

>>> # CIRCLED DIGIT ONE - ambiguous width
>>> wcwidth.width('\u2460')
1
>>> wcwidth.width('\u2460', ambiguous_width=2)
2

Terminal Detection

The most reliable method to detect whether a terminal profile is set for “Ambiguous width as wide” mode is to display an ambiguous character surrounded by a pair of Cursor Position Report (CPR) queries with a terminal in cooked or raw mode, and to parse the responses for their (y, x) locations and measure the difference x.

This code should also be careful to check whether it is attached to a terminal and be careful of possible timeout, slow network, or non-response when working with “dumb terminals” like a CI build.

jquast/blessed library provides such a helping Terminal.detect_ambiguous_width() method:

>>> import blessed, functools
>>> # Detect terminal ambiguous width as wide (2) or narrow (1)
>>> ambiguous_width = blessed.Terminal().detect_ambiguous_width()
>>> # Define a new 'width' function with this argument
>>> awidth = functools.partial(wcwidth.width, ambiguous_width=ambiguous_width)
>>> # result depends on attached terminal mode
>>> awidth('\u2460')
1

Corrections

Corrections may be automatically applied depending on the detected or given terminal software name beginning with wcwidth release 0.8.0. This allows to correct widths for terminal software that differs from the python wcwidth specification. These corrections are sourced from the jquast/ucs-detect project.

The term_program parameter is available on all width-measuring functions: wcstwidth(), width(), ljust(), rjust(), center(), wrap(), and clip().

wcstwidth() defaults to term_program=True, auto-detecting the terminal from the TERM_PROGRAM or TERM environment variable. All other functions default to term_program=False, disabling corrections. Use term_program=True for automatic detection by environment values of TERM and TERM_PROGRAM.

# VTE terminals (Gnome Terminal Et al.) still render trigrams as narrow (1 cell), but their
# definition was changed to wide in Unicode 16 (September 2024).
>>> wcwidth.wcswidth('\u2630')
2
>>> wcwidth.wcstwidth('\u2630', term_program='vte')
1

# account for Alacritty non-support of emoji ZWJ:
# man + ZWJ + woman + ZWJ + girl + ZWJ + boy
>>> family = '\U0001F468\u200D\U0001F469\u200D\U0001F467\u200D\U0001F466'
>>> wcwidth.wcswidth(family)
2
>>> wcwidth.wcstwidth(family, term_program='alacritty')
8

Only detectable terminals are included: those that identify themselves by XTVERSION, ENQ, any TERM_PROGRAM or a unique TERM environment value. For the most accurate correction tables, query the terminal’s software version via XTVERSION (CSI > q) using a higher-level interactive terminal library like jquast/blessed:

>>> import blessed, wcwidth
>>> term = blessed.Terminal()
>>> sw_ver = term.get_software_version()
>>> print(sw_ver)
SoftwareVersion(name='VTE', version='7600')
>>> wcwidth.width('\u2630', term_program=sw_ver.name)
1

This is important because TERM_PROGRAM is not forwarded for remote hosts, like SSH, and many terminals may only be identified using XTVERSION or ENQ. Use list_term_programs() to see all recognized names:

>>> wcwidth.list_term_programs()
('absolutetelnet/ssh', 'alacritty', 'apple_terminal', 'bobcat', 'contour',
 'extraterm', 'foot', 'ghostty', 'hyper', 'iterm.app', 'iterm2', 'kitty',
 'konsole', 'mintty', 'mlterm', 'pterm', 'putty', 'rio', 'rxvt',
 'rxvt-unicode-256color', 'st', 'st-256color', 'tabby', 'terminology',
 'urxvt', 'vscode', 'vte', 'warp', 'warpterminal', 'wezterm', 'xterm',
 'xterm-ghostty', 'xterm-kitty', 'xterm.js')

term_program=False (the default for width(), ljust(), rjust(), center(), wrap(), and clip()) disables terminal corrections.

For automatic tests and other purposes that require cross-environment consistency, set static values or unset TERM and TERM_PROGRAM environment values, such as in conftest.py with pytest:

@pytest.fixture(autouse=True)
def _clear_term_program():
    """unset TERM/TERM_PROGRAM before each test."""
    saved_term = os.environ.pop('TERM', None)
    saved_tprog = os.environ.pop('TERM_PROGRAM', None)
    yield
    if saved_term is not None:
        os.environ['TERM'] = saved_term
    if saved_tprog is not None:
        os.environ['TERM_PROGRAM'] = saved_tprog

More documentation

Developer documentation, for building and contributing to this project, at https://wcwidth.readthedocs.io/en/latest/developing.html

Projects using wcwidth, and implementations in other languages, at https://wcwidth.readthedocs.io/en/latest/related.html

Release files for wcwidth 0.9.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for wcwidth 0.9.0
File Size Uploaded
wcwidth-0.9.0.tar.gz 952.7 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for wcwidth 0.9.0
File
wcwidth-0.9.0-py3-none-any.whl Python 3 none any Details
wcwidth-0.9.0-cp314-cp314t-win_arm64.whl CPython 3.14 CPython 3.14 free-threading Windows ARM64 Details
wcwidth-0.9.0-cp314-cp314t-win_amd64.whl CPython 3.14 CPython 3.14 free-threading Windows x86-64 Details
wcwidth-0.9.0-cp314-cp314t-win32.whl CPython 3.14 CPython 3.14 free-threading Windows x86-32 Details
wcwidth-0.9.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl CPython 3.14 CPython 3.14 free-threading Linux glibc 2.17+ x86-64 Details
wcwidth-0.9.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl CPython 3.14 CPython 3.14 free-threading Linux glibc 2.17+ ARM64 Details
wcwidth-0.9.0-cp314-cp314t-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl CPython 3.14 CPython 3.14 free-threading Linux glibc 2.17+ x86-32, Linux glibc 2.5+ x86-32 Details
wcwidth-0.9.0-cp314-cp314t-macosx_11_0_arm64.whl CPython 3.14 CPython 3.14 free-threading macOS 11.0+ ARM64 Details
wcwidth-0.9.0-cp314-cp314t-macosx_10_15_x86_64.whl CPython 3.14 CPython 3.14 free-threading macOS 10.15+ x86-64 Details
wcwidth-0.9.0-cp310-abi3-win_arm64.whl CPython 3.10 abi3 Windows ARM64 Details
wcwidth-0.9.0-cp310-abi3-win_amd64.whl CPython 3.10 abi3 Windows x86-64 Details
wcwidth-0.9.0-cp310-abi3-win32.whl CPython 3.10 abi3 Windows x86-32 Details
wcwidth-0.9.0-cp310-abi3-musllinux_1_2_x86_64.whl CPython 3.10 abi3 Linux musl 1.2+ x86-64 Details
wcwidth-0.9.0-cp310-abi3-musllinux_1_2_i686.whl CPython 3.10 abi3 Linux musl 1.2+ x86-32 Details
wcwidth-0.9.0-cp310-abi3-musllinux_1_2_aarch64.whl CPython 3.10 abi3 Linux musl 1.2+ ARM64 Details
wcwidth-0.9.0-cp310-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl CPython 3.10 abi3 Linux glibc 2.17+ x86-64 Details
wcwidth-0.9.0-cp310-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl CPython 3.10 abi3 Linux glibc 2.17+ ARM64 Details
wcwidth-0.9.0-cp310-abi3-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl CPython 3.10 abi3 Linux glibc 2.17+ x86-32, Linux glibc 2.5+ x86-32 Details
wcwidth-0.9.0-cp310-abi3-macosx_11_0_arm64.whl CPython 3.10 abi3 macOS 11.0+ ARM64 Details
wcwidth-0.9.0-cp310-abi3-macosx_10_9_x86_64.whl CPython 3.10 abi3 macOS 10.9+ x86-64 Details

Total release size: 14.1 MB

Release files / wcwidth-0.9.0.tar.gz

Download URL wcwidth-0.9.0.tar.gz
Size 952.7 kB
Tags Source
SHA-256 checksum
How to use checksums
1e9eb9dec86e14e4aa4b877bcf6763f245803c9b08d10f2d72ffae1aa06bbf16
BLAKE2b-256 checksum
How to use checksums
90be0553582644877cc0a46ab505266055c8af0032c9ad5cfd7e35398c8af2a6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.15.0rc2

Release files / wcwidth-0.9.0-py3-none-any.whl

Download URL wcwidth-0.9.0-py3-none-any.whl
Size 300.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
8ccbb76076a4e6db0b4bf3a9a19181ed2f777340966638a49267989f93acc242
BLAKE2b-256 checksum
How to use checksums
8850c979c311f1ecd497fc7459cd6df86a8ad5c6e9517a01f5985542e272711b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.15.0rc2

Release files / wcwidth-0.9.0-cp314-cp314t-win_arm64.whl

Download URL wcwidth-0.9.0-cp314-cp314t-win_arm64.whl
Size 598.9 kB
Tags CPython 3.14 CPython 3.14 free-threading Windows ARM64
SHA-256 checksum
How to use checksums
79ea0885ab30f862bda202f5cd4e0e01dfe86b6d18e7cb2619d1fcb2b52c2d3c
BLAKE2b-256 checksum
How to use checksums
c196afa804b2bb647d130cbfee1e178b73a45b124eca6f00a920727291abaabf
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.15.0rc2

Release files / wcwidth-0.9.0-cp314-cp314t-win_amd64.whl

Download URL wcwidth-0.9.0-cp314-cp314t-win_amd64.whl
Size 600.4 kB
Tags CPython 3.14 CPython 3.14 free-threading Windows x86-64
SHA-256 checksum
How to use checksums
26c2daaa6bf53bdf135a96fd9a01a3a60d3c18628d86637aa8e1f6c3392874a5
BLAKE2b-256 checksum
How to use checksums
7628dfdeca9ed1d1001b01d0e3f02f303efa8a458475d06af77837e1b7f048d3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.15.0rc2

Release files / wcwidth-0.9.0-cp314-cp314t-win32.whl

Download URL wcwidth-0.9.0-cp314-cp314t-win32.whl
Size 597.4 kB
Tags CPython 3.14 CPython 3.14 free-threading Windows x86-32
SHA-256 checksum
How to use checksums
bb4ef3d5a9a92931cf4eb6d7a4b17736576591748f43dfe2f53bc63ff2163192
BLAKE2b-256 checksum
How to use checksums
036bf812194f3f3d06fdaabfa506c75f1acf259ccfb174201388de659f6547b7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.15.0rc2

Release files / wcwidth-0.9.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl

Download URL wcwidth-0.9.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Size 761.3 kB
Tags CPython 3.14 CPython 3.14 free-threading Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
3aefeb02106a0ea2ed2ed8541ac243260849a07e97fbc083b4df4f568307c257
BLAKE2b-256 checksum
How to use checksums
f0dd595c9a49cf7da0edfe271eca474e1caae532bd982c791c59692961ff498a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.15.0rc2

Release files / wcwidth-0.9.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl

Download URL wcwidth-0.9.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
Size 762.7 kB
Tags CPython 3.14 CPython 3.14 free-threading Linux glibc 2.17+ ARM64
SHA-256 checksum
How to use checksums
ae8503058d68483b37e533f54f964510bbf73daa30637fbf60bb224084254f7c
BLAKE2b-256 checksum
How to use checksums
4ff2216542761f8f2be07d398c58c5ba72d802219b803eb46c0dcfd6a7514b96
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.15.0rc2

Release files / wcwidth-0.9.0-cp314-cp314t-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl

Download URL wcwidth-0.9.0-cp314-cp314t-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl
Size 755.1 kB
Tags CPython 3.14 CPython 3.14 free-threading Linux glibc 2.17+ x86-32 Linux glibc 2.5+ x86-32
SHA-256 checksum
How to use checksums
4bb4a6ada96121e8e1898a64d991be39518c18c832f8c9bd941a63623ad58a20
BLAKE2b-256 checksum
How to use checksums
aa989ed38b76b5013dcd6f0ba60946c5f84d9b1c70f566cabc7bebcab18a9ce7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.15.0rc2

Release files / wcwidth-0.9.0-cp314-cp314t-macosx_11_0_arm64.whl

Download URL wcwidth-0.9.0-cp314-cp314t-macosx_11_0_arm64.whl
Size 606.4 kB
Tags CPython 3.14 CPython 3.14 free-threading macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
4a7f533babe32007c2781e438973213a45bd07370f6cb272ee18f56135dc5703
BLAKE2b-256 checksum
How to use checksums
876432a8cf2aeef513bd813d4a86318fb221c6f16984e176e36e8c9b47056239
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.15.0rc2

Release files / wcwidth-0.9.0-cp314-cp314t-macosx_10_15_x86_64.whl

Download URL wcwidth-0.9.0-cp314-cp314t-macosx_10_15_x86_64.whl
Size 599.6 kB
Tags CPython 3.14 CPython 3.14 free-threading macOS 10.15+ x86-64
SHA-256 checksum
How to use checksums
c9ad6463bd15ee57c4178849fdaa29acb828052e3971d1e86028cc5dc1d58c72
BLAKE2b-256 checksum
How to use checksums
4dd305962a2d2195c231d1c5b820a6023b61e7be55c7a8eb32c91f2a721caa5e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.15.0rc2

Release files / wcwidth-0.9.0-cp310-abi3-win_arm64.whl

Download URL wcwidth-0.9.0-cp310-abi3-win_arm64.whl
Size 591.8 kB
Tags CPython 3.10 Windows ARM64 abi3
SHA-256 checksum
How to use checksums
489a121550bcedeec6c9e5a414768ad5719cae957bbd882833841026e3209672
BLAKE2b-256 checksum
How to use checksums
e5d94fbe5ea37702011a8ab940687c92f7412307ab75a212c59bf2bca9f842c9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.15.0rc2

Release files / wcwidth-0.9.0-cp310-abi3-win_amd64.whl

Download URL wcwidth-0.9.0-cp310-abi3-win_amd64.whl
Size 593.7 kB
Tags CPython 3.10 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
e0f8ffa0c912e2a103777f6978433a9991fe1346f6731b7a2e5e4128b4a44463
BLAKE2b-256 checksum
How to use checksums
186721e9748185f29e2c72d83e72a96dbc98134f9ad0bab3d3ad22e44e8f5ccd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.15.0rc2

Release files / wcwidth-0.9.0-cp310-abi3-win32.whl

Download URL wcwidth-0.9.0-cp310-abi3-win32.whl
Size 589.9 kB
Tags CPython 3.10 Windows x86-32 abi3
SHA-256 checksum
How to use checksums
94b752e19a47f8ad79bda46665c7d6bcef4ef23f7da8b4544f39d9f9256f8634
BLAKE2b-256 checksum
How to use checksums
91aa0b6247ce4b36c56bf30e1d23685ea0be37adfefab32b05fa1056a9180001
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.15.0rc2

Release files / wcwidth-0.9.0-cp310-abi3-musllinux_1_2_x86_64.whl

Download URL wcwidth-0.9.0-cp310-abi3-musllinux_1_2_x86_64.whl
Size 770.9 kB
Tags CPython 3.10 Linux musl 1.2+ x86-64 abi3
SHA-256 checksum
How to use checksums
03e2980286d59b61c247b6810333d596cbf21751d0f8e475c88664c6ae4ada04
BLAKE2b-256 checksum
How to use checksums
170f914ab82c26483b6cbb4bab27a5f7f0111193edcf803642d27056cd9f33d2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.15.0rc2

Release files / wcwidth-0.9.0-cp310-abi3-musllinux_1_2_i686.whl

Download URL wcwidth-0.9.0-cp310-abi3-musllinux_1_2_i686.whl
Size 769.4 kB
Tags CPython 3.10 Linux musl 1.2+ x86-32 abi3
SHA-256 checksum
How to use checksums
326cbf3503ec676d4c4d413cf8cc96d8b2591c23dc860c273ef1f8740e36befc
BLAKE2b-256 checksum
How to use checksums
fa91e288a2b54dd7125db8da70e85c2bf9bb07c81dc8c48aaee8c1b81089a52e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.15.0rc2

Release files / wcwidth-0.9.0-cp310-abi3-musllinux_1_2_aarch64.whl

Download URL wcwidth-0.9.0-cp310-abi3-musllinux_1_2_aarch64.whl
Size 768.3 kB
Tags CPython 3.10 Linux musl 1.2+ ARM64 abi3
SHA-256 checksum
How to use checksums
e2e3425dcb46b0f29f65ed0236e8c64d9ba53473a9b895d9435d64a9a2b70af1
BLAKE2b-256 checksum
How to use checksums
957b8087dc19bb6bf2909a29c07568cb115af762346c07760d736b5cd74880b1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.15.0rc2

Release files / wcwidth-0.9.0-cp310-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl

Download URL wcwidth-0.9.0-cp310-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Size 755.5 kB
Tags CPython 3.10 Linux glibc 2.17+ x86-64 abi3
SHA-256 checksum
How to use checksums
d095384f4d99261c8de74f025a2b7b13fde0188cbb3f83807e9015825e914f42
BLAKE2b-256 checksum
How to use checksums
7f8de293019bfd94b1373421aedcb7be55089c19b5bd5a0a0fb3476d5a4e336e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.15.0rc2

Release files / wcwidth-0.9.0-cp310-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl

Download URL wcwidth-0.9.0-cp310-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
Size 758.6 kB
Tags CPython 3.10 Linux glibc 2.17+ ARM64 abi3
SHA-256 checksum
How to use checksums
532eba871fb5c93ae492e5bd5ed3cab0d4805fd3a3e9d60a7aa92892f814a958
BLAKE2b-256 checksum
How to use checksums
2e5ec806c5b41ee2701fda27ad73e9d717d0b767de353d9d4a75714ccea4b090
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.15.0rc2

Release files / wcwidth-0.9.0-cp310-abi3-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl

Download URL wcwidth-0.9.0-cp310-abi3-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl
Size 749.6 kB
Tags CPython 3.10 Linux glibc 2.17+ x86-32 Linux glibc 2.5+ x86-32 abi3
SHA-256 checksum
How to use checksums
5a20a031f744881e4f895e0ea9494e41c0d4a7320e6405fa7dce5e062d1f0545
BLAKE2b-256 checksum
How to use checksums
d3fc0a410777214f640ec0d68b74596e47b0edcac79c137acf03754d5a41e97a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.15.0rc2

Release files / wcwidth-0.9.0-cp310-abi3-macosx_11_0_arm64.whl

Download URL wcwidth-0.9.0-cp310-abi3-macosx_11_0_arm64.whl
Size 606.2 kB
Tags CPython 3.10 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
1bd6e3ea20382288c4d1eac079d775742a788f16bdecd92d957ecdb941b40870
BLAKE2b-256 checksum
How to use checksums
f5001c60d2c047f0e9ca207deb25547ca57c746ea6b92c83d1d61224227cfa3c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.15.0rc2

Release files / wcwidth-0.9.0-cp310-abi3-macosx_10_9_x86_64.whl

Download URL wcwidth-0.9.0-cp310-abi3-macosx_10_9_x86_64.whl
Size 599.2 kB
Tags CPython 3.10 abi3 macOS 10.9+ x86-64
SHA-256 checksum
How to use checksums
d5fd98bd30785ecdb6a9a37d632c2f557e37dec7b7b3b76397842e03e891d3fb
BLAKE2b-256 checksum
How to use checksums
e682e59847cba534fe8d6c1bf539a30a91140c19b05f56ce1e701ada56dcbb5a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.15.0rc2

Release history Release notifications | RSS feed

0.9.1

21 release files

This release

0.9.0 This release

21 release files

0.8.5

2 release files

0.8.4

2 release files

0.8.3

2 release files

0.8.2

2 release files

0.8.1

2 release files

0.8.0

2 release files

0.7.0

2 release files

0.6.0

2 release files

0.5.3

2 release files

0.5.2

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.3.5

2 release files

0.3.4

2 release files

0.3.3

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.14

2 release files

0.2.12

2 release files

0.2.11

2 release files

0.2.10

2 release files

0.2.9

2 release files

0.2.8

2 release files

0.2.7

2 release files

0.2.6

2 release files

0.2.5

2 release files

0.2.4

2 release files

0.2.3

2 release files

0.2.2

2 release files

0.2.1

1 release file

0.2.0

3 release files

0.1.9

2 release files

0.1.8

2 release files

0.1.7

2 release files

0.1.6

2 release files

0.1.5

2 release files

0.1.4

2 release files

0.1.3

1 release file

0.1.2

1 release file

0.1.1

1 release file

0.1.0

1 release file

0.0.1

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page