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.4

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.4
File Size Uploaded Provenance
wcwidth-0.9.4.tar.gz 970.1 kB Without provenance Details

Built distributions (wheels)

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

Total release size: 19.9 MB

Release files / wcwidth-0.9.4.tar.gz

Download URL wcwidth-0.9.4.tar.gz
Size 970.1 kB
Tags Source
SHA-256 checksum
How to use checksums
fd8d57d3cdfe570e3265c8fab1885c24e34ef40889c0759c0c304a19e9835954
BLAKE2b-256 checksum
How to use checksums
ea01e5ac23733628a6bbb91913a765fcf55ee8070d8d991bc88fdaaf805052c7
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.4-py3-none-any.whl

Download URL wcwidth-0.9.4-py3-none-any.whl
Size 301.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
901eace6d2dd25ebb917d0ce5db18e5c537e1504c905cf32f0d006c12098b05d
BLAKE2b-256 checksum
How to use checksums
6f0c309b1813b230d1dbbd6f2c2ab2bb21ef68992358977605d9ef289bbfedcc
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.4-cp315-cp315t-win_arm64.whl

Download URL wcwidth-0.9.4-cp315-cp315t-win_arm64.whl
Size 605.2 kB
Tags CPython 3.15 CPython 3.15 free-threading Windows ARM64
SHA-256 checksum
How to use checksums
2cca7b5d0b9d0ae49068d3ce806e965326a987f555b62eaa322223396e10d01b
BLAKE2b-256 checksum
How to use checksums
4ecc7eeb28059186cae72a770df79e744f232ef068192a5a588b718473e35bb4
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.4-cp315-cp315t-win_amd64.whl

Download URL wcwidth-0.9.4-cp315-cp315t-win_amd64.whl
Size 603.5 kB
Tags CPython 3.15 CPython 3.15 free-threading Windows x86-64
SHA-256 checksum
How to use checksums
12786620375dc83fabf4b2b2aa52416fef2bc6094522ea29c8a53c75b0dfe9b6
BLAKE2b-256 checksum
How to use checksums
636fb321f10c2298e7d16cffc1a5f05f3d7e5231b45f9e68af5ee378e23bb2e5
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.4-cp315-cp315t-win32.whl

Download URL wcwidth-0.9.4-cp315-cp315t-win32.whl
Size 598.9 kB
Tags CPython 3.15 CPython 3.15 free-threading Windows x86-32
SHA-256 checksum
How to use checksums
9e5090d253f5df99659cddfd3ed90dd21f6ff51989b0421331a63fb2681cbe27
BLAKE2b-256 checksum
How to use checksums
a8f2ab69009f2dd0d3772d3e07f025fa046b33c60c195e4f2e5f000297d23547
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.4-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl

Download URL wcwidth-0.9.4-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Size 803.5 kB
Tags CPython 3.15 CPython 3.15 free-threading Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
e05458491759aa42b7b85f36345b3e6df082d6d2d9bf616299668fd598e0209d
BLAKE2b-256 checksum
How to use checksums
acbbe2b40c6522f3aa1222558487dda3551d297e07e245761b4816f6caeebc29
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.4-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl

Download URL wcwidth-0.9.4-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
Size 806.2 kB
Tags CPython 3.15 CPython 3.15 free-threading Linux glibc 2.17+ ARM64
SHA-256 checksum
How to use checksums
29c0685f5f5f8815b88308fdcbe2cd12a92996a21a5b1e18352d165174ef7a6d
BLAKE2b-256 checksum
How to use checksums
2bd7f4f9967a411e02b89b74df2f49f44977c4badccf29738f3ae6941619e27c
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.4-cp315-cp315t-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl

Download URL wcwidth-0.9.4-cp315-cp315t-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl
Size 797.1 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
d76b7c715c5ca0103b28915f699f1020ae21f06f1d22cdd85a7a97f7b1536eed
BLAKE2b-256 checksum
How to use checksums
d1fe7d2c39e28924b2430b20099e36276f14e00e75c7bbe4ba5b1ed44d1d465a
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.4-cp315-cp315t-macosx_11_0_arm64.whl

Download URL wcwidth-0.9.4-cp315-cp315t-macosx_11_0_arm64.whl
Size 620.2 kB
Tags CPython 3.15 CPython 3.15 free-threading macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
d68f09093c9bec9226a52edc47487042ed4f64c5df91d06f00419495071c0279
BLAKE2b-256 checksum
How to use checksums
d266b2559c7012bbd4268f5b5c0288cb793c78235d354e306871a55893aa9d1a
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.4-cp315-cp315t-macosx_10_15_x86_64.whl

Download URL wcwidth-0.9.4-cp315-cp315t-macosx_10_15_x86_64.whl
Size 613.9 kB
Tags CPython 3.15 CPython 3.15 free-threading macOS 10.15+ x86-64
SHA-256 checksum
How to use checksums
a8c9ce14c6b4a499e61de6de7e9e456de11be8bc991554e2ab2ed4feb40b9664
BLAKE2b-256 checksum
How to use checksums
0446839780e772e9068580619d4d691348b7a5f9c4fa5ffe501e522eefeb27cc
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.4-cp314-cp314t-win_arm64.whl

