48

I want to create a string in JavaScript that contains all ascii characters. How can I do this?

Gjorgji
  • 22,458
  • 10
  • 31
  • 39
  • 2
    What do you mean by "all"? Alphabetical, or literally every character representation regardless of whether it has an actual written value? – Elle H Mar 15 '10 at 00:34

9 Answers9

127
var s = ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~';
Stuart P. Bentley
  • 10,195
  • 10
  • 55
  • 84
  • 6
    I was looking for unicode, so someone else might also be: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïð – Albert Hendriks Jul 13 '16 at 11:44
  • 7
    @Albert Hendriks That does *not* contain all Unicode code points. It doesn't even cover the first two [blocks](https://en.wikipedia.org/wiki/Unicode_block). – Stuart P. Bentley Jul 13 '16 at 21:06
  • 3
    This question very clearly asks for a string containing all (printing) **ASCII** characters, which is feasible, as ASCII is a small, fixed set. If you're intending to cover *any* set of characters *beyond* ASCII, you must understand how Unicode classifies code points and use the proper solution for your problem case. If you're looking for "a string that contains all characters", you're doing things *wrong* - most likely, something *very* wrong. – Stuart P. Bentley Jul 13 '16 at 21:13
  • I'm just trying to help anyone who might be looking for some unicode characters, like I was myself. Got here from Google. – Albert Hendriks Jul 14 '16 at 08:09
  • 6
    I just wanted a string literal with all ASCII printable characters. Thanks [google](https://www.google.com/search?q=all+ascii+characters+in+one+string). Thanks @StuartP.Bentley. – Bob Stein Jul 19 '19 at 20:19
33

My javascript is a bit rusty, but something like this:

s = '';
for( var i = 32; i <= 126; i++ )
{
    s += String.fromCharCode( i );
}

Not sure if the range is correct though.

Edit:
Seems it should be 32 to 127 then. Adjusted.

Edit 2:
Since char 127 isn't a printable character either, we'll have to narrow it down to 32 <= c <= 126, in stead of 32 <= c <= 127.

Decent Dabbler
  • 22,532
  • 8
  • 74
  • 106
  • He did specify ASCII, and likely wants only printable characters, so you'll want to stick to 32 <= c <= 127. – Michael Petrotta Mar 15 '10 at 00:42
  • Actually, character 127 isn't really printable, so 32 <= c < 127. – Ignacio Vazquez-Abrams Mar 15 '10 at 00:44
  • You are right Michael, I wasn't sure about the actual range of ASCII. Shame on me. :-/ But I've looked it up now, and it seems we should narrow it down to 32 to 126, since DEL is not a printable character either I believe. But correct me if I'm wrong. – Decent Dabbler Mar 15 '10 at 00:46
  • @Ignacio: Well, there you go, you beat me to it. – Decent Dabbler Mar 15 '10 at 00:47
  • I need all ascii chatacters. However, this helps, too. Thanks – Gjorgji Mar 15 '10 at 00:48
  • @Gjorgji: which characters are you missing? Why do you think that those are not all? – Joachim Sauer Mar 15 '10 at 00:54
  • 2
    @Joachim: I'll bet he's looking for "all printable Western European characters" or "all printable characters in my native script". The definition of the word "ascii", especially when rendered in lowercase, has gotten a bit sloppy over the years, I've noticed. – Michael Petrotta Mar 15 '10 at 01:15
  • There is also [Extended ASCII](https://theasciicode.com.ar/) with charcodes up to 255 (includes some accented letters like á, various symbols like ±, º, ≡ and also nbsp with the code 255) – YakovL Dec 20 '18 at 21:52
  • 2
    @YakovL Extended ASCII isn't one character set. So the term is insufficient for almost all purposes. JavaScript uses the UTF-16 character encoding of the [Unicode character set](http://www.unicode.org/charts/nameslist/index.html) (as does Java, .NET, VB4/5/6/A/Script, …). – Tom Blodget Jan 08 '19 at 02:20
6

Just loop the character codes and convert each to a character:

var s = '';
for (var i=32; i<=127;i++) s += String.fromCharCode(i);
Guffa
  • 687,336
  • 108
  • 737
  • 1,005
5

Just wanted to put this here for reference. (takes about 13/100 to 26/100 of a ms on my computer to generate).

var allAsciiPrintables = JSON.stringify((Array.from(Array(126 + 32).keys()).slice(32).map((item) => {
    return String.fromCharCode(item);
})).join(''));

Decomposed:

var allAsciiPrintables = (function() {
    /* ArrayIterator */
    var result = Array(126 + 32).keys();    
    /* [0, 126 + 32] */
    result = Array.from(result);
    /* [32, 126 + 32] */
    result = result.slice(32);
    /* transform each item from Number to its ASCII as String. */
    result = result.map((item) => {
        return String.fromCharCode(item);
    });
    /* convert from array of each string[1] to a single string */
    result = result.join('');

    /* create an escaped string so you can replace this code with the string 
       to avoid having to calculate this on each time the program runs */
    result = JSON.stringify(result);

    /* return the string */
    return result;
})();

The most efficient solution(if you do want to generate the whole set each time the script runs, is probably)(takes around 3/100-35/100 of a millisecond on my computer to generate).

var allAsciiPrintables = (() => {
    var result = new Array(126-32);
    for (var i = 32; i <= 126; ++i) {
        result[i - 32] = (String.fromCharCode(i));        
    }
    return JSON.stringify(result.join(''));
})();

strangely, this is only 3-10 times slower than assigning the string literal directly(with backticks to tell javascript to avoid most backslash parsing).

var x;
var t;

t = performance.now();
x = '!\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~';
t = performance.now() - t;
console.log(t);

.

Dmytro
  • 5,068
  • 4
  • 39
  • 50
2

This is a version written in python. Gives all ASCII characters in order as a single string.

all_ascii = ''.join(chr(k) for k in range(128))  # 7 bits
all_chars = ''.join(chr(k) for k in range(256))  # 8 bits
printable_ascii = ''.join(chr(k) for k in range(128) if len(repr(chr(k))) == 3)


>>> print(printable_ascii)
' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~'

The last string here, printable_ascii contains only those characters that contain no escapes (i.e. have length == 1). The chars like: \x05, \x06 or \t, \n which does not have its own glyph in your system's font, are filtered out.

len(repr(chr(k))) == 3 includes 2 quotes that come from repr call.

1

Without doing several appends:

var s = Array.apply(null, Array(127-32))
  .map(function(x,i) {
    return String.fromCharCode(i+32);
  }).join("");
  document.write(s);
fingerpich
  • 8,500
  • 2
  • 22
  • 32
Bruno Lopes
  • 2,917
  • 1
  • 27
  • 38
1

Here is an ES6 one liner:

asciiChars = Array.from({ length: 95 }, (e, i) => String.fromCharCode(i + 32)).join('');

console.log(asciiChars)
Nick
  • 138,499
  • 22
  • 57
  • 95
0
let str = '';// empty string declear
for( var i = 32; i <= 126; i++ )
{
    str = str + String.fromCharCode( i ); /* this method received one integer and

convert it into a ascii characters and store it str variable one by one by using string concatenation method. The loop start for 32 and end 126 */ }

-1

Here is a version in coffeescript

require 'fluentnode'

all_Ascii = ->
  (String.fromCharCode(c) for c in  [0..255])

describe 'all Ascii', ->

  it 'all_Ascii', ->
    all_Ascii.assert_Is_Function()
    all_Ascii().assert_Size_Is 256
    all_Ascii()[0x41].assert_Is 'A'
    all_Ascii()[66  ].assert_Is 'B'
    all_Ascii()[50  ].assert_Is '2'
    all_Ascii()[150 ].assert_Is String.fromCharCode(150)
Dinis Cruz
  • 4,161
  • 2
  • 31
  • 49