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

时间:2018-11-08 14:38:16

标签: javascript unicode unicode-string

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

此任务来自需要遍历字符串,识别特殊字符,然后通过破坏重音符号和字母并排显示它们(单词正确无所谓,仅格式化才有意义)来“简化”它。

Às --> Aˋs

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

我试图动态地执行此操作,因此我已将所有特殊字符unicode和替换unicode存储在数组内的对象中。我要遍历字符串中的每个单个字符,而不是用我想要的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),并我希望此解决方案保持当前的动态。

2 个答案:

答案 0 :(得分:1)

  

如何阻止javascript自动结合重音符号和标准字母?

您指责错误的系统,是结合了字形的字体渲染器。


在Javascript中,只需用空格将标记括起来,以便它们独立存在。

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

答案 1 :(得分:1)

出现问题是因为您在代码示例中使用了组合字符而不是修饰符来表示重音符号,因此只需更改{{1 }}从replace_uni_char_two\u0300。要确认更改已解决问题,请运行以下普通JavaScript:

\u02CB

以下是输出:

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]');

请注意:

  • decomposition of +U00C0u00C0 : À u0041 + u0300 : À [Uses combining character for grave accent] u0041 + u02cb : Aˋ [Uses modifier letter for grave accent] )是拉丁文大写字母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 GRAVE ACCENT”与“ MODIFIER LETTER GRAVE ACCENT”。
  • À的代码声明中,指定修饰语字母的值,而不是组合字符

有关此重要问题的更多详细信息,请参见What is the difference between “combining characters” and “modifier letters”?