我正在尝试让JavaScript打印所有Unicode字符。根据我的研究,有1,114,112个Unicode字符。
以下脚本可以起作用:
for(i = 0; i < 1114112; i++)
console.log(String.fromCharCode(i));
但我发现只使用了1,114,112个Unicode字符中的10%。
我怎样才能打印使用过的unicode字符?
答案 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
和~
以下是一些应该真正帮助您理解这一点的资源: