我正在尝试使JavaScript打印出所有Unicode字符。根据我的研究,Unicode字符的数量为1,114,112个。
以下这样的脚本可能有效:
for(i = 0; i < 1114112; i++)
console.log(String.fromCharCode(i));
然而,我发现只有1114112个Unicode字符中的10%被使用。
我该如何仅打印已使用的Unicode字符?
我正在尝试使JavaScript打印出所有Unicode字符。根据我的研究,Unicode字符的数量为1,114,112个。
以下这样的脚本可能有效:
for(i = 0; i < 1114112; i++)
console.log(String.fromCharCode(i));
然而,我发现只有1114112个Unicode字符中的10%被使用。
我该如何仅打印已使用的Unicode字符?
正如Jukka所说的那样, JavaScript没有内置的方法来判断一个给定的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
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');
Assigned
等同于 \P{Cn}
,匹配所有已分配的字符(针对 Unicode 的目标版本)。它还包括所有私用字符。它有助于避免混淆的双重否定。请注意,Cn
包括非字符,因此 Assigned
不包括它们。” 基于这个,似乎输出是正确的 — 你同意吗? - Mathias Bynenshttp://mathias.html5.org/data/unicode/format?version=6.3.0&property=Assigned&type=code-points&prepend=window.codePoints%20%3D%20&append=%3B
中是否还包含其他内容? - Mathias Bynens这里的问题是,与普遍观点相反,JavaScript并不是Unicode环境。
在内部,它使用USC-2
,这是一种不兼容的16位编码方法,早于UTF16。
此外,许多Unicode字符本身不能直接打印——其中一些是前面字符的修改——例如,西班牙字母ñ
可以用Unicode写成单个点(该字符)或两个点(n
和~
)。
以下是几个资源,应该真正帮助您理解这一点:
String.fromCharCode
对于星际符号不起作用。 - Mathias Bynens