C++;减少特殊字符,如ü; 我在用C++中的ToWORE()函数转换字符串到小写时有困难。对于普通字符串,它可以按预期工作,但是特殊字符无法成功转换
我如何使用我的功能:C++;减少特殊字符,如ü; 我在用C++中的ToWORE()函数转换字符串到小写时有困难。对于普通字符串,它可以按预期工作,但是特殊字符无法成功转换,c++,character-encoding,htmlspecialchars,C++,Character Encoding,Htmlspecialchars,我如何使用我的功能: string NotLowerCase = "Grüßen"; string LowerCase = ""; for (unsigned int i = 0; i < NotLowerCase.length(); i++) { LowerCase += tolower(NotLowerCase[i]); } string NotLowerCase=“Grüßen”; 字符串小写=”; for(无符号整数i=0;i测试 TeST2->TeST2 Grü
string NotLowerCase = "Grüßen";
string LowerCase = "";
for (unsigned int i = 0; i < NotLowerCase.length(); i++) {
LowerCase += tolower(NotLowerCase[i]);
}
string NotLowerCase=“Grüßen”;
字符串小写=”;
for(无符号整数i=0;i
例如:
string NotLowerCase = "Grüßen";
string LowerCase = "";
for (unsigned int i = 0; i < NotLowerCase.length(); i++) {
if(NotLowerCase[i]<65||NotLowerCase[i]>122)
{
LowerCase+='?';
}
else
LowerCase += tolower(NotLowerCase[i]);
}
string NotLowerCase=“Grüßen”;
字符串小写=”;
for(无符号整数i=0;i
我认为最方便的方法是使用用户选择的语言环境,这是通过将语言环境设置为“”
(空字符串)实现的
这将语言环境设置为运行程序时使用的任何语言环境,并影响在多字节字符和宽字符串字符之间转换的标准字符转换例程(&)
然后,您可以使用这些函数将系统/用户选择的多字节字符(如UTF-8
)转换为系统标准的全字符代码,这些字符代码可以在std::tolower
等函数中使用,这些函数一次只能处理一个字符
这一点很重要,因为像UTF-8
这样的多字节字符集不能使用像std::tolower()
这样的单字符操作进行转换
将宽字符串版本转换为大写/小写后,可以将其转换回系统/用户多字节字符集,以便打印到控制台
// Convert from multi-byte codes to wide string codes
std::wstring mb_to_ws(std::string const& mb)
{
std::wstring ws;
std::mbstate_t ps{};
char const* src = mb.data();
std::size_t len = 1 + mbsrtowcs(0, &src, 3, &ps);
ws.resize(len);
src = mb.data();
mbsrtowcs(&ws[0], &src, ws.size(), &ps);
if(src)
throw std::runtime_error("invalid multibyte character after: '"
+ std::string(mb.data(), src) + "'");
ws.pop_back();
return ws;
}
// Convert from wide string codes to multi-byte codes
std::string ws_to_mb(std::wstring const& ws)
{
std::string mb;
std::mbstate_t ps{};
wchar_t const* src = ws.data();
std::size_t len = 1 + wcsrtombs(0, &src, 0, &ps);
mb.resize(len);
src = ws.data();
wcsrtombs(&mb[0], &src, mb.size(), &ps);
if(src)
throw std::runtime_error("invalid wide character");
mb.pop_back();
return mb;
}
int main()
{
// set locale to the one chosen by the user
// (or the one set by the system default)
std::locale::global(std::locale(""));
try
{
string NotLowerCase = "Grüßen";
std::cout << NotLowerCase << '\n';
// convert system/user multibyte character codes
// to wide string versions
std::wstring ws1 = mb_to_ws(NotLowerCase);
std::wstring ws2;
for(unsigned int i = 0; i < ws1.length(); i++) {
// use the system/user locale
ws2 += std::tolower(ws1[i], std::locale(""));
}
// convert wide string character codes back
// to system/user multibyte versions
string LowerCase = ws_to_mb(ws2);
std::cout << LowerCase << '\n';
}
catch(std::exception const& e)
{
std::cerr << e.what() << '\n';
return EXIT_FAILURE;
}
catch(...)
{
std::cerr << "Unknown exception." << '\n';
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
//从多字节码转换为宽字符串码
std::wstring mb_到w(std::string const&mb)
{
std::wstring-ws;
std::mbstate_t ps{};
char const*src=mb.data();
标准:尺寸长度=1+mbsrtowcs(0,&src,3,&ps);
ws.resize(len);
src=mb.data();
mbsrtowcs(&ws[0],&src,ws.size(),&ps);
if(src)
抛出std::runtime_错误(“后面的多字节字符无效:”
+std::string(mb.data(),src)+“'”;
ws.pop_back();
返回ws;
}
//从宽字符串代码转换为多字节代码
std::string ws_to_mb(std::wstring const&ws)
{
std::字符串mb;
std::mbstate_t ps{};
wchar_t const*src=ws.data();
标准::大小长度=1+WCSRM(0,&src,0,&ps);
mb.调整大小(len);
src=ws.data();
wcsrtombs(&mb[0],&src,mb.size(),&ps);
if(src)
抛出std::runtime_错误(“无效的宽字符”);
mb.pop_back();
返回mb;
}
int main()
{
//将区域设置设置为用户选择的区域设置
//(或系统默认设置的)
std::locale::global(std::locale(“”);
尝试
{
字符串NotLowerCase=“Grüßen”;
std::请注意,这适用于ISO-8859-*,但不适用于Unicode。由于它被标记为“htmlspecialcharacters”,Unicode是一个合理的假设。哇,这是toupper->towupper实现的。(我当然将其修改为lower,但现在似乎可以工作)谢谢你的支持!@nÐаn:的确。公平地说,tolower
已经在对字符集进行假设。中文是经典的反例。ISO-8859描述了一组8位字符集,它们共同覆盖了大多数小写字母表。但对于UTF-8来说,情况突然变得更糟了e复杂。不要让我开始了解特定于语言环境的大小写规则;我每个注释只有600个字符。不过,要记住一个简短的示例:ß=>SS。即使在8859-1中,也不能用char-toupper(char)实现这一点。字符串的长度随大写字母的变化而变化!@TVAvanHesteren您不能真正支持多种语言,除非您根据具体情况支持它们各自的特性。您可以支持在多种语言中使用的字符,但前提是您不以任何方式操纵这些字符。将单词改为大写字母,然后再改回大写字母小写可以是。那么,你建议如何解决这个问题或解决这个问题?我需要问题中所述的小写特殊字符。这只是用一个“有效”的问号来代替它们,而这个问号不是要求的。谢谢你的输入。你是否意识到这是不可能正确的,因为ß
translates到SS
,而SS
可以根据上下文翻译成ß
或SS
?是的,我理解并且已经删除了我的评论,很好的回答,伙计们,请继续保持。另外,如果没有这种情况发生,只保留原来的正常“单词”,使用什么是安全的语言?e、 为什么人们总是把完全正常的字母称为“特殊字符”?
string NotLowerCase = "Grüßen";
string LowerCase = "";
for (unsigned int i = 0; i < NotLowerCase.length(); i++) {
if(NotLowerCase[i]<65||NotLowerCase[i]>122)
{
LowerCase+='?';
}
else
LowerCase += tolower(NotLowerCase[i]);
}
std::locale::global(std::locale(""));
// Convert from multi-byte codes to wide string codes
std::wstring mb_to_ws(std::string const& mb)
{
std::wstring ws;
std::mbstate_t ps{};
char const* src = mb.data();
std::size_t len = 1 + mbsrtowcs(0, &src, 3, &ps);
ws.resize(len);
src = mb.data();
mbsrtowcs(&ws[0], &src, ws.size(), &ps);
if(src)
throw std::runtime_error("invalid multibyte character after: '"
+ std::string(mb.data(), src) + "'");
ws.pop_back();
return ws;
}
// Convert from wide string codes to multi-byte codes
std::string ws_to_mb(std::wstring const& ws)
{
std::string mb;
std::mbstate_t ps{};
wchar_t const* src = ws.data();
std::size_t len = 1 + wcsrtombs(0, &src, 0, &ps);
mb.resize(len);
src = ws.data();
wcsrtombs(&mb[0], &src, mb.size(), &ps);
if(src)
throw std::runtime_error("invalid wide character");
mb.pop_back();
return mb;
}
int main()
{
// set locale to the one chosen by the user
// (or the one set by the system default)
std::locale::global(std::locale(""));
try
{
string NotLowerCase = "Grüßen";
std::cout << NotLowerCase << '\n';
// convert system/user multibyte character codes
// to wide string versions
std::wstring ws1 = mb_to_ws(NotLowerCase);
std::wstring ws2;
for(unsigned int i = 0; i < ws1.length(); i++) {
// use the system/user locale
ws2 += std::tolower(ws1[i], std::locale(""));
}
// convert wide string character codes back
// to system/user multibyte versions
string LowerCase = ws_to_mb(ws2);
std::cout << LowerCase << '\n';
}
catch(std::exception const& e)
{
std::cerr << e.what() << '\n';
return EXIT_FAILURE;
}
catch(...)
{
std::cerr << "Unknown exception." << '\n';
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}