gpt4 book ai didi

c++ - 在 C++ 中使用 UTF-8 字符串正确检查回文

转载 作者:行者123 更新时间:2023-12-01 23:21:59 24 4
gpt4 key购买 nike

尝试回答问题时,How to use enqueu, dequeue, push, and peek in a Palindrome? ,我建议可以使用 std::string 通过以下方式找到回文:

bool isPalindrome(const std::string str)
{
return std::equal(str.begin(), str.end(), str.rbegin(), str.rend());
}

对于 Unicode 字符串,我建议:

bool isPalindrome(const std::u8string str)
{
std::u8string rstr{str};

std::reverse(rstr.begin(), rstr.end());

return str == rstr;
}

我现在认为当字符串中有多字节字符时这会产生问题,因为多字节字符的字节顺序也是颠倒的。此外,某些字符在不同的语言环境中将彼此等效。因此,在 C++20 中:

  1. 如何使比较对多字节字符具有鲁棒性?
  2. 当多个字符之间可能存在等效性时,您如何使比较对不同的语言环境具有鲁棒性?

最佳答案

反转 Unicode 字符串变得非常重要。从 UTF-8 转换为 UTF-32/UCS-4 是一个好的开始,但它本身还不够——Unicode 也有组合代码点,所以两个(或更多)连续的代码点形成一个单一的结果字素(添加的代码point(s) add(s) diacritic marking to the base character),为了让事情正常工作,你需要保持这些顺序正确。

因此,基本上不是代码点,而是需要将输入分成一系列字素,并反转字素的顺序,而不仅仅是代码点。

要处理表示相同字符序列的多个不同代码点序列,您通常需要进行规范化。有四种不同的规范化形式。在这种情况下,您可能想要使用 NFC 或 NFD(对于此目的应该是等效的)。 NFKC/NFKD 形式主要是为了与其他字符集兼容,这听起来您可能并不关心。

不过,这也可能很重要。仅举一个众所周知的例子,考虑德语字符“ß”。这有点等同于“ss”,但仅以小写形式存在,因为它从不出现在单词的开头。因此,关于 Ssaß 之类的东西是否是回文可能存在争论的余地(暂时忽略它实际上不是单词的次要细节)。对于回文,大多数人会忽略字母大小写,所以它会是——但问题中的代码似乎将大小写视为重要的,在这种情况下,它可能不应该如此。

关于c++ - 在 C++ 中使用 UTF-8 字符串正确检查回文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67973548/

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