如何使用 boost::spirit 匹配 unicode 字符?

2023-11-24

如何使用 utf8 unicode 字符匹配boost::spirit?

例如,我想识别这个字符串中的所有字符:

$ echo "На берегу пустынных волн" | ./a.out
Н а б е р е гу п у с т ы н н ы х в о л н

当我尝试这个简单的boost::spirit程序将无法正确匹配 unicode 字符:

#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/support_istream_iterator.hpp>
#include <boost/foreach.hpp>
namespace qi = boost::spirit::qi;

int main() {
  std::cin.unsetf(std::ios::skipws);
  boost::spirit::istream_iterator begin(std::cin);
  boost::spirit::istream_iterator end;

  std::vector<char> letters;
  bool result = qi::phrase_parse(
      begin, end,  // input     
      +qi::char_,  // match every character
      qi::space,   // skip whitespace 
      letters);    // result    

  BOOST_FOREACH(char letter, letters) {
    std::cout << letter << " ";
  }
  std::cout << std::endl;
}

它的行为如下:

$ echo "На берегу пустынных волн" | ./a.out | less
<D0> <9D> <D0> <B0> <D0> <B1> <D0> <B5> <D1> <80> <D0> <B5> <D0> <B3> <D1> <83> <D0> <BF> <D1> <83> <D1> <81> <D1> <82> <D1> <8B> <D0> <BD> <D0> <BD> <D1> <8B> <D1> <85> <D0> 
<B2> <D0> <BE> <D0> <BB> <D0> <BD> 

UPDATE:

好的,我在这方面做了更多的工作,下面的代码可以工作。它首先将输入转换为 32 位 unicode 字符的迭代器(按照推荐here):

#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/support_istream_iterator.hpp>
#include <boost/foreach.hpp>
#include <boost/regex/pending/unicode_iterator.hpp>
namespace qi = boost::spirit::qi;

int main() {
  std::string str = "На берегу пустынных волн";
  boost::u8_to_u32_iterator<std::string::const_iterator>
      begin(str.begin()), end(str.end());
  typedef boost::uint32_t uchar; // a unicode code point
  std::vector<uchar> letters;
  bool result = qi::phrase_parse(
      begin, end,             // input
      +qi::standard_wide::char_,  // match every character
      qi::space,              // skip whitespace
      letters);               // result
  BOOST_FOREACH(uchar letter, letters) {
    std::cout << letter << " ";
  }
  std::cout << std::endl;
}

该代码打印 Unicode 代码点:

$ ./a.out 
1053 1072 1073 1077 1088 1077 1075 1091 1087 1091 1089 1090 1099 1085 1085 1099 1093 1074 1086 1083 1085 

根据官方说法,这似乎是正确的统一码表.

现在,谁能告诉我如何在给定这个 Unicode 代码点向量的情况下打印实际字符?


我对此没有太多经验,但显然 Spirit(SVN trunk 版本)支持 Unicode。

#define BOOST_SPIRIT_UNICODE // We'll use unicode (UTF8) all throughout

参见,例如这sexpr 解析器示例这是方案演示中的。

BOOST_ROOT/libs/spirit/example/scheme

I believe this is based on the demo from a presentation by Bryce Lelbach1, which specifically showcases:

  • wchar 支持
  • utree 属性 (still实验)
  • s-表达式

网上有一篇文章是关于S-表达式和变体.


1 In case it is indeed, here is the video from that presentation and the slides (pdf) as found here (odp)

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

如何使用 boost::spirit 匹配 unicode 字符? 的相关文章

  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • XSD 嵌套元素

  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置

