如何使用带有特殊unicode字符的子串?
How to use substring with special unicode characters?
var string = "abc";
var lastchar = string.substr(string.length - 1);
console.log(lastchar);
这个returns?而不是
在JavaScript中,字符串是一系列UTF-16编码单元(详见my blog post What is a string?)。在 UTF-16 中,最后一个字形(松散地称为“字符”)需要两个代码单元(它们组合成一个代码 point),因此您的字符串长度为 5.
在 ES2015 之前,JavaScript 中并没有太多的内置功能来帮助你解决这个问题,但是当引入可迭代性时,字符串变得可迭代,并且它们会迭代它们的 代码点 ,不是代码单位。传播操作使用迭代,因此您可以将该字符串传播到一个数组中以获取其代码点:
const string = "abc";
console.log(string.length); // 5
const chars = [...string];
console.log(chars.length); // 4
const lastchar = chars.slice(chars.length - 1).join("");
console.log(lastchar);
这只是一个示例,用于说明区别以及如何相当轻松地使用代码点。
甚至代码点也不一定是字形,因为一些代码点 与其他代码点组合 形成一个单一的字形。 (例如,在 Devanagari, the word for the language is "देवनागरी" which looks like five glyphs to native readers, but is eight code points because some of them are written with a base syllable glyph modified by a vowel code point after.) There's a new Intl.Segmenter
正在开发中,这也有助于解决这些情况。
var string = "abc";
var lastchar = string.substr(string.length - 1);
console.log(lastchar);
这个returns?而不是
在JavaScript中,字符串是一系列UTF-16编码单元(详见my blog post What is a string?)。在 UTF-16 中,最后一个字形(松散地称为“字符”)需要两个代码单元(它们组合成一个代码 point),因此您的字符串长度为 5.
在 ES2015 之前,JavaScript 中并没有太多的内置功能来帮助你解决这个问题,但是当引入可迭代性时,字符串变得可迭代,并且它们会迭代它们的 代码点 ,不是代码单位。传播操作使用迭代,因此您可以将该字符串传播到一个数组中以获取其代码点:
const string = "abc";
console.log(string.length); // 5
const chars = [...string];
console.log(chars.length); // 4
const lastchar = chars.slice(chars.length - 1).join("");
console.log(lastchar);
这只是一个示例,用于说明区别以及如何相当轻松地使用代码点。
甚至代码点也不一定是字形,因为一些代码点 与其他代码点组合 形成一个单一的字形。 (例如,在 Devanagari, the word for the language is "देवनागरी" which looks like five glyphs to native readers, but is eight code points because some of them are written with a base syllable glyph modified by a vowel code point after.) There's a new Intl.Segmenter
正在开发中,这也有助于解决这些情况。