从 std::string 中提取(第一个)UTF-8 字符

2024-04-16

我需要使用一个PHP mb_strtoupper 函数的 C++ 实现 http://www.zedwood.com/article/cpp-utf8-mb_strtoupper-function模仿维基百科的行为。

我的问题是,我只想喂一个single函数的 UTF-8 字符,即 std::string 的第一个字符。

std::string s("äbcdefg");
mb_strtoupper(s[0]); // this obviously can't work with multi-byte characters
mb_strtoupper('ä'); // works

有没有一种有效的方法来检测/返回字符串的第一个 UTF-8 字符?


在 UTF-8 中,第一个字节的高位告诉您有多少后续字节是同一字节的一部分代码点.

0b0xxxxxxx: this byte is the entire code point
0b10xxxxxx: this byte is a continuation byte - this shouldn't occur at the start of a string
0b110xxxxx: this byte plus the next (which must be a continuation byte) form the code point
0b1110xxxx: this byte plus the next two form the code point
0b11110xxx: this byte plus the next three form the code point

可以假设该模式继续存在,但我认为有效的 UTF-8 不会使用超过四个字节来表示单个代码点。

如果您编写一个函数来计算设置为 1 的前导位的数量,那么您可以使用它来确定在何处分割字节序列,以便隔离第一个逻辑代码点(假设输入是有效的 UTF-8)。如果您想针对无效的 UTF-8 进行强化,则必须编写更多代码。

另一种方法是利用连续字节始终与模式匹配的事实0b10xxxxxx,因此您获取第一个字节,然后只要下一个字节与该模式匹配就继续获取字节。

std::size_t GetFirst(const std::string &text) {
  if (text.empty()) return 0;
  std::size_t length = 1;
  while ((text[length] & 0b11000000) == 0b10000000) {
    ++length;
  }
  return length;
}

对于许多语言,单个代码点通常映射到单个字符。但人们所认为的单个字符可能更接近 Unicode 所说的字素簇,它是一个或多个代码点组合起来产生一个字形。

在你的例子中,ä可以用不同的方式表示:它可以是单个代码点U+00E4 LATIN SMALL LETTER A WITH DIAERESIS or它可能是以下的组合U+0061 LATIN SMALL LETTER A and U+0308 COMBINING DIAERESIS。幸运的是,只需选择第一个代码点就可以实现将第一个字母大写的目标。

如果你确实需要第一个字素簇,您必须超越第一个代码点来查看下一个代码点是否与其结合。对于许多语言来说,知道哪些代码点是“非空格”或“组合”或变体选择器就足够了。对于一些复杂的脚本(例如韩文?),您可能需要转向此Unicode 联盟技术报告 http://unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 std::string 中提取(第一个)UTF-8 字符 的相关文章

