包含所有ASCII字符的字符串

48

我想在JavaScript中创建一个包含所有ASCII字符的字符串。我该怎么做?


2
“all”是什么意思?按字母顺序排列,还是包括每个字符的表示,无论它是否有实际的书写值? - Elle H
9个回答

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

6
我正在寻找Unicode,也许其他人也在寻找:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïð - Albert Hendriks
8
@Albert Hendriks所提供的内容并不包含所有Unicode代码点,甚至没有涵盖前两个 - Stuart P. Bentley
4
这个问题非常清楚地要求一个包含所有(打印)ASCII字符的字符串,因为ASCII是一个小而固定的集合,所以这是可行的。如果你想覆盖超出ASCII的任意字符集合,你必须了解Unicode如何对代码点进行分类,并针对你的问题案例使用正确的解决方案。如果你正在寻找“一个包含所有字符的字符串”,那么你做错了事情——很可能是非常错误的事情。 - Stuart P. Bentley
我只是想帮助那些可能正在寻找一些Unicode字符的人,就像我自己一样。从谷歌搜索到这里的。 - Albert Hendriks
7
我只需要一个包含所有ASCII可打印字符的字符串。谢谢Google。谢谢@StuartP.Bentley。 - Bob Stein

33

我的JavaScript有点生疏,但是像这样:

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

不确定范围是否正确。

编辑:
看起来应该是32到127。已调整。

编辑2:
由于字符127也不是可打印字符,因此我们必须将其缩小到32 <= c <= 126,而不是32 <= c <= 127。


@Ignacio:好的,你赢了。 - Decent Dabbler
我需要所有ASCII字符。但这也有帮助。谢谢。 - Gjorgji
2
@Joachim:我敢打赌他正在寻找“所有可打印的西欧字符”或“我的母语中所有可打印的字符”。多年来,“ascii”一词的定义,特别是小写形式下的定义已经变得有点松散了,我注意到了这一点。 - Michael Petrotta
还有扩展ASCII,其字符编码高达255(包括一些带重音的字母如á、各种符号如±、º、≡以及代码为255的nbsp)。 - YakovL
2
@YakovL 扩展 ASCII 并不是一个字符集。因此,该术语对于几乎所有目的都是不充分的。JavaScript 使用 Unicode 字符集 的 UTF-16 字符编码(Java、.NET、VB4/5/6/A/Script 也是如此)。 - Tom Blodget
显示剩余4条评论

6

只需循环字符代码并将每个代码转换为字符:

var s = '';
for (var i=32; i<=127;i++) s += String.fromCharCode(i);

5

我只是想放在这里作为参考(在我的电脑上需要13/100到26/100毫秒来生成)。

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

分解:

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;
})();

最高效的解决方案(如果您确实希望每次脚本运行时生成整个集合)大约需要千分之三到千分之三十五毫秒来生成,这可能是最好的选择。
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(''));
})();

奇怪的是,使用反引号直接赋值字符串字面量的速度只比直接赋值慢3-10倍(反引号可以告诉JavaScript避免大部分反斜杠解析)。

var x;
var t;

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

.


2

这是一个使用Python编写的版本。 将所有ASCII字符按顺序作为单个字符串给出。

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{|}~'

这里的最后一个字符串,printable_ascii 只包含那些不包含转义字符的字符(即长度为1)。像 \x05、\x06 或者 \t、\n 这样在系统字体中没有自己的字形的字符将被过滤掉。

len(repr(chr(k))) == 3 包括来自 repr 调用的两个引号。


1

不需要进行多个附加操作:

var s = Array.apply(null, Array(127-32))
  .map(function(x,i) {
    return String.fromCharCode(i+32);
  }).join("");
  document.write(s);


1

这里是一个ES6一行代码:

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

console.log(asciiChars)


0
let str = '';// empty string declear
for( var i = 32; i <= 126; i++ )
{
    str = str + String.fromCharCode( i ); /* this method received one integer and

将其转换为 ASCII 字符并使用字符串连接方法逐个存储到 str 变量中。循环从 32 开始,到 126 结束。


-1

这是一个用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)

问题要求使用可打印的 ASCII。 - MilkyWay90

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接