在 unicode 字母旁边显示 unicode 重音符号,而不是组合

Display unicode accent mark next to unicode letter, rather than combining

如标题所述,我试图在字母旁边显示 Unicode 重音符号。

此任务来自需要遍历一个字符串,识别一个特殊字符,然后 "simplify" 通过打破重音符号和字母并将它们并排显示(单词正确无所谓,只格式很重要)。

Às --> Aˋs

我已经有了所需的 unicode,所以我不需要识别任何字符。

我正在尝试动态执行此操作,因此我将所有特殊字符 unicode 和替换 unicode 存储在数组中的 objects 中。我不是遍历字符串中的每个字符,而是用我想要的 unicode 字符的新组合全局替换特殊字符的每个实例。请在下面查看我当前的代码:

//String to check for special characters
var string_data = "Às simple as this sounds...it is trivial"

//Array of special(incompatible) characters and replacement unicode characters
var unicodeChars = [
{
    incompatible_unicode_char: "\u00C0",//À
    replace_uni_char_one: "\u0041", //A
    replace_uni_char_two: "\u0300" //ˋ
}
];

//Convert property values from unicodeChars objects to readable characters
for(var i = 0; i< unicodeChars.length;i++){ 
    String.fromCharCode(parseInt(unicodeChars[i].incompatible_unicode_char,16));
    String.fromCharCode(parseInt(unicodeChars[i].replace_uni_char_one,16));
    String.fromCharCode(parseInt(unicodeChars[i].replace_uni_char_two,16));
}

//Iterate through each object in unicodeChars array 
for(var i = 0; i<unicodeChars.length;i++){

  //Creating a string that holds the value of what to replace the special character with
  var replacement_chars = unicodeChars[i].replace_uni_char_one;
  if(unicodeChars[i].replace_uni_char_two != null){
    replacement_chars = replacement_chars + unicodeChars[i].replace_uni_char_two;
  }

  //creating regex object in order to globally replace any occurrence of the special character in the string
  var regex = new RegExp(unicodeChars[i].incompatible_unicode_char, "g");

  //attempting to replace the occurrence 
  string_data = string_data.replace(regex, replacement_chars);
 }

我想要的string_data的最终值是Aˋs simple as this sounds...it is trivial

然而这里的问题是当前的结束值为Às simple as this sounds...it is trivial

所以string_data基本上没有变化,但同时又发生了变化。在调查时,我发现添加字符和重音标记会将它们组合成一个字母。

所以在我的代码中,当我执行以下操作时:replacement_chars = replacement_chars + unicodeChars[i].replace_uni_char_two; 代码自动将 unicodeChars[i].replace_uni_char_two 中的重音符号与 replacement_chars 中的标准字母组合在一起。

我不希望发生这种组合,我希望将它们像 Aˋs 那样并排显示,而不是 Às如何阻止 javascript 自动组合重音符号和标准字母

请记住,我需要保留此代码的当前结构(unicodeCharacters 数组,将 unicode 值转换为字符,然后使用正则表达式执行全局 replace)时间,我希望保持这个解决方案的动态。

How do I stop javascript from automatically combining the accent mark and standard letter?

你怪错系统了,是字体渲染器结合了字形。


在 Javascript 中,只需用空格将标记包围起来,使它们独立。

XRegExp.replace(
    "Às simple as this sounds...it is trivial".normalize('NFD'),
    XRegExp('(\p{Mark})'),
    '  '
)

出现问题是因为您在代码示例中使用 组合字符 而不是 修饰字母 作为重音符,所以只需将 replace_uni_char_two 的值从 \u0300 更改为 \u02CB。为了确认更改解决了问题,运行 这个微不足道的 JavaScript:

console.log('u00C0         : \u00C0');
console.log('u0041 + u0300 : \u0041\u0300  [Uses combining character for grave accent]');
console.log('u0041 + u02cb : \u0041\u02cb [Uses modifier letter for grave accent]');

这是输出:

u00C0         : À
u0041 + u0300 : À  [Uses combining character for grave accent]
u0041 + u02cb : Aˋ [Uses modifier letter for grave accent]

注意:

  • decomposition of +U00C0 (À) 是拉丁文大写字母 A (U+0041) 加上组合重音符号 (U+0300)。
  • COMBINING GRAVE ACCENT (U+0300) 是一个组合字符将与前面的字符组合成一个字形 进行渲染。这是您需要在代码中解决的问题。
  • 相比之下,解决您问题的字符 MODIFIER LETTER GRAVE ACCENT (U+02CB) 在视觉上与 COMBINING GRAVE ACCENT (U+0300) 非常相似,但它是一个 修饰字母 .它将不会与前面的字符组合成一个字形进行渲染。

因此,修复代码的一般方法是:

  • 确定您定义的每个特殊字符的分解,这可能是一个基本字符后跟一个组合字符
  • 获取组合字符修饰符字母对应物。组合字符的 Unicode 名称将包括“COMBINING”,其对应修饰符字母的名称将包括“MODIFIER LETTER”。例如:“COMBINING 重音符”与“修饰符字母 重音符”。
  • unicodeChars 的代码声明中指定 修饰符字母 的值,而不是 组合字符 的值。

有关此重要问题的更多详细信息,请参阅