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"_"
);