gpt4 book ai didi

c++ - utfcpp 的 utf8::next() - 尝试遍历字符串的末尾

转载 作者:行者123 更新时间:2023-11-30 02:37:44 28 4
gpt4 key购买 nike

我正在使用 UTFCPP 处理存储在 std::string 对象中的 UTF-8 编码字符串。

我想遍历代码点。 utf8::下一步()

uint32_t next(octet_iterator& it, octet_iterator end);

似乎是这样做的方法。下面是一个测试程序来说明使用:

std::string u8("Hello UTF-8 \u2610\u2193\u2190\u0394 World!\n");
std::cout << u8 << std::endl;
uint32_t cp = 0;
std::string::iterator b = u8.begin();
std::string::iterator e = u8.end();
while (cp = utf8::next(b,e))
printf("%d, ", cp);

这可以很好地提取所有字符,但是,程序会抛出 NOT_ENOUGH_ROOM 异常,表明“在提取代码点期间等于结束”在打印 10 之后,这是 ASCII 换行控制字符:

Hello UTF-8 ☐↓←Δ World!
72, 101, 108, 108, 111, 32, 85, 84, 70, 45, 56, 32, 9744, 8595, 8592, 916, 32, 87, 111, 114, 108, 100, 33, 10,
terminate called after throwing an instance of 'utf8::not_enough_room'
what(): Not enough space

显然,提供结束迭代器似乎不足以阻止 utf8::next 尝试读取字符串的末尾。

我也对 utf8::unchecked::next() 函数感到困惑,它甚至没有使用结束迭代器。这怎么知道在哪里停止?捕获异常是正常控制流来检测字符串的结尾吗??显然我错过了一些东西。

最佳答案

我认为你有责任在调用 next() 之前检查迭代器是否等于 end()。
这应该可以正常工作而不会抛出异常:

[...]
uint32_t cp = 0;
std::string::iterator b = u8.begin();
std::string::iterator e = u8.end();
while ( b != e ) {
cp = utf8::next(b,e);
printf("%d, ", cp);
}

通常,将异常用于控制流被认为是一种反模式。

关于c++ - utfcpp 的 utf8::next() - 尝试遍历字符串的末尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31487224/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com