/* * Copyright (c) 2021 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "string_ex.h" #include "unicode_ex.h" #include "utils_log.h" #include "securec.h" #include #include #include using namespace std; namespace OHOS { string UpperStr(const string& str) { string upperString = str; transform(upperString.begin(), upperString.end(), upperString.begin(), ::toupper); return upperString; } string LowerStr(const string& str) { string lowerString = str; transform(lowerString.begin(), lowerString.end(), lowerString.begin(), ::tolower); return lowerString; } string ReplaceStr(const string& str, const string& src, const string& dst) { if (src.empty()) { return str; } string::size_type pos = 0; string strTmp = str; while ((pos = strTmp.find(src, pos)) != string::npos) { strTmp.replace(pos, src.length(), dst); pos += dst.length(); } return strTmp; } string TrimStr(const string& str, const char cTrim /*= ' '*/) { if (str.size() == 1 && str[0] == cTrim) { return string{}; } string strTmp = str; std::string::size_type firstBound = strTmp.find_first_not_of(cTrim); if (firstBound != std::string::npos) { strTmp.erase(0, firstBound); } std::string::size_type lastBound = strTmp.find_last_not_of(cTrim); if (lastBound != std::string::npos && lastBound != strTmp.size() - 1) { strTmp.erase(lastBound + sizeof(char)); } return strTmp; } string DexToHexString(int value, bool upper /*= true*/) { stringstream ioss; string hexString; if (upper) { ioss << setiosflags(ios::uppercase) << hex << value; } else { ioss << hex << value; } ioss >> hexString; return hexString; } void SplitStr(const string& str, const string& sep, vector& strs, bool canEmpty, bool needTrim) { strs.clear(); string strTmp = needTrim ? TrimStr(str) : str; string strPart; while (true) { string::size_type pos = strTmp.find(sep); if (string::npos == pos || sep.empty()) { strPart = needTrim ? TrimStr(strTmp) : strTmp; if (!strPart.empty() || canEmpty) { strs.push_back(strPart); } break; } else { strPart = needTrim ? TrimStr(strTmp.substr(0, pos)) : strTmp.substr(0, pos); if (!strPart.empty() || canEmpty) { strs.push_back(strPart); } strTmp = strTmp.substr(sep.size() + pos, strTmp.size() - sep.size() - pos); } } } bool StrToInt(const string& str, int& value) { if (str.empty() || (!isdigit(str.front()) && (str.front() != '-'))) { return false; } char* end = nullptr; errno = 0; auto addr = str.c_str(); auto result = strtol(addr, &end, 10); /* 10 means decimal */ if ((end == addr) || (end[0] != '\0') || (errno == ERANGE) || (result > INT_MAX) || (result < INT_MIN)) { return false; } value = static_cast(result); return true; } bool IsNumericStr(const string& str) { if (str.empty()) { return false; } for (const auto& c : str) { if (!isdigit(c)) { return false; } } return true; } bool IsAlphaStr(const string& str) { if (str.empty()) { return false; } for (const auto& c : str) { if (!isalpha(c)) { return false; } } return true; } bool IsUpperStr(const string& str) { if (str.empty()) { return false; } for (const auto& c : str) { if (!isupper(c)) { return false; } } return true; } bool IsLowerStr(const string& str) { if (str.empty()) { return false; } for (const auto& c : str) { if (!islower(c)) { return false; } } return true; } bool IsSubStr(const string& str, const string& sub) { if (sub.empty() || str.empty()) { return false; } return str.find(sub) != string::npos; } string::size_type GetFirstSubStrBetween(const string& str, const string& left, const string& right, string& sub) { string::size_type leftPos = str.find(left); if (leftPos == string::npos) { return string::npos; } string::size_type rightPos = str.find(right, leftPos + left.length()); if (rightPos == string::npos) { return string::npos; } sub = str.substr((leftPos + left.length()), (rightPos - (leftPos + left.length()))); return rightPos; } void GetSubStrBetween(const string& str, const string& left, const string& right, vector& sub) { string subString; string strTmp = str; string::size_type pos = GetFirstSubStrBetween(strTmp, left, right, subString); while (pos != string::npos) { sub.push_back(subString); strTmp = strTmp.substr(pos); pos = GetFirstSubStrBetween(strTmp, left, right, subString); } } bool IsSameTextStr(const string& first, const string& second) { return UpperStr(first) == UpperStr(second); } /* * utf8 rule: * 0000 ~ 007F : 0xxxxxxx * 0080 ~ 07FF : 110xxxxx 10xxxxxx * 0800 ~ FFFF : 1110xxxx 10xxxxxx 10xxxxxx * 10000 ~ 1FFFFF : 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */ bool IsAsciiString(const string& str) { size_t strLen = str.length(); for (size_t i = 0; i < strLen; ++i) { if ((str[i] & 0x80) != 0) { return false; } } return true; } #ifndef IOS_PLATFORM u16string Str8ToStr16(const string& str) { u16string str16Value; if (!String8ToString16(str, str16Value)) { return u16string(); } return str16Value; } string Str16ToStr8(const u16string& str16) { string str8Value; if (!String16ToString8(str16, str8Value)) { return string(); } return str8Value; } #endif } // namespace OHOS