Skip to content

Instantly share code, notes, and snippets.

@k10526
Created March 8, 2020 13:57
Show Gist options
  • Save k10526/8a3cf7eadf098ad74ee16eb51430f43d to your computer and use it in GitHub Desktop.
Save k10526/8a3cf7eadf098ad74ee16eb51430f43d to your computer and use it in GitHub Desktop.
unicode
const forEachChar = (str, fn) => {
if (str.length === 0) {
return;
}
const iter = str[Symbol.iterator]();
let it = iter.next();
let prev = it.value;
do {
it = iter.next();
const char = it.value;
if (isCombiningMark(char)) {
prev += char;
} else {
if (fn(prev) === false) {
return;
}
prev = char;
}
} while (!it.done);
};
const charArrayLength = (str) => {
let len = 0;
forEachChar(str, () => {
len++;
});
return len;
};
const toCharArray = (str) => {
const arr = [];
forEachChar(str, (char) => {
arr.push(char);
});
return arr;
};
const transCharArrayOffset = (str, originOffset) => {
let i = 0;
forEachChar(str, (char) => {
if (originOffset <= 0) {
return false;
}
originOffset -= char.length;
i++;
});
return i;
};
const REG_COMBINING_MARK = /[\u0300-\u036f\u1ab0-\u1aff\u1dc0-\u1dff\u20d0-\u20ff\ufe20-\ufe2f]/;
const isCombiningMark = (character) => {
return REG_COMBINING_MARK.test(character);
};
toCharArray("1🧡2");
toCharArray("H̹̙̦̮͉̩̗̗ͧ̇̏̊̾Eͨ͆͒̆ͮ̃͏̷̮̣̫̤̣ ̵̞̹̻̀̉̓ͬ͑͡ͅCͯ̂͐͏̨̛͔̦̟͈̻O̜͎͍͙͚̬̝̣̽ͮ͐͗̀ͤ̍̀͢M̴̡̲̭͍͇̼̟̯̦̉̒͠Ḛ̛̙̞̪̗ͥͤͩ̾͑̔͐ͅṮ̴̷̷̗̼͍̿̿̓̽͐H̙̙̔̄͜");
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment