图形解析器: Unicode 字符分拆器
导言
这个图书馆继续工作 图形分割符 并支持下列 unicode 版本:
- Unicode 15 及以下编码
[v1.4.0] - 统一码 14 及以下
[v1.3.0] - Unicode 13 及以下编码
[v1.1.0] - Unicode 11 及以下编码
[v1.0.0]( Unicode 10 支持 )grapheme-splitter(中文(简体) )
在JavaScript中,字符串字符与用户将单独称为"字母"的关系并不总是一对一的. 一些符号由几个字符代表. 这可能会在分出字符串,无意中将多字符串字母切成一半时出问题,或者在需要字符串中的实际字母数时出问题.
例如,"🌷","🎁","😜"和"👍"等emoji字符分别由两个JavaScript字符代表(高代词和低代词). 也就是说,
'🌷'.length == 2;
合并的emoji甚至更长:
'🏳️🌈'.length == 6;
更有甚者,一些语言往往包括了合并标记——用来修改之前的字母的字符. 常见的例子有德文字母ü和西班牙字母ñ. 有时,它们既可以作为单一字符,也可以作为字母+组合标记,两种形式同样有效:
var two = 'ñ'; // unnormalized two-char n+◌̃, i.e. "\u006E\u0303";
var one = 'ñ'; // normalized single-char, i.e. "\u00F1"
console.log(one != two); // prints 'true'
Unicode 正常化,由流行的 punycode.js 库或 ECMAScript 6's String.commonize 执行,可以 有时 修复这些差异, 将两个字符序列变成单个字符。 但这是 没有 所有情况都够了 有些语言如印地语在字母上广泛使用组合标记,由于可能组合的数量之多,这些字母没有专用的单码点Unicode序列. 例如,印地语"QQ"由5个字母和3个组合标记组成:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
这其实只是5个用户感知到的字母:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
以及Unicode正常化不会适当结合. 也有一些不寻常的字母+组合标记组合,没有专门的Unicode编码点. 字符串 ZQQALQGQQ QQǪ̵̹̻̝̳͂̌̌͘明显有5个独立的字母,但实际上由58个JavaScript字符所组成,其中大部分是合并标记.
输入 graphemer 图书馆。 它可以用来将JavaScript字符串适当分解为人类用户会称为"单独的字母"(或Unicode名词中的"扩展的图形集群"),不管其内部代表是什么. 它是一个执行 默认图形集群边界 联 合 国 29号未爆炸弹药。 。 。 .
安装
安装 graphemer 使用以下国家预防机制命令:
$ npm i graphemer
使用量
如果你在用的话 字体 或者编译器喜欢 宝贝 (或像Create React App之类的东西)事情相当简单;只是导入,初始化和使用!
import Graphemer from 'graphemer';
const splitter = new Graphemer();
// split the string to an array of grapheme clusters (one string each)
const graphemes = splitter.splitGraphemes(string);
// iterate the string to an iterable iterator of grapheme clusters (one string each)
const graphemeIterator = splitter.iterateGraphemes(string);
// or do this if you just need their number
const graphemeCount = splitter.countGraphemes(string);
如果你用香草的话 节点你可以使用 require() 方法.
const Graphemer = require('graphemer').default;
const splitter = new Graphemer();
const graphemes = splitter.splitGraphemes(string);
实例
import Graphemer from 'graphemer';
const splitter = new Graphemer();
// plain latin alphabet - nothing spectacular
splitter.splitGraphemes('abcd'); // returns ["a", "b", "c", "d"]
// two-char emojis and six-char combined emoji
splitter.splitGraphemes('🌷🎁💩😜👍🏳️🌈'); // returns ["🌷","🎁","💩","😜","👍","🏳️🌈"]
// diacritics as combining marks, 10 JavaScript chars
splitter.splitGraphemes('Ĺo͂řȩm̅'); // returns ["Ĺ","o͂","ř","ȩ","m̅"]
// individual Korean characters (Jamo), 4 JavaScript chars
splitter.splitGraphemes('뎌쉐'); // returns ["뎌","쉐"]
// Hindi text with combining marks, 8 JavaScript chars
splitter.splitGraphemes('अनुच्छेद'); // returns ["अ","नु","च्","छे","द"]
// demonic multiple combining marks, 75 JavaScript chars
splitter.splitGraphemes('Z͑ͫ̓ͪ̂ͫ̽͏̴̙̤̞͉͚̯̞̠͍A̴̵̜̰͔ͫ͗͢L̠ͨͧͩ͘G̴̻͈͍͔̹̑͗̎̅͛́Ǫ̵̹̻̝̳͂̌̌͘!͖̬̰̙̗̿̋ͥͥ̂ͣ̐́́͜͞'); // returns ["Z͑ͫ̓ͪ̂ͫ̽͏̴̙̤̞͉͚̯̞̠͍","A̴̵̜̰͔ͫ͗͢","L̠ͨͧͩ͘","G̴̻͈͍͔̹̑͗̎̅͛́","Ǫ̵̹̻̝̳͂̌̌͘","!͖̬̰̙̗̿̋ͥͥ̂ͣ̐́́͜͞"]
类型脚本
Graphemer是用 TypeScript 构建的,当然还包括类型声明.
import Graphemer from 'graphemer';
const splitter = new Graphemer();
const split: string[] = splitter.splitGraphemes('Z͑ͫ̓ͪ̂ͫ̽͏̴̙̤̞͉͚̯̞̠͍A̴̵̜̰͔ͫ͗͢L̠ͨͧͩ͘G̴̻͈͍͔̹̑͗̎̅͛́Ǫ̵̹̻̝̳͂̌̌͘!͖̬̰̙̗̿̋ͥͥ̂ͣ̐́́͜͞');
捐款
见 贡献指南。 。 。 .
鸣谢
这个图书馆是Orlin Georgiev和Huáng Jünliàng在Orlin Georgiev和Huáng Jünliàng at at https://github.com/orling/grapheme-splitter 互联网档案馆的存檔,存档日期2013-12-02。 。 。 .
原图书馆深受德文·高维特优秀作品的影响 断取相图 CoffeeScript 库.