Erlang 从零 · 第 03 课(展开目录)
01 · 先打开 erl02 · 先认常见 term03 · 分清两种文字04 · 变量只接一次05 · 拆开一列,再筛一次06 · 把文字安全变成整数07 · 用 case 选一条路08 · 让函数继续走09 · 把代码放进模块10 · 条件必须说真话11 · 一层一层取数据12 · 文字先说清编码13 · 让函数子句排好队14 · 带着累加器往前走15 · 先看值,再选路16 · 给模块立规矩17 · 让 rebar3 管项目18 · 让结果有固定形状19 · 把磁盘当成会失败的邻居20 · 把函数交给 list21 · record 留在院里22 · 先写模块之间的约定23 · 把 term 形状写出来24 · 小测试与整段路25 · 把应用磨成命令26 · 先把小项目圈住27 · 把真实文件洗干净28 · 公开入口越少越稳29 · 把约定留在源码旁30 · 打包,也留下线索31 · 按最初任务交卷
ERLANG · 试跑 · LESSON 0325 分钟

分清两种文字

看懂 charlist、binary,以及中文的 UTF-8 写法。

01 · 先看完整例子

同样看着像文字,底层形状不同

这里用 =:= 做严格相等比较。

Erlang
%% 双引号默认产生 charlist
"cat" =:= [99, 97, 116].

%% 双尖括号产生 binary
is_binary(<<"cat">>).

%% 中文 binary 明确写出 utf8
byte_size(<<"白鹭"/utf8>>).
先对照结果
  • charlist 比较得到 true。
  • is_binary(<<"cat">>) 得到 true。
  • byte_size(<<"白鹭"/utf8>>) 得到 6:这是 6 个字节,不是 2 个汉字。
02 · 回头拆代码

从第一行往下读

  1. "cat" 在 shell 里显示成文字,但它等于整数 list [99, 97, 116]。
  2. <<"cat">> 是 binary,不等于 charlist "cat"。
  3. byte_size(<<"白鹭"/utf8>>) 数字节。这里两个汉字共占 6 个 UTF-8 字节。
03 · 认清新符号

符号不是暗号

"cat"

默认是 charlist,也就是整数 list。

<<"cat">>

尖括号包住的是 binary。

/utf8

按 UTF-8 把前面的文字写入 binary。

=:=

严格比较左右两个值是否相同。

04 · 代码里的概念

把名字和意思对上

01

charlist

字符编号组成的 list。"cat" 与 [99, 97, 116] 是同一个值。

02

binary

一段连续字节,写成 <<...>>。常用于文本、文件和网络数据。

03

UTF-8

把中文等 Unicode 文字变成字节的一种编码规则。

05 · 再说清楚

这些写法为什么有用

Erlang 没有单独的 string 类型。双引号写出的 "cat" 默认是字符编号组成的 list,也叫 charlist。

<<"cat">> 是 binary。许多网络协议、文件和现代 Erlang 接口使用 binary 保存文字。

中文字符放进 binary 时写 /utf8,如 <<"白鹭"/utf8>>。这句话明确告诉 Erlang 怎样编码。

06 · 自己改一次

合上答案,动手

把“长安”写成 binary,再用 is_binary(...) 检查。

练习起点
%% 把中文 binary 直接交给检查函数
is_binary(<<____/utf8>>).

目标结果: 得到 true。

卡住了,再看提示

空里仍用双引号写文字。

运行过以后,再看一种答案
一种答案
%% /utf8 明确指定中文编码
is_binary(<<"长安"/utf8>>).
想一想:`"cat"` 和 `<<"cat">>` 是同一个值吗?

不是。前者默认是 charlist,后者是 binary。它们能表示相似文字,但数据类型不同。

带走

记住三句

  1. 1

    Erlang 没有独立的 string 类型。

  2. 2

    双引号默认得到 charlist,<<>> 得到 binary。

  3. 3

    中文 binary 要明确写 /utf8。

本课结束代码也跑过一次,就把这一课收好。