新建一个名为data.txt,格式为utf8无bom的,里面只是飞机二字,然后用以下程序测试抛出异常:
-module(demo).
-compile(export_all).
test_cn() ->
{ok, Fp} = file:open("data.txt", [read, {encoding, utf8}]),
{ok, Content} = file:read_line(Fp),
file:close(Fp),
io:format("~w~n", [get_id_by_name(Content)]).
get_id_by_name("飞机") -> %% 当然可以转为get_id_by_name([39134,26426])方法处理
%% 但是实际项目却是数十个,甚至数百个,这样做就不现实了
plane;
get_id_by_name("火车") ->
train.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
exception error: no function clause matching
demo:get_id_by_name([39134,26426])
in function demo:test_cn/0
请教下,这个是怎么回事?如何可以做得到中文匹配呢?
问题补充jigloo 写道
把demo.erl也要存成utf8格式,
然后试下这个
io:format("~w~n", [get_id_by_name(unicode:characters_to_binary(Content, unicode, utf8))]).
谢谢jialoo,解决问题了
另外,demo.erl是utf8格式的,之前也试过unicode:characters_to_binary,不过没加后面两个参数,加上后发现还是有问题,后台把中文匹配参数加上<<>>就ok了,最后再贴出解决后的完整代码,以供初学者或将来有遇到同样问题的童鞋们注意一下。
-module(demo).
-compile(export_all).
test_cn() ->
{ok, Fp} = file:open("data.txt", [read, {encoding, utf8}]),
{ok, Content} = file:read_line(Fp),
file:close(Fp),
io:format("~w~n", [get_id_by_name(unicode:characters_to_binary(Content, unicode, utf8))]).
get_id_by_name(<<"飞机">>) ->
plane;
get_id_by_name(<<"火车">>) ->
train.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
为了更容易理解该问题,顺手贴一下官方API说明
characters_to_binary(Data, InEncoding, OutEncoding) -> binary() | {error, binary(), RestData} | {incomplete, binary(), binary()}
Types:
Data = latin1_chardata() | chardata() | external_chardata()
RestData = latin1_chardata() | chardata() | external_chardata()
InEncoding = latin1 | unicode | utf8 | utf16 | utf32 | {utf16,little} | {utf16,big} | {utf32,little} | {utf32,big}
OutEncoding = latin1 | unicode | utf8 | utf16 | utf32| {utf16,little} | {utf16,big} | {utf32,little} | {utf32,big}
This function behaves as characters_to_list/2, but produces an binary instead of a unicode list. The InEncoding defines how input is to be interpreted if binaries are present in the Data, while OutEncoding defines in what format output is to be generated.
The option unicode is an alias for utf8, as this is the preferred encoding for Unicode characters in binaries. utf16 is an alias for {utf16,big} and utf32 is an alias for {utf32,big}. The big and little atoms denote big or little endian encoding.
Errors and exceptions occur as in characters_to_list/2, but the second element in the error or incomplete tuple will be a binary() and not a list().
相关推荐
在JavaScript中,虽然没有内置的模式匹配功能,但我们可以利用正则表达式和对象解构等特性来模拟Erlang的模式匹配行为。 首先,让我们深入理解Erlang中的模式匹配。在Erlang中,模式匹配是函数定义的一部分,它允许...
**Python-TamaleLua的Erlang风格模式匹配库** 在Python编程中,Tamale是一个独特的库,它为Lua语言引入了Erlang风格的模式匹配功能。Erlang模式匹配是一种强大的编程技术,允许程序员根据特定模式来解构值,这种...
在Erlang中,模块是组织代码的基本单元,而模式匹配是该语言的核心特性之一。下面将详细阐述这些概念。 首先,模块是Erlang编写的程序的基本构件。在Erlang中,每个模块对应一个以.erl为后缀的文本文件。这些文件在...
**RabbitMQ与Erlang版本匹配指南** RabbitMQ是一种广泛使用的开源消息代理和队列服务器,它基于Erlang编程语言构建。Erlang以其并发能力、容错性和分布式特性而闻名,是实现RabbitMQ的理想选择。正确地匹配RabbitMQ...
- **模式匹配**:Erlang的模式匹配功能允许在函数定义中使用模式来匹配和解构数据结构,简化了代码编写。 - **OTP(开放电信平台)**:Erlang OTP是一套库和设计原则,提供了构建可靠系统的框架,包括Mnesia数据库...
Erlang并发编程,Erlang程序设计,Erlang中文手册。 学习erlang的好资料。 Erlang是一个结构化,动态类型编程语言,内建并行计算支持。最初是由爱立信专门为通信应用设计的,比如控制交换机或者变换协议等,因此...
**Erlang编程语言简介** Erlang是一种高级并发编程语言,由...通过《erlang中文基础教程.doc》文档和《更多erlang资料下载.txt》文件,你可以获取更多的Erlang学习资料和实践案例,逐步掌握这一强大而独特的编程语言。
4. **模式匹配**:Erlang中的模式匹配是其语法的一大特色,用于在函数定义中解构复杂的数据结构。 5. **错误处理**:讲解Erlang的异常处理机制,如try-catch-finally语句。 6. **模式和类型**:涵盖模式匹配和类型...
Erlang的语法简洁,支持模式匹配、函数式编程、列表处理和递归等特性。它的动态类型系统和强大的类型推断让代码更加灵活。 Simon St. Laurent的《Introducing Erlang》这本书深入浅出地介绍了这些概念,是学习...
最新最全rabbitmq与erlang版本匹配-2020-04-23
读者将了解Erlang的模式匹配、函数式编程概念以及如何利用轻量级进程进行并发编程。第二部分深入探讨OTP,讲解其设计原则和组件,如行为(Behaviours)、分布式编程和监控。最后,第三部分通过构建实际项目,演示...
4. **模式匹配**:Erlang的模式匹配允许在函数调用中解构复杂的数据结构,方便地提取所需信息,同时也用于case语句和收到的消息匹配。 5. **BEAM虚拟机**:Erlang运行在BEAM虚拟机上,BEAM提供了高效的内存管理、...
5. **模式匹配**:Erlang的模式匹配功能使得数据处理更加简洁高效,对于游戏中的各种事件处理和状态转换非常适用。 6. **轻量级**:Erlang的虚拟机BEAM(Berkeley Packet Filter)设计精巧,占用资源少,适合在资源...
Erlang使用模式匹配来解构数据结构,并通过消息传递实现进程间的通信。 学习Erlang的关键概念包括: - **模式匹配**:在函数定义中,可以使用模式匹配来确定输入值的结构。 - **列表处理**:Erlang提供了强大的...
6. **模式匹配**:Erlang的模式匹配机制使得解构复杂数据结构和条件分支变得简单。 7. **BEAM虚拟机**:Erlang运行在BEAM(Erlang虚拟机)上,BEAM为Erlang提供了高效的内存管理和垃圾回收。 8. **标准库**:OTP...
8. **模式匹配**:Erlang中的模式匹配是其语法的一大特色,它允许在函数调用和解构过程中查找和提取数据结构中的特定模式。这一特性使得代码更简洁,同时增强了代码的可读性和可维护性。 9. **列表处理**:Erlang的...
6. **模式匹配**:Erlang的函数调用允许模式匹配,使得解构复杂数据结构变得简单,提高了代码的可读性和可维护性。 课后习题的实践价值: 1. **理解基本语法**:通过解决课后习题,学习者可以熟悉Erlang的基本语法...
5. **模式匹配**:Erlang的函数定义允许模式匹配,使得代码更加简洁和可读。书中可能会详细解释这一特性及其在并发编程中的应用。 6. **并行算法**:书中可能包含实例,演示如何使用Erlang实现高效的并行算法,提升...
- **1.2.9 变量的匹配、守卫和作用域**:深入讲解Erlang中变量的行为和模式匹配。 - **1.2.10 更多关于列表**:讲解列表的高级特性。 - **1.2.11 If和Case**:解释条件语句的使用。 - **1.2.12 内建函数(BIFs)**:...