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 not support any specific “legacy width” measurement by API, but it does provide Corrections for terminals using “legacy width” measurements or are without basic emoji or 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()

wcstwidth() is a variant of wcswidth() that provides 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

Metadata

Release files for wcwidth 0.9.3

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.3
File Size Uploaded Provenance
wcwidth-0.9.3.tar.gz 956.3 kB Without provenance Details

Built distributions (wheels)

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

Total release size: 19.7 MB

Release files / wcwidth-0.9.3.tar.gz

Download URL wcwidth-0.9.3.tar.gz
Size 956.3 kB
Tags Source
SHA-256 checksum
How to use checksums
dfe7cfbd4cb59db9fe0931bd6091ab4a95b3acc5d56bfb50fa9fef0ccba5dc5c
BLAKE2b-256 checksum
How to use checksums
694a82d61476a1ccc20d43d0805724c5de4baa4971131a8db1816705ef53fe16
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.3-py3-none-any.whl

Download URL wcwidth-0.9.3-py3-none-any.whl
Size 301.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
e3c9069c54a2da0bf4f6c7e65a735cb1da0f47601a15cb5fef7e4b6ffca4cf60
BLAKE2b-256 checksum
How to use checksums
bf12e10aad98050389ef674c9f69409e38ae086c2104912644e1f9143b394301
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.3-cp315-cp315t-win_arm64.whl

Download URL wcwidth-0.9.3-cp315-cp315t-win_arm64.whl
Size 606.3 kB
Tags CPython 3.15 CPython 3.15 free-threading Windows ARM64
SHA-256 checksum
How to use checksums
5d3b0b6c37f40e8d8298941ec373a426a892bb9a514328abcc9226cdc60ae6eb
BLAKE2b-256 checksum
How to use checksums
8471b470bd1dec14cbe6cee0c2e142787a8d99ac01711d5a1b533dda90754b48
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.3-cp315-cp315t-win_amd64.whl

Download URL wcwidth-0.9.3-cp315-cp315t-win_amd64.whl
Size 605.3 kB
Tags CPython 3.15 CPython 3.15 free-threading Windows x86-64
SHA-256 checksum
How to use checksums
3e3e31d6c17d6da3051f7eb854d5e4bebdc52a08a7a52adc2da6f15af51304e8
BLAKE2b-256 checksum
How to use checksums
7cdb0e24c2ff1e82cf298dd40a29e022da31b79be2589f0b8d865488e49140e1
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.3-cp315-cp315t-win32.whl

Download URL wcwidth-0.9.3-cp315-cp315t-win32.whl
Size 600.8 kB
Tags CPython 3.15 CPython 3.15 free-threading Windows x86-32
SHA-256 checksum
How to use checksums
16d09df90b3a8f799ea14c726a41d9b906c3104f95f46d158e1ebe45cf4d547b
BLAKE2b-256 checksum
How to use checksums
116a9727002b938c28ab4456fc43ba31a3159ebff040021ce8dbd70e904c7cc9
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.3-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl

Download URL wcwidth-0.9.3-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Size 785.1 kB
Tags CPython 3.15 CPython 3.15 free-threading Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
e9362be098c43d076aa43754face3cc0180fa81cea9ba304240b15490f2617e8
BLAKE2b-256 checksum
How to use checksums
08a447193dc9902c30e187d81feaa7a5bc2672c41fe07093ca1ce5381395b85c
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.3-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl

Download URL wcwidth-0.9.3-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
Size 786.8 kB
Tags CPython 3.15 CPython 3.15 free-threading Linux glibc 2.17+ ARM64
SHA-256 checksum
How to use checksums
658dcbce546e7f28ee361f88e4a8e591dd56f46bff6084e11b4ad8310ed99946
BLAKE2b-256 checksum
How to use checksums
f216745439326544b2a6d65facbdf8462ee9d31e09c64830a764d2526c6c80d6
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.3-cp315-cp315t-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl

Download URL wcwidth-0.9.3-cp315-cp315t-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl
Size 778.2 kB
Tags CPython 3.15 CPython 3.15 free-threading Linux glibc 2.17+ x86-32 Linux glibc 2.5+ x86-32
SHA-256 checksum
How to use checksums
c4531d93344441a7948e665854f0c40e3a8342ee106436d1531efa7a9fa7641e
BLAKE2b-256 checksum
How to use checksums
f9e60e4b5c81c238fac47eb66902f058a39ccdeacd7b2c5ab0c559066f203262
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.3-cp315-cp315t-macosx_11_0_arm64.whl

Download URL wcwidth-0.9.3-cp315-cp315t-macosx_11_0_arm64.whl
Size 611.2 kB
Tags CPython 3.15 CPython 3.15 free-threading macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
9470169fcb4e5340269175ebb3642dd5bfc8f82da8c86f29fc1fefc6c2b9bc1b
BLAKE2b-256 checksum
How to use checksums
ab63edffb23938f4e27c28400c7d8d5a8715381d77f5db96bf80cf5dd6687f88
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.3-cp315-cp315t-macosx_10_15_x86_64.whl

