JavaScript打印所有使用的Unicode字符

时间:2014-03-29 22:16:41

标签: javascript unicode character-encoding character

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

以下脚本可以起作用:

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

但我发现只使用了1,114,112个Unicode字符中的10%。

我怎样才能打印使用过的unicode字符?

3 个答案:

答案 0 :(得分:5)

As Jukka said,JavaScript没有内置的方法来了解给定的Unicode代码点是否已经分配了符号。

但仍然有办法做你想做的事。

我编写了several scripts来解析Unicode数据库,并为Unicode中的每个类别,属性,脚本,块等创建单独的数据文件。我还创建了an 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>

Demo。请注意,由于这是很多数据,因此打开此页面时您的DevTools控制台可能会变慢。


更新:现在,您应该使用unicode-11.0.0之类的Unicode数据包。在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');

答案 1 :(得分:1)

JavaScript中没有直接的方法可以确定代码点是否已分配给某个字符,这似乎是一个问题。您需要从合适的来源提取信息,并且只要在新版本的Unicode中分配新字符,就需要更新此信息。

Unicode中有1,114,112个代码点。 Unicode标准为每个代码点分配属性gc,General Category。如果此属性的值不是Cs,Co或Cn,则将代码点分配给字符。 (gc等于Co的代码点是私人使用代码点,没有分配字符,但它们可以通过私人协议用于字符。)

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

即使其余的也不是微不足道的。您需要决定打印角色的含义。某些字符是可能具有效果的控制字符,例如导致换行符,但缺少可见的字形。一些(空格)有空字形。一些(组合标记)意味着被渲染为附加到前一个角色的标记,尽管它们也具有传统的渲染作为“独立”字符。有些是根据最近的背景采取基本不同的形状;他们也可能有孤立的形式,但只是写一个又一个的字符绝不保证使用孤立的形式。

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

因此,如果您只是在寻找所有可打印Unicode字符的汇编,请考虑使用Unicode code charts

答案 2 :(得分:0)

这里的麻烦是Javascript ,与流行的观点相反,是一种Unicode环境。

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

此外,许多unicode字符本身不能直接打印 - 其中一些字符可以修改以前的字符 - 例如西班牙字母ñ可以用unicode编写为单点 - 该角色 - 或两个点 - n~

以下是一些应该真正帮助您理解这一点的资源: