Á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\nRun 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.normalizewith"NFD"提供的“规范分解”,将单个字形分解为不同的字符组合,从而产生相同的符号。
有 112 种不同的组合变音符号。我找不到在组合字符和它的单独对应字符之间进行转换的本机方法。您可以寻找一个库或自己编写您想要处理的标记的映射,如下所示:
\nconst combiningMarks = {\n 771: 126, // tilde\n 769: 180, // acute accent\n 768: 96, // grave accent\n}\nRun 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| 归档时间: |
|
| 查看次数: |
1376 次 |
| 最近记录: |