热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在Elixir中枚举一个字符串

在Elixir中,如果我有一个字符串,例如José1Jose?2,我该如何枚举它?如果我尝试使用Enum或for

在 Elixir 中,如果我有一个字符串,例如"José1 Jose?2",我该如何枚举它?如果我尝试使用Enumfor理解,我会收到以下错误:

** (Protocol.UndefinedError) 协议 Enumerable 未为 BitString 类型的“José1 Jose?2”实现


回答

Elixir 中的字符串是 UTF-8 编码的二进制文件。如果你想枚举一个二进制,它只是一个字节的集合,你需要指定如何。

String.graphemes/1- 这将为您提供一个字符串列表,其中每个字符串包含一个单独的 Unicode 字素。如果您想要每个“字符”,这可能最接近您的意思。

iex> String.graphemes("José1 Jose?2")
["J", "o", "s", "é", "1", " ", "J", "o", "s", "e?", "2"]

String.codepoints/1- 这将为您提供按 Unicode 代码点分解的字符串列表。请注意,Unicode 代码点不一定会转换为人类可读的字符。

iex> String.codepoints("José1 Jose?2")
["J", "o", "s", "é", "1", " ", "J", "o", "s", "e", "?", "2"]

你可以看到,第一和第二é 字形在Unicode代码点的不同方面代表。第一个是LATIN SMALL LETTER E WITH ACUTE (U+00E9),而第二个被LATIN SMALL LETTER E (U+0065)后跟COMBINING ACUTE ACCENT (U+0301)

这就是为什么您不能简单地枚举字符串的原因,因为在处理 Unicode 时,您必须指定您是否对字素、代码点或其他东西感兴趣。

String.to_charlist/1- 为您提供字符串的数字 Unicode 代码点列表。这可用于与使用此格式的 Erlang 库进行交互。

iex> String.to_charlist("José1 Jose?2")
[74, 111, 115, 233, 49, 32, 74, 111, 115, 101, 769, 50]

:binary.bin_to_list/1 - 如果您只想枚举字节。

iex> :binary.bin_to_list("José1 Jose?2")
[74, 111, 115, 195, 169, 49, 32, 74, 111, 115, 101, 204, 129, 50]


获得列表后,您可以使用推导式或Enum模块中的任何函数枚举它:

iex> for c <- String.graphemes("José1 Jose?2"), into: "", do: c <> c
"JJoosséé11 JJoosse?e?22"
iex> "José1 Jose?2" |> String.graphemes() |> Enum.join("|")
"J|o|s|é|1| |J|o|s|e?|2"


也可以使用内涵与位串发电机列举字节和代码点(但不是字形)。

相当于:binary.bin_to_list/1

iex> for <>, do: byte
[74, 111, 115, 195, 169, 49, 32, 74, 111, 115, 101, 204, 129, 50]

等价于String.to_charlist/1,通过指定二进制文件的类型是utf8

iex> for <>, do: cp
[74, 111, 115, 233, 49, 32, 74, 111, 115, 101, 769, 50]

等效于String.codepoints/1,通过指定二进制文件的类型为utf8,并将生成的代码点转换回 UTF-8 二进制文件:

iex> for <>, do: <>
["J", "o", "s", "é", "1", " ", "J", "o", "s", "e", "?", "2"]


PS 要进一步阅读有关字符编码的信息,这篇 2003 年的博客文章非常棒:每个软件开发人员绝对、肯定必须了解 Unicode 和字符集的绝对最低要求(没有借口!)。






推荐阅读
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 这篇文章主要介绍了Python拼接字符串的七种方式,包括使用%、format()、join()、f-string等方法。每种方法都有其特点和限制,通过本文的介绍可以帮助读者更好地理解和运用字符串拼接的技巧。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 本文介绍了使用Python编写购物程序的实现步骤和代码示例。程序启动后,用户需要输入工资,并打印商品列表。用户可以根据商品编号选择购买商品,程序会检测余额是否充足,如果充足则直接扣款,否则提醒用户。用户可以随时退出程序,在退出时打印已购买商品的数量和余额。附带了完整的代码示例。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
author-avatar
三封酒可_894
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有