【问题标题】:c++ check utf8 string contain specified charactersc++ 检查 utf8 字符串是否包含指定字符
【发布时间】:2017-12-25 20:42:16
【问题描述】:

给定一个 utf8 字符串,如何知道它包含不允许的指定字符?

需求是utf8字符串只能包含英文字符和中文字符。不允许使用任何其他字符,如符号、数字、空格、'\n' ...。

剂量 std::regex 可以完成这项工作吗?

bool legal(const std::string& s) { // s is utf8 string
   //??
}

【问题讨论】:

  • 您能给我举一个可以包含在UTF-8编码字符串中的汉字的例子吗?
  • 任何汉字,任何英文字符都可以
  • 您可能会发现将所有中文字符放入 UTF-8 编码字符串是一项挑战。
  • 其他一些语言可以做到这一点,比如 python。但我不知道 std::regex 能不能做到这一点。如果不能,似乎唯一的方法是检查汉字的编码范围
  • 您应该遍历字符串,即时将 UTF-8 序列解码为 Unicode 代码点编号;然后将它们与您允许的范围进行比较。

标签: c++ utf-8


【解决方案1】:

您可以将 std::string 转换为 utf32 代码点的向量(如 here 所述),然后对其进行迭代并检查范围(但是我无法提供中文字母的 utf32 值范围,并且从 cmets 上的判断您的问题实际上可能是个问题)。

编辑

如以下评论中所述,如果您知道需要验证的字符在 2 字节范围内,则可以坚持使用 utf16。

【讨论】:

  • 以为你会倾向于使用 UTF-16 和 std::wstring
  • @Bathsheba 正如我在回复中所说的,我对实际的代码范围不是很熟悉,但快速查看stackoverflow.com/questions/9166130/… 表明汉字实际上超出了 2 字节范围,因此,纯粹从方便的角度来看,迭代 utf32 代码点会更通用。
  • 甚至不需要实际转换整个字符串,迭代 UTF-8 字符串中的代码点非常容易(实际上,使用 UTF-8 cpp 之类的库很简单)。
猜你喜欢
  • 2014-07-16
  • 2021-12-20
  • 2011-01-21
  • 1970-01-01
  • 2015-02-07
  • 2012-06-27
  • 2018-10-03
  • 1970-01-01
  • 2011-11-09
相关资源
最近更新 更多