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 · 回头拆代码
从第一行往下读
- 两个汉字按 UTF-8 共占 6 字节。
unicode:characters_to_list/1得到两个码点。- 底层协议看字节,面向读者的长度看字符。
03 · 认清新符号
符号不是暗号
<<Text/utf8>>把 Unicode 码点按 UTF-8 放进 binary。
byte_size/1计算 binary 中的字节数。
unicode:characters_to_list/1把 Unicode 数据转为码点 list。
04 · 代码里的概念
把名字和意思对上
Unicode binary
按 UTF-8 等编码装入 binary 的文字字节。
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
binary 与文字编码不是同一件事。
- 2
字节数与字符数可能不同。
- 3
模块边界要说明接受 binary 还是 charlist。
本课结束代码也跑过一次,就把这一课收好。