Erlang 从零 · 第 12 课(展开目录)
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 1235 分钟

文字先说清编码

用 UTF-8 binary 保存中文,分清字节与字符。

01 · 先看完整例子

数一数“长安”

源码保存为 UTF-8;现代 Erlang 编译器能读取 Unicode 源码。

Erlang
Text = <<"长安"/utf8>>,

%% byte_size 数底层字节
Bytes = byte_size(Text),

%% 转成码点 list 后再数 Unicode 字符
Characters = length(unicode:characters_to_list(Text)),
{Bytes, Characters}.
先对照结果
  • 得到 {6,2}。
02 · 回头拆代码

从第一行往下读

  1. 两个汉字按 UTF-8 共占 6 字节。
  2. unicode:characters_to_list/1 得到两个码点。
  3. 底层协议看字节,面向读者的长度看字符。
03 · 认清新符号

符号不是暗号

<<Text/utf8>>

把 Unicode 码点按 UTF-8 放进 binary。

byte_size/1

计算 binary 中的字节数。

unicode:characters_to_list/1

把 Unicode 数据转为码点 list。

04 · 代码里的概念

把名字和意思对上

01

Unicode binary

按 UTF-8 等编码装入 binary 的文字字节。

02

charlist

由 Unicode 码点整数组成的 list,显示时常看起来像带双引号文字。

05 · 再说清楚

这些写法为什么有用

Erlang 的 binary 只是字节容器。写中文时明确 /utf8,读文件时也要知道字节采用什么编码。

byte_size/1 数字节。要按 Unicode 字符处理,可先使用 unicode 模块转换。

Erlang 生态中会同时遇到 charlist 与 UTF-8 binary。模块文档会说明函数期望哪一种。

06 · 自己改一次

合上答案,动手

把 <<" peach,plum ">> 去掉两端空格,再按逗号切开。

练习起点
Text = <<"  peach,plum  ">>,
Clean = string:____(Text),
string:split(Clean, ____, all).

目标结果: 得到 [<<"peach">>,<<"plum">>]。

卡住了,再看提示

先用 trim,分隔符也是 binary <<",">>。

运行过以后,再看一种答案
一种答案
Text = <<"  peach,plum  ">>,
%% string 模块可处理 UTF-8 binary
Clean = string:trim(Text),
string:split(Clean, <<",">>, all).
想一想:binary 是否天然知道里面装的是 UTF-8 文字?

不知道。binary 只是字节;编码约定来自写入方式、协议或调用者说明。

带走

记住三句

  1. 1

    binary 与文字编码不是同一件事。

  2. 2

    字节数与字符数可能不同。

  3. 3

    模块边界要说明接受 binary 还是 charlist。

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