如何在javascript中获取字母的重音/变音符号?

Áng*_*gel 9 javascript string diacritics

我想在 javascript 中获取字母的重音/变音符号。

\n

例如:

\n
    \n
  • \xc3\xb1->~
  • \n
  • \xc3\xa1->\xc2\xb4
  • \n
  • \xc3\xa8->`
  • \n
\n

我尝试使用.normalize("NFD"),但它没有返回正确的重音/变音符号

\n
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或任何其他函数给出重音/变音符号而不是组合重音/变音符号

\n

Soc*_*cko 8

简短的回答是因为COMBINING TILDE != TILDE

\n

以下是可能涉及的每个 Unicode 字符\xc3\xb1的细分,例如:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n
象征代码代码点姓名
\xc3\xb1\\u00F1241带波形符的拉丁文小写字母 N
n\\u006E110拉丁文小写字母 N
\xcc\x83\\u0303771组合波浪号
\\u007E126波浪号
\n
\n

为了能够将变音标记与其附加字符分开,您可以使用string.normalizewith"NFD"提供的“规范分解”,将单个字形分解为不同的字符组合,从而产生相同的符号。

\n

有 112 种不同的组合变音符号。我找不到在组合字符和它的单独对应字符之间进行转换的本机方法。您可以寻找一个库或自己编写您想要处理的标记的映射,如下所示:

\n
const combiningMarks = {\n  771: 126, // tilde\n  769: 180, // acute accent\n  768: 96,  // grave accent\n}\n
Run Code Online (Sandbox Code Playgroud)\n

然后分解为单独的字符并查找每个组合字符的关联标记,如下所示:

\n

\r\n
\r\n
const 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
\r\n
\r\n

\n