用 ASCII 分隔符来分割 UTF-8 总是可行?

有的环境不支持 UTF-8,如 cut(1) 和 PHP explode,不方便找 UTF-8 替代品,硬着头皮用:

$ echo 文章标题_网站名称 | cut -d _ -f 1
文章标题

问题来了,那么即便是在 UTF-8 语境中,ASCII 分割符,也总是不会有冲突?即

任意一个 UTF-8 字节序列,都不可能包含任意一个 ASCII 字节,是吧?

当然 ASCII 字符自身包含自身不算,如 A 包含 A

比如中文字符通常 3 个字节,这 3 个字节不可能包含 ASCII 字节

ASCII 就是只用了7位(最高位为0)。所以 UTF-8 把所有用到的字节高位标为1实现了兼容啊。

1 个赞

你说的对,标准是这样规定的,我之前不大了解 UTF-8 具体的编码标准。

UTF-8 兼容 ASCII,即任意 ASCII 文件都是合法的 UTF-8 文件,但这种程度的兼容,不表示 $ echo 文章标题_网站名称 | cut -d _ -f 1 就能工作,也就是标准实际上比兼容要求更加严格。假设我规定一个新标准,同样兼容 ASCII,但规定 0b1xxx xxxx 表示后面跟着 N 个字节数,后续字节表示 codepoint。这个标准兼容了 ASCII,但是 cut -d _ 就不能保证正常工作了。

UTF-8 所有非 ASCII code point 的字节都是 1 开头的,也就是你说的“后续N个字节”,都是 1 开头的,不可能被当作 ASCII

除非你把 UTF-8 当作其他兼容 ASCII 的扩展格式,比如 ISO8859,不然截取任何byte都不可能把非ASCII部分当成ASCII

1 个赞