Download URL wcwidth-0.9.4-cp314-cp314t-win_arm64.whl
Size 605.1 kB
Tags CPython 3.14 CPython 3.14 free-threading Windows ARM64
SHA-256 checksum
How to use checksums
79e09e9824c88f5e275ca99e921685567a5c5c1bb6165c16e27ddd1adab33a95
BLAKE2b-256 checksum
How to use checksums
e18cb1f399fd2f8449e42978192967ab6df441d7cf894b10117983c36c062b18
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.4-cp314-cp314t-win_amd64.whl

Download URL wcwidth-0.9.4-cp314-cp314t-win_amd64.whl
Size 603.5 kB
Tags CPython 3.14 CPython 3.14 free-threading Windows x86-64
SHA-256 checksum
How to use checksums
c36954849aafae1092d6f9de9548c5280c1d6841637a27ca288b2241c802c4ab
BLAKE2b-256 checksum
How to use checksums
b4fc3e39a33fc8f5c4e07611578710275039c9d4a6655e2be7cf3459401a30cc
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.4-cp314-cp314t-win32.whl

Download URL wcwidth-0.9.4-cp314-cp314t-win32.whl
Size 598.9 kB
Tags CPython 3.14 CPython 3.14 free-threading Windows x86-32
SHA-256 checksum
How to use checksums
14410eb73178cc492aa9bf22f7c12e3bf930e5470b7220cf6f530efbfa2e03f3
BLAKE2b-256 checksum
How to use checksums
d1001d50b8e8b45a8330b582695bf8196081a609317928a3718cf21b3d14a899
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.4-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl

Download URL wcwidth-0.9.4-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Size 802.4 kB
Tags CPython 3.14 CPython 3.14 free-threading Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
9c4b0dd04cca520792100f6110d10be262c94b285a281d1759c551f159214633
BLAKE2b-256 checksum
How to use checksums
9b1d66a94b9ac07037d7cf2c1f1288867c9932215d467893eaa5ec8d548c7f2f
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.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl

Download URL wcwidth-0.9.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
Size 806.6 kB
Tags CPython 3.14 CPython 3.14 free-threading Linux glibc 2.17+ ARM64
SHA-256 checksum
How to use checksums
befbf46467100e43fd8c8cc0c031a0105f13f5418c3be95fdcf0c47214487967
BLAKE2b-256 checksum
How to use checksums
120c986acadef534688a57502d484a40e0f30bdca2d39514fe0a311f7d575f70
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.4-cp314-cp314t-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl

Download URL wcwidth-0.9.4-cp314-cp314t-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl
Size 794.6 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
8f892713ab5795d3abae181e9c02db0eb24de4084f9ee080535369d3d98d7bb5
BLAKE2b-256 checksum
How to use checksums
1fd3bb8a7f4aa9b915e56e09841b07636ba49c82ec987ad3d2022e1696c038d9
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.4-cp314-cp314t-macosx_11_0_arm64.whl

Download URL wcwidth-0.9.4-cp314-cp314t-macosx_11_0_arm64.whl
Size 619.9 kB
Tags CPython 3.14 CPython 3.14 free-threading macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
ab1e5190fb82476e75fbf963e9d59b4fb1c1e1f4ced82069a0c989016aa959f7
BLAKE2b-256 checksum
How to use checksums
18f65a8327af9a65153ea9823d6a12fc182f325264050aa25c05a5deadc189c9
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.4-cp314-cp314t-macosx_10_15_x86_64.whl

Download URL wcwidth-0.9.4-cp314-cp314t-macosx_10_15_x86_64.whl
Size 613.8 kB
Tags CPython 3.14 CPython 3.14 free-threading macOS 10.15+ x86-64
SHA-256 checksum
How to use checksums
87e4101789415a6cf55ec4c53eceeb4782c2654c88692941cb588f19dca1959f
BLAKE2b-256 checksum
How to use checksums
b0cc46a31c12b4cdad04f546a3c0aca5d000d77aa5069ae88b4db24525cc29c4
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.4-cp310-abi3-win_arm64.whl

Download URL wcwidth-0.9.4-cp310-abi3-win_arm64.whl
Size 598.8 kB
Tags CPython 3.10 Windows ARM64 abi3
SHA-256 checksum
How to use checksums
2b58fc8cf2de1bf9cdb68b8beaa5be198742414a7c8cd97aa51ec039783ffa49
BLAKE2b-256 checksum
How to use checksums
4b881cb5ddaf5510b918e01aa95fc4b68df91dead784b63e4931037c5673e85f
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.4-cp310-abi3-win_amd64.whl