随机推荐

  • 使用连续内存并具有保留功能的映射和集合

    我使用了几张地图和套件 缺乏连续内存以及大量的分配 解除 是性能瓶颈 我需要一个主要与 STL 兼容的映射和集合类 它可以将连续的内存块用于内部对象 或多个块 它还需要有一个reserve函数 以便我可以预先分配预期的大小 在我自己编写之前
  • 如何在循环期间的任意时刻检查按键按下情况?

    我正在尝试制作一个倒数到 0 然后开始向上计数的计时器 我正在使用时间和键盘模块 这keyboard https pypi org project keyboard来自 PyPi 的模块 一切都按预期进行 我可以按一个按钮关闭程序 但它只在
  • C# Linq where 子句作为变量

    我正在尝试创建一个 LINQ 语句 其中 where 子句来自变量 例如 string whereClause address zip 23456 var x from something in someList where whereCl
  • 如何使可变参数模板类方法将函数指针作为参数,并使用从函数模板派生的类型?

    抱歉 标题很拗口 我正在研究一个类似于所讨论的数组类here https stackoverflow com questions 26766617 我想定义一个 映射 函数 它接受用户定义的函数并将其应用于数组的每个元素 出于类型检查的目的
  • 表单标签的 CSS 样式

    据我所知 一个
  • Java、HashMap 和使用字符串作为键 - 字符串值是否会存储两次?

    如果我有一个如下所示的 HashMap HashMap
  • Viewpager 延迟加载数据

    ViewPager有一个公共函数setOffscreenPageLimit http developer android com reference android support v4 view ViewPager html setOff
  • MVC 3 列表的不引人注目的验证

    Question 我创建了一个服务器端属性级别验证属性 但我没有将其应用于单个字段 而是将其应用于列表 这使我能够从整体上验证模型 我现在需要知道如何使用 MVC 3 中内置的不显眼的客户端验证将其转换为工作 我当前的代码如下来说明我的问题
  • div背景图片+jquery的幻灯片

    我在标题处有一个大的 div 元素 div 中有很多文本内容和一些框 我有一个大的 img 作为这个 div 的背景 现在我需要为这个 div 的背景制作一个幻灯片 如何为 div 的背景图像制作幻灯片 我研究了很多 但找不到任何东西 多谢
  • Bash if 语句中何时需要方括号?

    通常 我在 if 语句中使用方括号 if name Bob then 但是 当我检查是否grep成功了我不使用方括号 if grep q text file then 什么时候需要方括号if陈述 方括号是同义词test命令 一个if语句检查
  • 分层代码优先 EF 绑定到 WPF Treeview...不可能

    在过去 我不得不求助于使用数据集和数据表 因为使用绑定来做到这一点仍然让我困惑 顶层 我在 VB 2012 中创建了一系列类 对它们进行了注释 并使用 Code First 在 EF6 中创建了 EF 模型 这个想法是表示路由器配置 配置的
  • 随机值生成 JavaScript

    我有一些代码用于将数组中的随机值存储到变量中 如下所示 Quest value1 value2 value3 value4 var random Math floor Math random Quest length var questio
  • 将控制台窗口添加到 ASP.NET Core 应用程序

    我有一个 ASP NET Core 2 0 应用程序在 NET Core 2 0 中的 Windows 上运行 命令行 C Program Files dotnet dotnet exe 执行 C Users zippy documents
  • 如何在 mysql 查询中将行放在顶部。

    您好 我的 SQL 表中有 100 条记录 我想按名称对它们进行 ASC 排序 但我需要在所有记录 nr 43 之上添加一条记录 有没有办法我可以先拉出这个记录 43 然后再按名称按 ASC 顺序排列其他所有内容 技巧是在一个查询中完成它
  • SSL 会话票证与会话 ID

    为了提高不保留 短 连接的 SSL 握手性能 有两个广为人知的独立功能 TLS 会话 ID TLS 会话票证 如果有很多短连接会话 就性能开销而言 哪种机制更可取并且应该使用 我知道服务器需要缓存会话 ID 并且在负载平衡的情况下会话票证也
  • 不在 In SQL 语句中?

    我在Excel中有一组大约5000个ID 在表中我有大约30000个ID 如果我在SQL语句中使用 In 条件 我将从Excel中拥有的ID中获得大约4300个ID 但是如果我将 Not In 与 Excel id 一起使用 我已经获得了大
  • node.js axios 下载文件流和 writeFile

    我想下载一个 pdf 文件axios并保存在磁盘 服务器端 上fs writeFile 我努力了 axios get https xxx my pdf responseType blob then response gt fs writeF
  • 四元数到欧拉角算法 - 如何转换为“Y = Up”和旋手性之间的转换?

    我有一个在四元数和欧拉角之间转换的算法 public static Vector3 ToEulerAngles this Quaternion q Store the Euler angles in radians Vector3 pitc
  • 在不同的数据集上运行经过训练的机器学习模型

    我是机器学习的新手 正在尝试在另一个相同格式的数据集上运行一个简单的分类模型 该模型是我使用 pickle 训练和保存的 我有以下 python 代码 Code Training set features pd read csv Data
  • 从 std::string 中提取(第一个)UTF-8 字符

    我需要使用一个PHP mb strtoupper 函数的 C 实现 http www zedwood com article cpp utf8 mb strtoupper function模仿维基百科的行为 我的问题是 我只想喂一个sing