摘要:我希望的是类似中文字符这样的使用体验。中文中文这里的遍历就类似中文中文我们这里干的事情类似于里两种类型的区分。
致力于在现代C++中提供Python的编程体验。这个建立在两个关键的基础上
c++ 11/14/17 提供了从 auto 到 structure binding 的语法便利
https://ericniebler.github.io... 提供的 range 抽象
但是 python 体验是建立在语言内建的大量方便函数的基础之上的。而 Modern C++ 还缺少大量使用起来方便的库。
我们今天要来解决的第一个问题是如何在C++中表达字符串。选择一个字符串的实现主要有三方面的考虑:
是值对象还是引用对象:std::string 是值对象,std::string_view 是引用对象。值对象即便用上了所有的优化(stack分配内存,ref counted cow)仍然是有开销的。在该使用应用的地方,仍然应该使用引用。
值对象的内存管理。folly::fbstring 就比 std::string 更好地利用了内存
支持 unicode:不应该把字符串简单看成一个char数组
市面上几乎所有的string抽象对unicode支持都不好。我希望的是类似u"中文字符"这样的使用体验。c++ 11/14/17 在unicode支持方面支持得非常有限:
虽然引入了char16_t 和 char32_t,但是你以为字符串就是 vector
regex 不支持 unicode,. 是无法匹配一个完整的code point 的
https://github.com/CaptainCro... 这个封装是最接近的,但是不是基于 range-v3 的。
目前的我实现的代码在:https://github.com/taowen/pyt...
定义一个字符串常量
</>复制代码
auto str = U8("中文字符");
U8是一个宏,可以保证u8""这样字符串声明(c++ 编译器支持的 utf8 编码),同时额外做的工作是让构造出来的字符串和普通的字符串类型不兼容,避免误用。也就是 string != unicode 。这个就相当于
</>复制代码
str = u"中文字符"
取得字符串长度
</>复制代码
CHECK(2 == (U8("中文") | pyn::len));
这个就相当于
</>复制代码
len(u"中文")
如果不喜欢 | 的调用语法,也可以用普通的函数
</>复制代码
pyn::len(U8("中文"));
首字母大写
</>复制代码
CHECK(U8("Hello") == (U8("hello") | utf8::capitalize | utf8::to_text));
注意这里 capitalize 并不会立即返回一个新的字符串(分配一个新的内存空间,然后拷贝字符),而是返回了一个类似python generator的东西。在 to_text 的时候才会分配内存,进行计算。默认 to_text 返回的字符串类型是 utf8::Text 底层存储是 folly::fbstring。
这里定义的字符串并不能直接遍历或者下标访问,因为在unicode中什么一个“character“是有歧义的,把字符串看成一个数组是一个过时的想法(即便是16位的char)。字符串就没有常量时间可随机访问这么一说。如果需要遍历,需要这么写
</>复制代码
auto chars = std::vector{};
for (auto c : U8("abc") | utf8::code_units) {
chars.push_back(c);
}
CHECK((std::vector{"a", "b", "c"}) == chars);
这个取得的是code unit,在非ascii范围内的字符会读取不完整。
</>复制代码
auto chars = std::vector{};
for (auto c : U8("中文") | utf8::code_points) {
chars.push_back(c);
}
CHECK((std::vector{U8("中"), U8("文")}) == chars);
这里的遍历就类似
</>复制代码
chars = []
for c in u"中文":
chars.append(c)
[u"中", u"文"] == c
我们这里干的事情类似于python 2.7 里 string/unicode 两种类型的区分。我们需要一种存储上是string(utf8编码),但是使用起来类似 unicode 的抽象。目前来看,前途光明。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/38192.html
摘要:之前自己一直在找自己感兴趣的方向,以及在这个方向上流行的语言并尝试学习这些语言其中的几个但是没有什么重大发现,这篇文章主要介绍了个出现在个编程语言排行榜的编程语言和他们的擅长的领域,他们分别是排名不分先后,,,,,,,,,,,,,。 之前自己一直在找自己感兴趣的方向,以及在这个方向上流行的语言并尝试学习这些语言其中的几个但是没有什么重大发现,这篇文章主要介绍了15个出现在3个编程语言排...
摘要:之前自己一直在找自己感兴趣的方向,以及在这个方向上流行的语言并尝试学习这些语言其中的几个但是没有什么重大发现,这篇文章主要介绍了个出现在个编程语言排行榜的编程语言和他们的擅长的领域,他们分别是排名不分先后,,,,,,,,,,,,,。 之前自己一直在找自己感兴趣的方向,以及在这个方向上流行的语言并尝试学习这些语言其中的几个但是没有什么重大发现,这篇文章主要介绍了15个出现在3个编程语言排...
摘要:之前自己一直在找自己感兴趣的方向,以及在这个方向上流行的语言并尝试学习这些语言其中的几个但是没有什么重大发现,这篇文章主要介绍了个出现在个编程语言排行榜的编程语言和他们的擅长的领域,他们分别是排名不分先后,,,,,,,,,,,,,。 之前自己一直在找自己感兴趣的方向,以及在这个方向上流行的语言并尝试学习这些语言其中的几个但是没有什么重大发现,这篇文章主要介绍了15个出现在3个编程语言排...
摘要:之前自己一直在找自己感兴趣的方向,以及在这个方向上流行的语言并尝试学习这些语言其中的几个但是没有什么重大发现,这篇文章主要介绍了个出现在个编程语言排行榜的编程语言和他们的擅长的领域,他们分别是排名不分先后,,,,,,,,,,,,,。 之前自己一直在找自己感兴趣的方向,以及在这个方向上流行的语言并尝试学习这些语言其中的几个但是没有什么重大发现,这篇文章主要介绍了15个出现在3个编程语言排...
摘要:我关注的贺老贺师俊前辈最近发表个这样一条微博虽然这条微博没有引起大范围的关注和讨论,但是作为新人,我陷入了思考。通过贺老的微博,对一个问题进行探究,最终找到核心成员的一文,进行参考并翻译。 我关注的贺老—贺师俊前辈@johnhax 最近发表个这样一条微博: showImg(https://segmentfault.com/img/remote/1460000010452807); 虽然...
阅读 3840·2021-10-11 10:58
阅读 2129·2021-09-24 09:47
阅读 589·2019-08-30 14:19
阅读 1890·2019-08-30 13:58
阅读 1526·2019-08-29 15:26
阅读 705·2019-08-26 13:45
阅读 2224·2019-08-26 11:53
阅读 1850·2019-08-26 11:30