在 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
的代码声明中指定 修饰符字母 的值,而不是 组合字符 的值。
有关此重要问题的更多详细信息,请参阅
如标题所述,我试图在字母旁边显示 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
的代码声明中指定 修饰符字母 的值,而不是 组合字符 的值。
有关此重要问题的更多详细信息,请参阅