Áng*_*gel 9 javascript string diacritics
我想在 javascript 中获取字母的重音/变音符号。
\n例如:
\n\xc3\xb1
->~
\xc3\xa1
->\xc2\xb4
\xc3\xa8
->`
我尝试使用.normalize("NFD")
,但它没有返回正确的重音/变音符号
string = "\xc3\xa1"\nstring.normalize("NFD").split("")\n// [\'a\', \'\xcc\x81\']\nstring.normalize("NFD").split("").includes("\xc2\xb4") \n// false\n\'\xcc\x81\' === "\xc2\xb4"\n// false\n
Run Code Online (Sandbox Code Playgroud)\n我想要NFD
或任何其他函数给出重音/变音符号而不是组合重音/变音符号
简短的回答是因为COMBINING TILDE != TILDE
以下是可能涉及的每个 Unicode 字符\xc3\xb1
的细分,例如:
象征 | 代码 | 代码点 | 姓名 |
---|---|---|---|
\xc3\xb1 | \\u00F1 | 241 | 带波形符的拉丁文小写字母 N |
n | \\u006E | 110 | 拉丁文小写字母 N |
\xcc\x83 | \\u0303 | 771 | 组合波浪号 |
~ | \\u007E | 126 | 波浪号 |
为了能够将变音标记与其附加字符分开,您可以使用string.normalize
with"NFD"
提供的“规范分解”,将单个字形分解为不同的字符组合,从而产生相同的符号。
有 112 种不同的组合变音符号。我找不到在组合字符和它的单独对应字符之间进行转换的本机方法。您可以寻找一个库或自己编写您想要处理的标记的映射,如下所示:
\nconst combiningMarks = {\n 771: 126, // tilde\n 769: 180, // acute accent\n 768: 96, // grave accent\n}\n
Run Code Online (Sandbox Code Playgroud)\n然后分解为单独的字符并查找每个组合字符的关联标记,如下所示:
\nconst combiningMarks = {\n 771: 126, // tilde\n 769: 180, // acute accent\n 768: 96, // grave accent\n}\n\nconst startingString = "\xc3\xb1\xc3\xa1\xc3\xa8" // "\\u00F1\\u00E1\\u00E8"\nconst decomposedString = startingString.normalize("NFD") // "\\u006E\\u0303\\u0061\\u0301\\u0065\\u0300"\nconst codepoints = [...decomposedString].map(c => c.codePointAt(0)) // [110, 771, 97, 769, 101, 768]\nconst charsWithFullMarks = codepoints.map(c => combiningMarks[c] || c) // [110, 126, 97, 180, 101, 96]\nconst finalString = String.fromCodePoint(...charsWithFullMarks) // "n~a\xc2\xb4e`"\nconsole.log(finalString);
Run Code Online (Sandbox Code Playgroud)\r\n