Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;11字符串开头不区分大小写的比较(unicode)_C++_C++11_Stdstring - Fatal编程技术网

C++ C++;11字符串开头不区分大小写的比较(unicode)

C++ C++;11字符串开头不区分大小写的比较(unicode),c++,c++11,stdstring,C++,C++11,Stdstring,我必须检查特定字符串是否以另一个字符串开头。字符串使用utf8编码,比较应该不区分大小写 我知道这与该主题非常相似,但我不想使用boost库,我更喜欢便携式解决方案(如果“几乎”不可能,我更喜欢面向Linux的解决方案) 在C++11中是否可以使用其regexp库?或者仅仅使用简单的字符串比较方法?我所知道的唯一方法是UTF8/国际化/文化意识,这是一种优秀且维护良好的方法。这是一个适用于*nix或Windows的C/C++库,大量研究都致力于提供一个具有区域性的字符串库,包括快速准确的不区分大

我必须检查特定字符串是否以另一个字符串开头。字符串使用utf8编码,比较应该不区分大小写

我知道这与该主题非常相似,但我不想使用boost库,我更喜欢便携式解决方案(如果“几乎”不可能,我更喜欢面向Linux的解决方案)


在C++11中是否可以使用其regexp库?或者仅仅使用简单的字符串比较方法?

我所知道的唯一方法是UTF8/国际化/文化意识,这是一种优秀且维护良好的方法。这是一个适用于*nix或Windows的C/C++库,大量研究都致力于提供一个具有区域性的字符串库,包括快速准确的不区分大小写的字符串比较


恕我直言,除非你在写论文,否则你不应该自己写两件事,那就是加密和区域性敏感字符串库。

使用stl正则表达式类,你可以做如下代码片段。不幸的是,它不是utf8。将
str2
更改为
std::wstring str2=L“hello World”
会导致大量转换警告。使str1成为std::wchar根本不起作用,因为std::regex不允许whar输入(据我所知)

#包括
#包括
#包括
int main()
{
//输入字符串
std::string str1=“你好”;
std::string str2=“你好世界”;
//使用大小写不敏感定义正则表达式
std::regex regx(str1,std::regex_常量::icase);
//只在开始时搜索
std::regex_常量::match_flag_type fl=std::regex_常量::match_continuous;
//显示一些输出

std::cout对您正在查找的字符串中的内容有任何限制吗 for?它是用户输入,可以是任何UTF-8字符串,问题是 非常复杂。正如其他人提到的,一个角色可以有 几种不同的表示法,因此您可能需要进行规范化 首先是字符串。然后:什么算相等?应该比较
'E'
等于
“é”(这在法语中的某些圆圈中很常见),或者不等于(这是 将符合国家临时立法的“官方”规则)

对于除最琐碎的定义外的所有定义,滚动您自己的意愿 这是一项重大的努力。对于这类事情,图书馆 是引用。它包含您需要的所有内容。但是请注意 它在UTF16上工作,而不是UTF8,因此您必须转换字符串
首先,还要对它们进行规范化。(ICU支持这两种技术。)

为什么不使用boost(它在当今所有开发机器上都是标准的)。尝试一个兼容unicode的可移植字符串库,如ICU。不过,我真的不明白为什么您可以使用一个可移植解决方案而不能使用另一个。这看起来可能很简单,但问题远比您想象的多。首先,视觉字符有许多不同的表示形式:例如,字符
有自己的表示形式代码点,但也可以通过使用字符
e
后跟锐重音代码点来实现。您的解决方案需要注意这一点。第二,不区分大小写的比较通常采用字符串和大小写。这实际上是一个区分区域设置的操作:例如,德语字母
ß
是<>代码> SS< <代码>及其大写版本是 St<代码>。换句话说,你当然不想为Unicode字符串操作翻滚自己的库,因为C++没有内置的特性,所以你必须选择你的毒药。好。学习手工做是出于一个很好的原因。但是ONC。e你接触到真实世界stl/boost是必不可少的。我不确定只有这两个,但我完全同意这不是一个可能正确的事情!非常不幸的是,它决定使用UTF-16。我希望有一个版本的库可以直接处理UTF-8:xI必须过滤掉一个姓名列表s、 它们可以包含任何基于拉丁语的字母表中的字符。我认为每个国家的字符(如é)都有自己的大写变体。并且应该只与之相等。@MiniKarol字符之间的等价性非常依赖于地区。在法语中,这是很常见的(尽管不是很好的做法)省略大写重音,因此
'E'
将是
'E'
'E'
'è'
'è'
'E'
的(模糊)大写。在瑞士德语中,
'Ae
的标准大写。(请注意,大写字母需要两个代码点,而小写字母可能只是一个代码点。)@MiniKarol更不用说德语的
“ß”
,其大写形式取决于单词(至少根据Duden)。您可以通过转换为规范化形式D并忽略文本中的各种组合重音来完全忽略重音;这是一个简单的方法(但不太准确)解决方案,但在大写和小写的代码点数量不同的情况下仍然不起作用。没错。但在我的回答中,我说std::regex不适用于wchar,所以我希望这是一个有效的答案,因为它回答了第一个问题“否”问题是,utf-8使用一个常规的
std::string
,所以
char
。所以我们有一个基于chars的utf8实现,这意味着一个utf8符号可以表示为一个长度为1-4的字符串。utf8单词看起来像“正常”吗字符串,因此可以由正则表达式类处理?好的,不区分大小写不起作用,但理论上……它可以与正则表达式类一起处理许多正则表达式。例如,
(.*?)
将愉快地捕获
名称
标记中的所有内容,utf-8与否。如何
#include <regex>
#include <iostream>
#include <string>

int main()
{
    //The input strings
    std::string str1 = "Hello";
    std::string str2 = "hello World";

    //Define the regular expression using case-insensitivity
    std::regex regx(str1, std::regex_constants::icase);

    //Only search at the beginning 
    std::regex_constants::match_flag_type fl = std::regex_constants::match_continuous;

    //display some output
    std::cout << std::boolalpha << std::regex_search(str2.begin(), str2.end(), regx, fl) << std::endl;

    return 0;
}