概述:
我有一个名字列表,每个名字都是一个string&
。一个想要处理的字符串列表的常见操作是按字母顺序对字符串进行排序。
执行此操作的一种方法是将两个字符串都转换为相同的大小写,从每个字符串中的第一个字符开始,然后对这些字符进行求值,以查看if (char1 > char2)
行中字母中的第一个,重复直到被比较的两个字符不相等或直到到达较短字符串中的最后一个字符为止。
表情符号字符总是求值... 有趣的 ... char
值,当使用上述排序算法时,表情符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
,并且emoji字符串被排序为在“ Abc”字符串之前。同样,我想做的是将表情符号按字母数字字符排序-问题是,如何?
我尝试了几种表情符号,它们的“ char as int”值始终为负。这样,表情符号是否与其他char
不同?如果是这样,那可能是一个简单容易的检查,可以识别出它们是否将它们放置在其他字符之后。也可以接受其他方法。
谢谢
答案 0 :(得分:2)
表情符号是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
。
答案 1 :(得分:0)
要回答我提出的方法:表情符号不是唯一,因为它们的“ char as int”值是负数。
其他符号,例如“§”,也取负数,在这种情况下为-62,因此在字母数字字符之前排序。
检查这些负值并将它们作为目标以影响其排序顺序可以更改表情符号的排序顺序,但是也会更改其他无关字符的排序顺序< / em>,这使该方法无法完美解决最初的目标。
一种简单而干净的方法是将“ char as int”值转换为unsigned ints
。在二进制补码之后,负值将转换为高正值,从而在其他正值之后进行排序。