c++:如何从字符串中删除代理项 unicode 值?
c++: how to remove surrogate unicode values from string?
如何从 C++ 中的 std::string 中删除代理值?
寻找这样的正则表达式:
string pattern = u8"[\uD800-\uDFFF]";
regex regx(pattern);
name = regex_replace(name, regx, "_");
如何在 C++ 多平台项目(例如 cmake)中做到这一点。
首先,您不能将 UTF-16 代理存储在 std::string
(基于char
)中,您需要 std::u16string
(基于char16_t
) ),或 std::wstring
(基于 wchar_t
)仅 Windows。 Javascript 字符串是 UTF-16 字符串。
对于那些字符串类型,您可以使用:
std::remove_if()
+ std::basic_string::erase()
:
#include <string>
#include <algorithm>
std::u16string str; // or std::wstring on Windows
...
str.erase(
std::remove_if(str.begin(), str.end(),
[](char16_t ch){ return (ch >= 0xd800) && (ch <= 0xdfff); }
),
str.end()
);
std::erase_if()
(仅限 C++20 及更高版本):
#include <string>
std::u16string str; // or std::wstring on Windows
...
std::erase_if(str,
[](char16_t ch){ return (ch >= 0xd800) && (ch <= 0xdfff); }
);
更新:您编辑了问题以更改其语义。最初,您问的是如何 删除 代理人,现在您问的是如何 替换 代理人。您可以使用 std::replace_if()
完成该任务,例如:
#include <string>
#include <algorithm>
std::u16string str; // or std::wstring on Windows
...
std::replace_if(str.begin(), str.end(),
[](char16_t ch){ return (ch >= 0xd800) && (ch <= 0xdfff); },
u'_'
);
或者,如果你真的想要regex-based的方法,你可以使用std::regex_replace()
,例如:
#include <string>
#include <regex>
std::wstring str; // std::basic_regex does not support char16_t strings!
...
std::wstring newstr = std::regex_replace(
str,
std::wregex(L"[\uD800-\uDFFF]"),
L"_"
);
如何从 C++ 中的 std::string 中删除代理值? 寻找这样的正则表达式:
string pattern = u8"[\uD800-\uDFFF]";
regex regx(pattern);
name = regex_replace(name, regx, "_");
如何在 C++ 多平台项目(例如 cmake)中做到这一点。
首先,您不能将 UTF-16 代理存储在 std::string
(基于char
)中,您需要 std::u16string
(基于char16_t
) ),或 std::wstring
(基于 wchar_t
)仅 Windows。 Javascript 字符串是 UTF-16 字符串。
对于那些字符串类型,您可以使用:
std::remove_if()
+std::basic_string::erase()
:#include <string> #include <algorithm> std::u16string str; // or std::wstring on Windows ... str.erase( std::remove_if(str.begin(), str.end(), [](char16_t ch){ return (ch >= 0xd800) && (ch <= 0xdfff); } ), str.end() );
std::erase_if()
(仅限 C++20 及更高版本):#include <string> std::u16string str; // or std::wstring on Windows ... std::erase_if(str, [](char16_t ch){ return (ch >= 0xd800) && (ch <= 0xdfff); } );
更新:您编辑了问题以更改其语义。最初,您问的是如何 删除 代理人,现在您问的是如何 替换 代理人。您可以使用 std::replace_if()
完成该任务,例如:
#include <string>
#include <algorithm>
std::u16string str; // or std::wstring on Windows
...
std::replace_if(str.begin(), str.end(),
[](char16_t ch){ return (ch >= 0xd800) && (ch <= 0xdfff); },
u'_'
);
或者,如果你真的想要regex-based的方法,你可以使用std::regex_replace()
,例如:
#include <string>
#include <regex>
std::wstring str; // std::basic_regex does not support char16_t strings!
...
std::wstring newstr = std::regex_replace(
str,
std::wregex(L"[\uD800-\uDFFF]"),
L"_"
);