如何遍历字符串并让字符处于每个位置(有些带有重音),重音不分开?

How to loop through a string and get the character in each position (some with accents) with the accents not sepparated?

提问人:Luis Gallego 提问时间:10/7/2023 最后编辑:Luis Gallego 更新时间:10/7/2023 访问量:51

问:

我必须获取字符串上每个字符的重音数量,因此我正在循环遍历标签文本的字符,我无法将某些重音字符与重音数据库中的字符进行比较,因为它们被拆分为字符和重音,但其他一些重音字符被视为一个字符。<h2>contenteditable= true

let Accents= { 
    /*...*/
    'x': [
            ["x", 0], 
            ["́x́", 1], 
            ["̂x̂", 2], 
            ["ẍ", 2], 
            ["̌x̌", 2], 
            ["ẋ", 1], 
            ["̧x̧", 1], //
            ["̱x̱", 1], 
            ["̣x̣", 1], 
            ["ᶍ", 2] 
        ],
     /*...*/
}

$("button").on("click", function(){
  text= $(".text").text()
  for(e in text){
    console.log(text[e])
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<h2 class= "text" contenteditable= "true">Lorem Ipx́um ẋ</h2>
<button>Log each character</button>

我怎样才能像 ?,我需要这样做才能与 Accents DB 中的字符进行比较。提前致谢

JavaScript UTF-8 比较 ASCII UTF-16

评论

2赞 JosefZ 10/7/2023
你不能。。。Unicode 规范化形式可能会有所帮助,但是最近的 Unicode 数据库中唯一音的 s 是 - (U+1D8D,拉丁文小写字母 X 带腭钩) - (U+1E8B,拉丁文小写字母 X,上面带点) - (U+1E8D,拉丁文小写字母 X 带拼音) - (U+AB56,拉丁文小写字母 X,右下环) - (U+AB57,拉丁文小写字母 X左长 LEG) - (U+AB58, 拉丁文小写字母 X,左腿长,右下环)- (U+AB59,拉丁文小写字母 X,左腿长,衬线x)
0赞 Luis Gallego 10/7/2023
这很有用,我今天不能再投任何评论了,所以我明天会给你的评论投赞成票
0赞 Luis Gallego 10/7/2023
另外,如果我这样做:text= $(“.text”).text().normalize(“NFC”) 它也不起作用,还有其他想法吗?

答:

2赞 Jamie Hutber 10/7/2023 #1

要确定一个字符是否是组合标记,我们可以使用其 Unicode 值。许多组合标记位于 U+0300 到 U+036F(组合变音符号块)范围内,其他组合标记位于其他各种块中,但出于许多语言的目的,此范围将涵盖常见的变音符号。

下面是一个基本实现:

function splitIntoGraphemes(text) {
    let graphemes = [];
    let currentGrapheme = "";

    for (let char of text) {
        // Check if the character is a combining mark
        const codePoint = char.codePointAt(0);
        if (codePoint >= 0x0300 && codePoint <= 0x036F) {
            currentGrapheme += char;
        } else {
            if (currentGrapheme) {
                graphemes.push(currentGrapheme);
            }
            currentGrapheme = char;
        }
    }
    // Push any remaining grapheme
    if (currentGrapheme) {
        graphemes.push(currentGrapheme);
    }

    return graphemes;
}

$("button").on("click", function() {
    const text = $(".text").text();
    // Not sure if you want them, but you could filter out spaces etc here with a regex/replace too if you needed
    const graphemes = splitIntoGraphemes(text);

    for (const grapheme of graphemes) {
        console.log(grapheme);
    }
});

这种方法会将许多基本字符和变音符号的组合视为单个字素。但是,请注意,此方法仅处理组合标记的子集,可能无法处理所有可能的组合字符。如果您正在处理可能包含各种变音符号或其他组合标记的文本,那么库会更彻底。

尽管如此,这应该适用于您的示例和许多涉及常见变音符号的典型用例。

评论

1赞 Luis Gallego 10/7/2023
使用此代码,它仍然记录 x 和 ' sepparated
1赞 Jamie Hutber 10/7/2023
我已经更新了答案,以匹配它。正如你所看到的,我也改变了方法。
0赞 Luis Gallego 10/7/2023
你的上一版确实很好用,为什么你说它只包含几个变音符号?
1赞 Luis Gallego 10/7/2023
我认为即使这样也会得到以下代码的支持:unicode.org/reports/tr15/#Multiple_Mark_Figure