Skip to main content
ASCII Art Generator

ASCII table and character ramp builder

What is ASCII?

ASCII stands for American Standard Code for Information Interchange. It assigns numbers to letters, digits, punctuation and controls. ASCII art arranges printable characters into a picture.

Open the image converter or browse generated examples.

Working with a list of numbers? Convert ASCII numbers to text and back.

The 7-bit range

  • Seven bits encode 128 values: decimal 0-127, hexadecimal 00-7F.
  • In an 8-bit byte, ASCII occupies the low seven bits with the high bit zero.
  • The printable range is 32-126: 95 characters including space. Space advances the position without drawing a mark.
  • Values 0-31 are controls, such as tab (9), line feed (10), carriage return (13) and escape (27).
  • DEL is 127 (0x7F), outside the printable range. Unicode classifies it as a control, not a drawing character.

For the code table and byte representation, see RFC 20. The Unicode Basic Latin chart lists the corresponding characters and controls.

Leave without saving your work?

Your input and artwork are not saved. Keep editing, or download the current result and check it before leaving.

Build a printable ASCII character ramp

Enter characters in darkest-to-lightest order for the image converter's Standard mode. Order, duplicates and leading/trailing spaces are kept exactly. The tool does not rank glyph density: that depends on the font.

10/256 characters. Only printable ASCII 32-126; no tabs or line breaks. Text stays in this tab.

Black to white: 64 opaque grayscale samples through the real Standard converter, with neutral adjustments and no dithering. This demonstrates selection order, not font coverage.

@@@@%%%%%%%#######*******+++++++=======-------:::::::.......    

Exact ramp, escaped: "@%#*+=-:. ". Spaces appear inside the quotes; quotes and escape backslashes are not exported.

Copy the raw ramp, then open the image converter and upload an image. In Options, choose Standard ASCII Art, open Advanced image settings and paste into Character Set. Leave meaningful spaces intact. No ramp is put in the link, browser storage or analytics.

ASCII code table: 0-127

128 of 128 codes. Append buttons add printable characters to the end of your ramp, including repeats.