Download URL wcwidth-0.9.3-cp315-cp315t-macosx_10_15_x86_64.whl
Size 606.7 kB
Tags CPython 3.15 CPython 3.15 free-threading macOS 10.15+ x86-64
SHA-256 checksum
How to use checksums
52a13869704d43a4add59c68ebc892198e53063883114783bf0b7457e250e3f4
BLAKE2b-256 checksum
How to use checksums
76fef90b9444bbc2d566634f91756bd11c2bd39d50c2c9077551711b10d8d03f
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.3-cp314-cp314t-win_arm64.whl

Download URL wcwidth-0.9.3-cp314-cp314t-win_arm64.whl
Size 606.4 kB
Tags CPython 3.14 CPython 3.14 free-threading Windows ARM64
SHA-256 checksum
How to use checksums
eef39f3260991d8767189d296f0116fa4b45ad9c3a9a16d5af9187fb66b27564
BLAKE2b-256 checksum
How to use checksums
94243ebcfd772d273e43e28447dd1946d88b8625db57b6a23496ea4eb9e1dbb7
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.3-cp314-cp314t-win_amd64.whl

Download URL wcwidth-0.9.3-cp314-cp314t-win_amd64.whl
Size 605.3 kB
Tags CPython 3.14 CPython 3.14 free-threading Windows x86-64
SHA-256 checksum
How to use checksums
f11789e520ade8017fa93b01a4b8985571bb433eaefc2f857b57e36875e2e1d8
BLAKE2b-256 checksum
How to use checksums
27626684a59147c1f86d58d0138f3109f506a6761b815dcb3d86b74d9af3a723
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.3-cp314-cp314t-win32.whl

Download URL wcwidth-0.9.3-cp314-cp314t-win32.whl
Size 600.8 kB
Tags CPython 3.14 CPython 3.14 free-threading Windows x86-32
SHA-256 checksum
How to use checksums
457f986e4867111cb037ccbf0d97ae100b1ecad030d43a020e7207f1e29649d5
BLAKE2b-256 checksum
How to use checksums
a1ed33e3080fe32f6f8f86334b2c5adde243b9a3a3a46cef97694dbed73b9dc4
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.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl

Download URL wcwidth-0.9.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Size 784.5 kB
Tags CPython 3.14 CPython 3.14 free-threading Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
a7c0405a3bf3c564e481d6b2d55c99cc231bb68cf8f4a0995944bbce5ebf1a5d
BLAKE2b-256 checksum
How to use checksums
c6c0238c135e283b1b0e16fef8b082d432dda1fe7e568d6dd85d5c7fc5e83859
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.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl

Download URL wcwidth-0.9.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
Size 787.1 kB
Tags CPython 3.14 CPython 3.14 free-threading Linux glibc 2.17+ ARM64
SHA-256 checksum
How to use checksums
a44acbb23b525070a0b8c343dd7cab7a4020aff73b38804f7a66d6a66e16e3fc
BLAKE2b-256 checksum
How to use checksums
7b87c8f9295cd14a058dc27be0360fcc5ec70ce71b0d2e6a018871f585f23126
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.3-cp314-cp314t-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl

Download URL wcwidth-0.9.3-cp314-cp314t-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl
Size 776.0 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
7a95d8c784cbccbbcb808eaadfd156cd282b2bdd95e89b32505e3443381ce61d
BLAKE2b-256 checksum
How to use checksums
386138e6236356d25966d34636ef6f49ee83a66513e051c4a3b1e19c8b9ec806
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.3-cp314-cp314t-macosx_11_0_arm64.whl

Download URL wcwidth-0.9.3-cp314-cp314t-macosx_11_0_arm64.whl
Size 611.0 kB
Tags CPython 3.14 CPython 3.14 free-threading macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
c1bbc8ebf133422cadfefea95a9f89d6c9e9a1ae19930bef7862a9b59b20bbad
BLAKE2b-256 checksum
How to use checksums
f0fb27c94facff5c4a39b954a41fac20c238647f0aad32452d0d9e33fc05e852
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.3-cp314-cp314t-macosx_10_15_x86_64.whl

Download URL wcwidth-0.9.3-cp314-cp314t-macosx_10_15_x86_64.whl
Size 606.6 kB
Tags CPython 3.14 CPython 3.14 free-threading macOS 10.15+ x86-64
SHA-256 checksum
How to use checksums
6f3e855d3a09af8b7b6d56e76bc270681032f8a37d527a8d5707a441958e3730
BLAKE2b-256 checksum
How to use checksums
91b253e0838babc6b87505b9504ce62b72c79403642f88d3e568e05d0ef04825
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.3-cp310-abi3-win_arm64.whl

Download URL wcwidth-0.9.3-cp310-abi3-win_arm64.whl
Size 598.8 kB
Tags CPython 3.10 Windows ARM64 abi3
SHA-256 checksum
How to use checksums
80557db1f77148b78e1b3c2a9cc4ebc4feabef42aaf69a555565057031c32367
BLAKE2b-256 checksum
How to use checksums
693d5583cac85e233514c3906d5476b6a74160bc4dc82729dabef3485dbf3d52
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.3-cp310-abi3-win_amd64.whl

