逐个字符迭代Unicode码点

Iterating through Unicode codepoints character by character

本文关键字:Unicode 码点 迭代 字符      更新时间:2023-10-16

我得到了一系列Unicode码点。我真正需要做的是将这些代码点作为一系列字符进行迭代,不是是一系列代码点,并确定每个字符的属性,例如是一个字母,等等。

例如,假设我正在编写一个支持Unicode的文本框,并且用户输入了一个不止一个码点的Unicode字符——例如,"e with diacritic"。我知道这个特定的字符也可以表示为一个代码点,并且可以规范化为这种形式,但我认为这在一般情况下是不可能的。如何实现退格?显然,它不能只是擦除最后一个代码点,因为他们可能刚刚输入了多个代码点。

我如何迭代一堆Unicode码点作为字符?

编辑:ICU提供的Break Iterators似乎正是我所需要的。但是,我没有使用ICU,所以任何关于如何实现我自己的等效功能的参考都是可以接受的答案。

另一个编辑:事实证明Windows API确实提供了这个功能。MSDN不太擅长将所有字符串函数放在一个地方。CharNext是我正在寻找的功能

使用ICU库

http://site.icu-project.org/

例如:

http://icu-project.org/apiref/icu4c/classUnicodeString.html ae3ffb6e15396dff152cb459ce4008f90

是返回字符在字符串中特定字符偏移位置的函数。

UTF8-CPP项目有一堆干净,易于阅读,类似stl的算法来逐码点,逐字符等地迭代Unicode字符串。你可以去看看有没有灵感。

注意,"逐个字符"的方法可能不是很明显。一种简单的方法是迭代标准化形式C的UTF-32字符串,这保证了固定长度的编码。