Download URL wcwidth-0.9.4-cp310-abi3-win_amd64.whl
Size 597.8 kB
Tags CPython 3.10 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
f28d77153303450ee13ebbe888297e75cf532c754555b6cabafc9bdda16c421c
BLAKE2b-256 checksum
How to use checksums
d6f1c123f902bc2ff9e9c2ab66241b8872204df87cbb18ecdf035e120860fedc
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.4-cp310-abi3-win32.whl

Download URL wcwidth-0.9.4-cp310-abi3-win32.whl
Size 593.2 kB
Tags CPython 3.10 Windows x86-32 abi3
SHA-256 checksum
How to use checksums
4831662c396dd4c59a016ec53c0ac96738006d653a00482777d9a2e2ea323d62
BLAKE2b-256 checksum
How to use checksums
5ecd739710c8cf0de461239db5bb6ee678c9a33d30aaa22beff55cc356781818
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.4-cp310-abi3-musllinux_1_2_x86_64.whl

Download URL wcwidth-0.9.4-cp310-abi3-musllinux_1_2_x86_64.whl
Size 796.2 kB
Tags CPython 3.10 Linux musl 1.2+ x86-64 abi3
SHA-256 checksum
How to use checksums
d8905f1390d828d745fdd1904374c90386d902d3cfa9ee88e9875099f75a4e17
BLAKE2b-256 checksum
How to use checksums
7abee3097d859b075344a7be57774a58d468eafb0ca88e02aad93eb31d69f6ba
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.4-cp310-abi3-musllinux_1_2_i686.whl

Download URL wcwidth-0.9.4-cp310-abi3-musllinux_1_2_i686.whl
Size 793.4 kB
Tags CPython 3.10 Linux musl 1.2+ x86-32 abi3
SHA-256 checksum
How to use checksums
b52f265a694dda6b3ad9050c8bd89158ad519109ef7c5eb110b906cc49f25763
BLAKE2b-256 checksum
How to use checksums
3c481b5299983d9ec084be897162b7cc6014622dfe62847224fa3272b6d79ea5
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.4-cp310-abi3-musllinux_1_2_aarch64.whl

Download URL wcwidth-0.9.4-cp310-abi3-musllinux_1_2_aarch64.whl
Size 795.3 kB
Tags CPython 3.10 Linux musl 1.2+ ARM64 abi3
SHA-256 checksum
How to use checksums
17619066f95c10f44d7ae08ee456602456bc66cc9d5e91966ec73d799acebc5f
BLAKE2b-256 checksum
How to use checksums
e911dd3d0379c6094524df6585b76ae3d9727161ff29c003177e3661c36437c1
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.4-cp310-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl

Download URL wcwidth-0.9.4-cp310-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Size 785.9 kB
Tags CPython 3.10 Linux glibc 2.17+ x86-64 abi3
SHA-256 checksum
How to use checksums
b185c8b927b23af2721be1783499d1cfa5c028b098b0858951b4ae224477f1c2
BLAKE2b-256 checksum
How to use checksums
fae80485850748dfdba9443f4151c7b2442cfa4987ba6cd871038eb5d6b8eca9
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.4-cp310-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl

Download URL wcwidth-0.9.4-cp310-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
Size 789.0 kB
Tags CPython 3.10 Linux glibc 2.17+ ARM64 abi3
SHA-256 checksum
How to use checksums
093469e01d881bff3db93ff3f56c364dc87c441ea01f9f41c22de0c0bdf5c6ef
BLAKE2b-256 checksum
How to use checksums
7d5b42bdf9a4b0e4f9126584af2ec73642de495f3bd8add907430f13c3bb98d2
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.4-cp310-abi3-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl

Download URL wcwidth-0.9.4-cp310-abi3-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl
Size 778.8 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
a1526cd25c6420e5153bb7d764c7509e692215ee3ad9b725db1ad665d47eae09
BLAKE2b-256 checksum
How to use checksums
5db6d7416f38054a107d2fb17c2b73b68723c6c334f69c4e29545fb9e6df81eb
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.4-cp310-abi3-macosx_11_0_arm64.whl

Download URL wcwidth-0.9.4-cp310-abi3-macosx_11_0_arm64.whl
Size 618.9 kB
Tags CPython 3.10 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
f279f32c8e206a9092fa350e53ca0c2bd8072e45b1c9fd31bb6d476b59b591c4
BLAKE2b-256 checksum
How to use checksums
04e9dfdca30ca36c472de3e260406dee29fc108499ec590c63b3fe279887ee9d
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.4-cp310-abi3-macosx_10_9_x86_64.whl

Download URL wcwidth-0.9.4-cp310-abi3-macosx_10_9_x86_64.whl
Size 613.0 kB
Tags CPython 3.10 abi3 macOS 10.9+ x86-64
SHA-256 checksum
How to use checksums
b7969c9aa258d536df54c8ac8af5cad0c74a6268c9972e1fb60a5f29feffb66d
BLAKE2b-256 checksum
How to use checksums
bfb8d251589a100250b71a7b8e83fedfcabfd8bd60e78cd1e3329372f63bcc93
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.4

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.4 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