JavaScript打印所有使用的Unicode字符

JavaScript print all used Unicode characters

本文关键字:Unicode 字符 打印 JavaScript      更新时间:2023-09-26

我正在尝试让JavaScript打印所有Unicode字符。根据我的研究,Unicode字符有1114112个。

像下面这样的脚本可以工作:

for(i = 0; i < 1114112; i++) 
    console.log(String.fromCharCode(i));

但我发现1114112个Unicode字符中只有10%被使用。

如何才能只打印使用过的unicode字符

正如Jukka所说,JavaScript还没有内置的方法来知道给定的Unicode代码点是否被分配了符号。

尽管如此,还是有办法做你想做的事。

我已经编写了几个脚本来解析Unicode数据库,并为Unicode中的每个类别、属性、脚本、块等创建单独的数据文件。我还创建了一个HTTP API,它允许您以编程方式获取给定Unicode类别中的所有代码点(即数字数组(,或具有给定Unicode属性的所有符号(即每个字符的字符串数组(,或者与某个Unicode脚本中的任何符号匹配的正则表达式。

例如,要获得一个字符串数组,该数组为在Unicode v6.3.0中分配了符号的每个Unicode代码点包含一个项目,可以使用以下URL:

http://mathias.html5.org/data/unicode/format?version=6.3.0&property=Assigned&type=symbols&prepend=window.symbols%20%3D%20&append=%3B

请注意,您可以通过调整URL参数来准备和附加任何您喜欢的内容到输出中,以便在您自己的脚本中更容易地重用数据。根据您的要求,console.log()包含所有这些符号的示例HTML页面可以写如下:

<!DOCTYPE html>
<meta charset="utf-8">
<title>All assigned Unicode v6.3.0 symbols</title>
<script src="http://mathias.html5.org/data/unicode/format?version=6.3.0&property=Assigned&type=symbols&prepend=window.symbols%20%3D%20&append=%3B"></script>
<script>
  window.symbols.forEach(function(symbol) {
    // Do what you want to do with `symbol` here, e.g.
    console.log(symbol);
  });
</script>

演示。请注意,由于这是大量数据,打开此页面时,DevTools控制台可能会变慢。


更新:现在,您应该使用Unicode数据包,如unicode-11.0.0。在Node.js中,您可以执行以下操作:

const symbols = require('unicode-11.0.0/Binary_Property/Assigned/symbols.js');
console.log(symbols);
// Or, to get the code points:
require('unicode-11.0.0/Binary_Property/Assigned/code-points.js');
// Or, to get a regular expression that only matches these characters:
require('unicode-11.0.0/Binary_Property/Assigned/regex.js');

在JavaScript中没有直接的方法来确定代码点是否分配给了字符,这似乎是这里的问题。您需要从适当的来源提取信息,并且每当在新版本的Unicode中分配新字符时,这些信息都需要更新。

Unicode中有1114112个代码点。Unicode标准为每个代码点分配属性gc,General Category。如果此属性的值不是Cs、Co或Cn,则将代码点指定给字符。(gc等于Co的代码点是专用代码点,没有为其分配字符,但它们可以用于私人协议中的字符。(

您需要做的是在Unicode字符数据库中获得一些相关文件的副本(实际上只是特定格式的文件的集合(,并编写代码来读取它并生成有关指定代码点的信息。为了打印所有Unicode字符,最好将信息生成为指定代码点范围的数组。当用新字符更新标准时,需要重复此操作。

即使剩下的也不是小事。您需要决定打印字符的含义。有些字符是控制字符,可能会产生诸如换行之类的效果,但缺少可见的字形。有些(空格(有空的字形。有些(组合标记(是作为附加到前一个角色的标记渲染的,尽管它们也有作为"独立"角色的传统渲染。有些是指根据最近的上下文采取本质上不同的形状;它们可能也有孤立的形式,但仅仅写出一个又一个字符并不能保证使用孤立的形式。

然后是字体的问题。没有一种字体可以包含所有Unicode字符,所以当一起使用时,您需要找到一个涵盖所有Unicode的字体集合,最好是使它们在风格上匹配。

因此,如果您只是在寻找所有可打印Unicode字符的汇编,请考虑使用Unicode代码图表。

这里的问题是Javascript是而不是,与流行的观点相反,它是一个Unicode环境。

在内部,它使用USC-2,这是一种早于UTF16的不兼容的16位编码方法。

此外,许多unicode字符本身不能直接打印——其中一些字符是为前面的字符修改的——例如,西班牙语字母ñ可以用unicode写成一个点——该字符——或者写成两个点——n~

以下是一些真正有助于您理解这一点的资源:

  • http://mathiasbynens.be/notes/javascript-encoding
  • http://mathiasbynens.be/notes/javascript-unicode