JavaScript打印所有使用的Unicode字符
JavaScript print all used Unicode characters
我正在尝试让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
- 无法呈现js unicode字符“u1F310”
- Unicode字符未在HTML5画布中正确呈现
- jquery textcomplete无法使用Unicode字符,并且缺少空格
- 在 Javascript 中显示 unicode 字符(表情符号)
- 将文本和html unicode字符添加到textarea元素中
- 用unicode字符提取字符串中的单词
- 如何替换不可打印的unicode字符(Javascript)
- PHP:如何用unicode字符将文件写入磁盘
- JavaScript 转到带有 Unicode 字符的 URL
- 为什么这个 unicode 字符的警报不成功
- 如何在包含 Unicode 字符 'u00A0' 的表中包装单词
- Mozilla Builder 编辑器取消转义 Unicode 字符,并发 w. AMO 上传失败
- 正则表达式匹配所有单词,包括标点符号和 unicode 字符.没有空格
- 正则表达式与专业 unicode 字符不匹配
- 使用带有 unicode 字符的 ng-pattern (Angular.JS) 的不良结果
- 删除不受支持的 unicode 字符,否则显示为正方形
- Javascript:非 unicode 字符代码到 unicode 字符
- 交换 Unicode 字符
- 从字符串中剥离 javascript unicode 字符 8206
- Jquery DataTables 无法显示 unicode 字符