Download URL wcwidth-0.9.3-cp310-abi3-win_amd64.whl
Size 597.7 kB
Tags CPython 3.10 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
569a0cdb826d3097b6dbacfaa45aa0002d72a2ba6fa8a63251ea43ac4dd7b6a4
BLAKE2b-256 checksum
How to use checksums
5b6e46363d972b2b9f002fbfc3bf8e9ab0ff89f139c935a5f21d22016e7a2018
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.3-cp310-abi3-win32.whl

Download URL wcwidth-0.9.3-cp310-abi3-win32.whl
Size 593.2 kB
Tags CPython 3.10 Windows x86-32 abi3
SHA-256 checksum
How to use checksums
f2f943c4ef14e9baba730740265f4e5bf5fc8473550e36cd92828cd5663561a6
BLAKE2b-256 checksum
How to use checksums
3c86ada6c2244b08a86c871d42f7cd85b5226515b5f3fa7e604d1e6e45590275
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.3-cp310-abi3-musllinux_1_2_x86_64.whl

Download URL wcwidth-0.9.3-cp310-abi3-musllinux_1_2_x86_64.whl
Size 784.8 kB
Tags CPython 3.10 Linux musl 1.2+ x86-64 abi3
SHA-256 checksum
How to use checksums
537ea00b6792bb243cd09582322c54dbc848879e5d34ea4c5fee0147529685ab
BLAKE2b-256 checksum
How to use checksums
f2f6b79407036ca4543bf708a6d4ca561f78620dc1e5443e685e094480c37753
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.3-cp310-abi3-musllinux_1_2_i686.whl

Download URL wcwidth-0.9.3-cp310-abi3-musllinux_1_2_i686.whl
Size 783.2 kB
Tags CPython 3.10 Linux musl 1.2+ x86-32 abi3
SHA-256 checksum
How to use checksums
70a2ca239b85a219324968993c76c117fe423d4e1a7c9d860c999c66192f2570
BLAKE2b-256 checksum
How to use checksums
e9110da2720cba3f917148448c9bf73f3079d71f918308ee9e4d737a0b7acfd8
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.3-cp310-abi3-musllinux_1_2_aarch64.whl

Download URL wcwidth-0.9.3-cp310-abi3-musllinux_1_2_aarch64.whl
Size 782.2 kB
Tags CPython 3.10 Linux musl 1.2+ ARM64 abi3
SHA-256 checksum
How to use checksums
2f875a4c9e62df2ecfa70d99b24c551f2245609858e179c3a40e74631b2d08a4
BLAKE2b-256 checksum
How to use checksums
3f615f1e02e588d289837d5312478cc9f0e7bca93f4c8a77807741f79fb6a31c
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.3-cp310-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl

Download URL wcwidth-0.9.3-cp310-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Size 770.0 kB
Tags CPython 3.10 Linux glibc 2.17+ x86-64 abi3
SHA-256 checksum
How to use checksums
9ab8bfee107e08de09e15f9f6afb9fe0f64c8d64fd296d0d8557bafe71ea3f93
BLAKE2b-256 checksum
How to use checksums
b8d648dad66d577417ef8594000506fa8619d45d7282e20b4cdc916fcc68f95a
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.3-cp310-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl

Download URL wcwidth-0.9.3-cp310-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
Size 771.9 kB
Tags CPython 3.10 Linux glibc 2.17+ ARM64 abi3
SHA-256 checksum
How to use checksums
c12abd75ffcbad417e7770a6feb82413c102ccce5c435068c39a82e2218b00b3
BLAKE2b-256 checksum
How to use checksums
ea7a4e26574d032a1709bb1fd7d95d406b7b8f87363c60305a101e6e2d9285f5
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.3-cp310-abi3-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl

Download URL wcwidth-0.9.3-cp310-abi3-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl
Size 762.7 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
9e1cbe18c18d152e1e68e4e2561dab6c2bc988f8fd337a1fb2e1e0809c3fa568
BLAKE2b-256 checksum
How to use checksums
90ad8566e7cc712bea55eab0bb6d19581b7c727a58fcdd55f02365b309aaaccd
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.3-cp310-abi3-macosx_11_0_arm64.whl

Download URL wcwidth-0.9.3-cp310-abi3-macosx_11_0_arm64.whl
Size 610.1 kB
Tags CPython 3.10 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
aab90ab489850f87633922c3064f6d0442d8f6ae5407a62f82bdb1f424179c05
BLAKE2b-256 checksum
How to use checksums
8b3c714eba03905a23a46277cc96d3db8da6bd22d2cc0d09a4dead60a2bd1757
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.3-cp310-abi3-macosx_10_9_x86_64.whl

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

Security for wcwidth 0.9.3

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.9.3 This release

29 release files No provenance

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