gpt4 book ai didi

c++ - 当字符包含表情符号时如何比较字符?

转载 作者:行者123 更新时间:2023-11-28 01:22:06 30 4
gpt4 key购买 nike

总体概述:

我有一个名字列表,每个名字都是一个string&。人们想要对字符串列表执行的一个常见操作是按字母顺序对字符串进行排序。

一种方法是将两个字符串转换为相同的大小写,从每个字符串中的第一个字符开始,然后根据 if (char1 > char2),重复直到被比较的两个字符不相等或到达较短字符串中的最后一个字符。

Emoji 字符总是评估为...interesting... char 值,当使用上述排序算法时,emoji char 总是被排序为出现在 字母数字字符之前。

目标:在纯字母数字字符串之前或之后对表情符号字符串或仅以表情符号开头的字符串进行排序是任意的。我希望能够控制表情符号字符/字符串按字母顺序排序的位置:选择“Z”/“z”之后或“A”/“a”之前

(我并不是说我想控制它们的排序位置以将它们放在其他任意字符(如“p”和“q”之间),我也不是说我的目标是控制如何与其他表情符号相比,表情符号是有序的,只是为了清楚起见。)

一些代码来演示:

bool compareStringsIgnoreCase(std::string& str1, std::string& str2)
{
int i = 0;
while (i < str1.length() && i < str2.length())
{
char firstChar = tolower(first[i]);
char secondChar = tolower(second[i]);

int firstCharAsInt = firstChar;
int secondCharAsInt = secondChar;

if (firstCharAsInt < secondCharAsInt)
return true;
else if (firstCharAsInt > secondCharAsInt)
return false;
i++;
}
return (str1.length() < str2.length());
}

如果使用 str1 = "Abc"str2 = 👍,那么当i = 0,其他取值如下:firstChar = 'a'

secondChar = '\xf0'

firstCharAsInt = 97

secondCharAsInt = -16

根据这些值,firstCharAsInt > secondCharAsInt 是有意义的,因此该函数返回 true,表情符号字符串排在“Abc”字符串之前.同样,我希望能够将表情符号按字母数字字符排序——问题是,如何排序?

我尝试了一些表情符号,它们的“char as int”值总是负数。表情符号在这方面是否与其他 char 不同?如果是这样,那可能是一个简单易行的检查,可以识别它们并将它们放在其他字符之后。也对其他方法持开放态度。

谢谢

最佳答案

表情符号是 Unicode 字符,因此假设您的字符串编码为 UTF-8,那么比较它们的最简单方法是将它们转换为 std::wstring。 .您可以使用 std::codecvt 执行此操作.虽然这在 C++17 中已弃用,但目前没有方便的替代品。

所以,可以这样做:

#include <string>
#include <codecvt>
#include <locale>
#include <cctype>

std::wstring widen (const std::string &s)
{
std::wstring_convert <std::codecvt_utf8 <wchar_t>, wchar_t> convert;
return convert.from_bytes (s);
}

void lower_case_string (std::wstring &ws)
{
for (auto &ch : ws)
ch = tolower (ch);
}

// Return true if s1 == s2 (UTF-8, case insensitive)
bool compare (const std::string &s1, const std::string &s2)
{
std::wstring ws1 = widen (s1);
lower_case_string (ws1);
std::wstring ws2 = widen (s2);
lower_case_string (ws2);
return ws1 == ws2;
}

不过请注意,用于排序的比较函数是 s1 < s2 .

Live demo

关于c++ - 当字符包含表情符号时如何比较字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55660332/

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