All 7-bit ASCII codes; controls cannot be appended to a character ramp.
DecimalHex7-bit binaryCharacter / nameRamp
00x000000000NUL - NullControl
10x010000001SOH - Start of headingControl
20x020000010STX - Start of textControl
30x030000011ETX - End of textControl
40x040000100EOT - End of transmissionControl
50x050000101ENQ - EnquiryControl
60x060000110ACK - AcknowledgeControl
70x070000111BEL - BellControl
80x080001000BS - BackspaceControl
90x090001001HT - Horizontal tabControl
100x0A0001010LF - Line feedControl
110x0B0001011VT - Vertical tabControl
120x0C0001100FF - Form feedControl
130x0D0001101CR - Carriage returnControl
140x0E0001110SO - Shift outControl
150x0F0001111SI - Shift inControl
160x100010000DLE - Data link escapeControl
170x110010001DC1 - Device control 1Control
180x120010010DC2 - Device control 2Control
190x130010011DC3 - Device control 3Control
200x140010100DC4 - Device control 4Control
210x150010101NAK - Negative acknowledgeControl
220x160010110SYN - Synchronous idleControl
230x170010111ETB - End of transmission blockControl
240x180011000CAN - CancelControl
250x190011001EM - End of mediumControl
260x1A0011010SUB - SubstituteControl
270x1B0011011ESC - EscapeControl
280x1C0011100FS - File separatorControl
290x1D0011101GS - Group separatorControl
300x1E0011110RS - Record separatorControl
310x1F0011111US - Unit separatorControl
320x200100000SPACE
330x210100001!
340x220100010"
350x230100011#
360x240100100$
370x250100101%
380x260100110&
390x270100111'
400x280101000(
410x290101001)
420x2A0101010*
430x2B0101011+
440x2C0101100,
450x2D0101101-
460x2E0101110.
470x2F0101111/
480x3001100000
490x3101100011
500x3201100102
510x3301100113
520x3401101004
530x3501101015
540x3601101106
550x3701101117
560x3801110008
570x3901110019
580x3A0111010:
590x3B0111011;
600x3C0111100<
610x3D0111101=
620x3E0111110>
630x3F0111111?
640x401000000@
650x411000001A
660x421000010B
670x431000011C
680x441000100D
690x451000101E
700x461000110F
710x471000111G
720x481001000H
730x491001001I
740x4A1001010J
750x4B1001011K
760x4C1001100L
770x4D1001101M
780x4E1001110N
790x4F1001111O
800x501010000P
810x511010001Q
820x521010010R
830x531010011S
840x541010100T
850x551010101U
860x561010110V
870x571010111W
880x581011000X
890x591011001Y
900x5A1011010Z
910x5B1011011[
920x5C1011100\
930x5D1011101]
940x5E1011110^
950x5F1011111_
960x601100000`
970x611100001a
980x621100010b
990x631100011c
1000x641100100d
1010x651100101e
1020x661100110f
1030x671100111g
1040x681101000h
1050x691101001i
1060x6A1101010j
1070x6B1101011k
1080x6C1101100l
1090x6D1101101m
1100x6E1101110n
1110x6F1101111o
1120x701110000p
1130x711110001q
1140x721110010r
1150x731110011s
1160x741110100t
1170x751110101u
1180x761110110v
1190x771110111w
1200x781111000x
1210x791111001y
1220x7A1111010z
1230x7B1111011{
1240x7C1111100|
1250x7D1111101}
1260x7E1111110~
1270x7F1111111DEL - DeleteControl

Convert ASCII numbers to text in Python

Each number identifies one character. Decimal 65 32 66 10 means A, a space, B and a line feed. This decodes text; it does not draw a banner. For large letters made from characters, use the text-to-ASCII generator.

With Python 3 installed, save this complete example as ascii_codes.py. Run python3 ascii_codes.py, or py -3 ascii_codes.py on Windows. Use whitespace-separated decimal values, not commas or hexadecimal prefixes:

codes = "65 32 66 10"
values = [int(token) for token in codes.split()]
text = bytes(values).decode("ascii")
print(repr(text))

Output:

'A B\n'

repr shows the line feed as \n instead of sending it to the terminal. Its surrounding quotes are a display convention, not characters in the decoded text. Other controls, such as ESC, are escaped too. Inspect unfamiliar codes before displaying their raw text.

Convert text back to ASCII numbers

Run this as a separate example. The string contains the same space and final line feed:

text = "A B\n"
codes = " ".join(str(value) for value in text.encode("ascii"))
print(codes)
65 32 66 10

Keep a separator between values. Without a stated format, 6566 could mean 65 66 or 6 56 6; the latter includes controls. The decoder above treats an unseparated token as one integer, rather than guessing boundaries. This is encoding, not encryption.

When strict ASCII should fail

  • 128 through 255 fit in a byte but are not ASCII. Decoding them with "ascii" raises UnicodeDecodeError.
  • Negative values and values above 255 cannot enter bytes(values); Python raises ValueError. A comma-separated token such as 65,32 also raises ValueError during integer parsing.
  • Encoding an accented letter, a box-drawing line or an emoji with "ascii" raises UnicodeEncodeError. Use the encoding your data actually requires; do not silently ignore or replace characters to make the error disappear.

The existing code table includes controls; the character ramp accepts only printable values 32-126. Signed byte arrays and "extended ASCII" require a known encoding and a separate interpretation. Python's bytes decoding and string encoding documentation describe these operations. This website does not run the Python code.

ASCII, extended encodings and Unicode

"Extended ASCII" is an informal name for different 8-bit encodings, not a single extra character set. Code pages such as CP437 and Windows-1252 assign different meanings above 127. Selecting the wrong encoding can change the displayed text.

Unicode includes ASCII as U+0000 through U+007F. UTF-8 encodes those values as the same single bytes, so ASCII text is also valid UTF-8. Other characters can require several bytes. See RFC 3629.

Blocks, box-drawing lines and emoji in this app are Unicode text, not strict ASCII. Use Standard, Simple, Binary or Detailed with only printable ASCII symbols when that distinction matters. UTF-8 support does not guarantee that a font contains every glyph.

To diagnose tabs, no-break spaces or invisible formatting in existing text, use the Unicode and invisible character inspector. It reveals code points and previews targeted repairs without automatically removing joiners or emoji sequences.

A historical reference

RFC 20, published in October 1969, describes ASCII for network interchange and reproduces the 1968 code table. It documents text encoding, not the invention date of ASCII art. Text art uses that limited palette to suggest outlines and shading; today this app generates those character grids from images or FIGlet font definitions.

Using text art in a project

Copy and TXT preserve characters, spaces and line breaks, not the receiving app's styling. Use a fenced code block in a README or chat, or a preformatted monospace text area. Keep leading/trailing spaces and disable wrapping. Unicode blocks, lines and emoji need suitable fonts and may occupy different widths.

A programming language, file format or terminal may use ASCII symbols for syntax while also accepting Unicode text. Git diffs do not require ASCII-only source files. Check the receiving tool's encoding and font rather than treating ASCII as a universal requirement.

For conversion settings, follow the image tutorial. For banners, read the FIGlet guide. The algorithm explanation covers how this converter selects characters.

Frequently asked questions

What file types are used for ASCII art?

This tool saves characters as TXT or renders them as PNG. TXT remains editable; PNG is useful when the destination changes text spacing.

Can I turn any image into ASCII art?

Use still PNG, JPG, single-frame GIF, still WebP or uncompressed BMP. Animated PNG/WebP, multi-frame GIF and user SVG, AVIF and other unsupported formats are rejected before image decoding; export one frame to a still PNG first. Bundled Twemoji SVG artwork is a trusted site-asset exception. Choose one image up to 10 MiB (10,485,760 bytes) and 24 million decoded pixels. Conversion allows at most 40,000 sampling cells and 1,000 sampling rows. Reduce width or resize/crop the input if a limit is exceeded. A clear subject and simple background are a useful starting point; small details can disappear in a text grid.

Where can I use ASCII art?

Try a README code block, a terminal banner or a preformatted chat message. Preview in the destination before sharing; support for spacing and Unicode glyphs varies.

More conversion questions