Elixir 从零 · 第 12 课(展开目录)
01 · 先让代码说话02 · 先认六种值03 · 把值装起来04 · 从旧 list 生成新 list05 · 让形状对上06 · 用 case 做选择07 · 把文字安全变成整数08 · 拆开 &1 和管道09 · 把代码放进项目10 · 真假不只靠 true11 · 走进嵌套数据12 · 一字不一定一字节13 · 让函数按形状接活14 · 把一列数收成一个值15 · 给不同问题选不同路16 · 给 map 一张名片17 · 让项目自己验答案18 · 让成功和失败长得一样19 · 读写文件先管好路20 · 只算眼前需要的21 · 同一句话,不同做法22 · 先约好模块会做什么23 · 把数据形状写在门口24 · 测试不只看一条好路25 · 把项目磨成一个命令26 · 定下小项目边界27 · 把真实文字洗干净28 · 只开三扇门29 · 把约定钉在代码旁30 · 打包,也留下脚印31 · 照任务书交卷
ELIXIR · 基础 · LESSON 1230 分钟

一字不一定一字节

用 UTF-8 处理中文,分清字节、码点和人眼看到的字符。

01 · 先看完整例子

数一数“长安”

先比较两个数字,再看清洗后的词语 list。

Elixir
text = "  长安 春风  "

# 中文字符在 UTF-8 中通常占多个字节
byte_size("长安")
String.length("长安")

# 先去掉两端空格,再按空格切词
text
|> String.trim()
|> String.split(" ", trim: true)
先对照结果
  • byte_size("长安") 得到 6,String.length("长安") 得到 2。
  • 管道得到 ["长安", "春风"]。
02 · 回头拆代码

从第一行往下读

  1. 字节数适合协议、文件大小等底层边界。
  2. 给读者显示长度时,通常使用 String.length/1。
  3. 清洗文字时先明确空白和分隔规则。
03 · 认清新符号

符号不是暗号

byte_size/1

计算字符串占多少字节。

String.length/1

计算人眼看到多少个字符。

String.split/2

按分隔符把字符串切成 list。

04 · 代码里的概念

把名字和意思对上

01

UTF-8

把世界各地文字编码成字节的一套规则。Elixir 字符串默认使用它。

02

字素

人眼看到的一个字符。它可能由不止一个 Unicode 码点组成。

05 · 再说清楚

这些写法为什么有用

屏幕上一个汉字,存进电脑后常占多个字节。计字节和计字符,是两件事。

Elixir 字符串使用 UTF-8。String 模块按文字处理;byte_size/1 按底层字节处理。

读文件或用户输入时,常先 trim 去掉首尾空白,再 split 切开。

06 · 自己改一次

合上答案,动手

把 " 桃,李,杏 " 变成三个词。

练习起点
"  桃,李,杏  "
|> String.____()
|> String.split(____)

目标结果: 得到 ["桃", "李", "杏"]。

卡住了,再看提示

先用 trim,再按 "," 切。

运行过以后,再看一种答案
一种答案
"  桃,李,杏  "
|> String.trim()
|> String.split(",")
想一想:`byte_size("长安")` 为什么不是 2?

因为它数 UTF-8 字节,不数人眼看到的字符;两个汉字共占 6 个字节。

带走

记住三句

  1. 1

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

  2. 2

    文字处理优先看 String 模块。

  3. 3

    输入文字要先清洗,再解析。

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