如标题所示,我正在尝试在字母旁边显示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
),并我希望此解决方案保持当前的动态。
答案 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]');
请注意:
u00C0 : À
u0041 + u0300 : À [Uses combining character for grave accent]
u0041 + u02cb : Aˋ [Uses modifier letter for grave accent]
)是拉丁文大写字母A(U + 0041)加上合并重音符(U + 0300)。 因此,修复代码的一般方法是:
À
的代码声明中,指定修饰语字母的值,而不是组合字符。 有关此重要问题的更多详细信息,请参见What is the difference between “combining characters” and “modifier letters”?