随机推荐

  • 突出显示文本,html 标签除外

    我使用下面的代码突出显示文本中的一些关键字 message str ireplace words span class hightlighted text words span message 文本可能包含一些html标签 例如 img s
  • 我可以将 MSVCRT 与 mingw 静态链接吗?

    我有编译用的 C 程序mingw在 Windows 上 它工作正常但需要MSVCRT DLL 我想静态链接它 就像我在 Visual Studio 中可以做的那样 这可能吗 I tried static标记为gcc它没有做出任何改变 也使用
  • Android - AlertDialog 样式

    我的应用程序中有一个警报对话框 如下所示 我希望标题和分隔标题 消息正文的线为橙色 我怎样才能做到这一点 我尝试的是使用自定义样式 如下所示 但这没有用 我的警报对话框代码 AlertDialog Builder alertDialog n
  • pymc3:具有多个观察变量的分层模型

    我有一个简单的分层模型 其中有很多个体 我有来自正态分布的小样本 这些分布的均值也遵循正态分布 import numpy as np n individuals 200 points per individual 10 means np r
  • 将 bytea 转换为二进制字符串

    我需要解码一个 Base64 字符串并获取一块二进制文件 Postgres中是否有一个SQL函数可以简单地转换bytea转换为二进制字符串表示形式 Like 00010001010101010 如果您的 Postgres 安装使用默认设置运
  • 如何选择具有给定类名的第一个、第二个或第三个元素?

    如何在元素列表中选择某个元素 我有以下内容 div class myclass my text1 div div p stuff p div div p more stuff p div p span Hello World span p
  • PHP GD如何在一条线上绘制文本

    The final output should be like image HELLO WORLD 这就是我正在做的 im imagecreate 400 400 txtcol imagecolorallocate im 0xFF 0x00
  • Android 打开外部存储目录(sdcard)用于存储文件

    我想打开外部存储目录路径以编程方式保存文件 我尝试过但没有获取 SD 卡路径 我该怎么办 有什么解决办法吗 private File path new File Environment getExternalStoragePublicDir
  • 延长课程是一个好的做法吗?

    我的数据库类中有一个 PDO 连接 最近我一直使用它作为其他类的扩展 即class Users extends Database这使我能够始终保持数据库连接 而无需在我的 Users 类中拥有函数 然而 有人指出我不应该这样做 因为这是一种
  • 分号有什么作用?

    我在网上找到了一个函数来帮助我完成当前的项目 并且它的某些行上有分号 我想知道为什么 是为了破坏功能吗 def containsAny self strings alphabet abcdefghijklmnopqrstuvwxyz0123
  • JQuery/JQuery UI 水平分隔线

    最近 我正在开发一个网站 我想创建一个水平分隔线 能够使用 jquery 调整页面上两个元素的大小 基本上 Content 您还可以查看UI Layout jQuery 插件 这是一个demo
  • 如何在链接的 npm 依赖项(开发中)和已安装的依赖项(暂存/生产中)之间切换?

    我正在开发一个自定义 npm 模块 并且它有一个 GitHub 存储库 我还在开发一个使用自定义模块的项目 当处理较大的项目时 使用它是很好的npm link这样我就可以对模块进行更改并立即在主项目中看到它们 To deploy to st
  • 在flutter中,如何将facebook受众作为中介网络与Admob集成?

    我是广告中介新手 我有一个 flutter 应用程序 并且使用以下 admob flutter 插件集成了 admob 并且它在 Android 和 iOS 上运行良好 https pub dev packages admob flutte
  • 暴雪官方魔兽世界 API 在哪里?

    我想知道是否可以通过 API 访问 魔兽世界 我的要求非常明确 必须是暴雪官方API 必须可以在游戏外访问 暴雪现已发布社区 API 允许您直接从暴雪服务获取信息 例如领域状态 玩家和拍卖数据 https dev battle net io
  • 使用构建参数构建 Docker 映像并将其从 DevOps 推送到 ACR

    我正在 Azure DevOps 管道中构建 Docker 映像 然后我想将其推送到 Azure 容器注册表 注册表已创建 并且我已配置 DevOps 来使用它 还有buildAndPushDocker任务 works 然而 由于 Dock
  • Android - 检索联系人照片并显示

    我正在创建一个简单的应用程序 用于检索每个联系人的姓名和电话号码 并在列表视图中显示 并在行开头的缩略图大小的图像视图中显示联系人的照片 我已成功检索并显示姓名和号码 但在浏览了许多教程和堆栈后未能显示照片 我最终将其恢复为仅显示姓名和号码
  • 如何生成动态 GRF 图像以进行 ZPL ZEBRA 打印

    我有个问题 我正在生成动态 BMP 图像并尝试通过 ZPL 命令将其发送到 ZEBRA 打印机 我需要将 BMP 图像转换为 GRF 图像 我认为 BMP 图像提取的十六进制不正确 打印的图像模糊且不正确 这是我的代码 string bit
  • 在java中计算两个双精度数的余数

    我有以下代码 Double x 17 0 Double y 0 1 double remainder x doubleValue y doubleValue 当我运行这个时 我得到余数 0 09999999999999906 知道为什么吗
  • 在 JavaFX 控制器中获取单击对象的 id 的更好方法

    我正在寻找一种更好的方法来获取该对象的事件处理程序中单击的对象的 id 我已经找到了这个 javafx 将 fx id 传递给控制器 或 fxml onAction 方法中的参数 但这对我不起作用 现在我使用节点类的 getId 函数 如下
  • 如何使用 boost::spirit 匹配 unicode 字符?

    如何使用 utf8 unicode 字符匹配boost spirit 例如 我想识别这个字符串中的所有字符 echo a out 当我尝试这个简单的boost spirit程序将无法正确匹配 unicode 字符 include