gpt4 book ai didi

html - 如何检测 C++ 字符串中的 "​"(unicode 的组合)

转载 作者:搜寻专家 更新时间:2023-10-31 02:05:50 24 4
gpt4 key购买 nike

我正在尝试检测一些 Unicode 字符的组合(如 ​)以清理字符串,对于单个 Unicode 字符,它正在检测但 Unicode 组合未检测到。

我使用这些字符串从另一个需要清理的 HTML 页面制作 HTML 页面。我只想清理具有这种 unicode 的字符串,这些 un​​icode 在浏览器的 html 页面中甚至不可见。

下面是示例代码:

void detect_Unicode(string& str) { 

if(!str.empty() && str.find_first_not_of(" \t\n\r\f\v\u00A0\u00C2\u00E2\u20AC\u2039")==string::npos)
str.assign(" ");
return;
}

输入字符串:

1. " ​    ​ " ;
2. "are   there is something    ​ combination ​"
3. " Â Â "
4. "​   ​"
5 . "Â Â â â"

预期输出:

1. " "  
2. "are   there is something    ​ combination ​"
3. " "
4. " "
5. " "

也请告诉我其他方法。

最佳答案

好的,根据上面的评论,我认为输入字符串很可能是 UTF-8(毕竟,在 HTML 上下文中,它还会是什么?)。

在此基础上,我谦虚地提交:

#include <string>
#include <codecvt>
#include <locale>

std::string narrow (const std::wstring& ws)
{
std::wstring_convert <std::codecvt_utf8 <wchar_t>, wchar_t> convert;
return convert.to_bytes (ws);
}

std::wstring widen (const std::string& s)
{
std::wstring_convert <std::codecvt_utf8 <wchar_t>, wchar_t> convert;
return convert.from_bytes (s);
}

std::string detect_Unicode (const std::string& s)
{
std::wstring ws = widen (s);
if (ws.empty() || ws.find_first_not_of (L" \t\n\r\f\v\u00A0\u00C2\u00E2\u20AC\u2039") != std::wstring::npos)
return " ";
return s;
}

#include <iostream>

int main ()
{
std::cout << narrow (L"\u00A0 \u00C2 \u00E2 \u20AC \u2039\n\n");
std::cout << "0.\t\"" << detect_Unicode (u8"abcde") << "\"\n";
std::cout << "1.\t\"" << detect_Unicode (u8" ​ ​ ") << "\"\n";
std::cout << "2.\t\"" << detect_Unicode (u8"are   there is something    ​ combination ​") << "\"\n";
std::cout << "3.\t\"" << detect_Unicode (u8" Â Â ") << "\"\n";
std::cout << "4.\t\"" << detect_Unicode (u8"​   ​") << "\"\n";
std::cout << "5.\t\"" << detect_Unicode (u8"Â Â â â") << "\"\n";
}

输出:

  Â â € ‹

0. " "
1. " ​ ​ "
2. " "
3. " Â Â "
4. "​   ​"
5. "Â Â â â"

现在这不是 OP 期望的输出,但我认为这仅仅是因为 detect_Unicode()逻辑(与实现相反)看起来有缺陷。这里的要点是,将输入字符串转换为宽字符串意味着您可以可靠地对其使用标准 basic_string 操作,因为现在没有多字节问题。

detect_Unicode() 的另一种略微激进的实现可能是:

for (auto wide_char : ws)
{
if (wide_char > 0xff)
return " ";
}
return s;

但实际上,现在您有一个宽字符串要提交 detect_Unicode,一切皆有可能,所以尽情发挥吧。

其他说明:

  • std::codecvt 在 C++17 中已弃用,但由于没有其他明显的选择,您不妨使用它。如果需要,您可以随时更改 narrowwiden 的实现。
  • 根据平台的不同,std::wstring 可能不是最佳选择,但可能还不错。您还可以查看 std::u16stringstd::u32string

Live demo .

灵感来自 here .

关于html - 如何检测 C++ 字符串中的 "​"(unicode 的组合),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51210723/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com