我有一个小 shellscript
.x
$ cat .x
u="Böhmáí"
touch "$u"
ls > .list
echo "$u" >.text
cat .list .text
diff .list .text
od -bc .list
od -bc .text
当我运行此脚本时
sh -x .x
(-x 仅用于显示命令)
$ sh -x .x
+ u=Böhmáí
+ touch Böhmáí
+ ls
+ echo Böhmáí
+ cat .list .text
Böhmáí
Böhmáí
+ diff .list .text
1c1
< Böhmáí
---
> Böhmáí
+ od -bc .list
0000000 102 157 314 210 150 155 141 314 201 151 314 201 012
B o ̈ ** h m a ́ ** i ́ ** \n
0000015
+ od -bc .text
0000000 102 303 266 150 155 303 241 303 255 012
B ö ** h m á ** í ** \n
0000012
相同的字符串
Böhmáí
已编码为文件名中的不同字节与文件内容。在终端(utf8 编码)中,两个变体中的字符串 looks same
。
兔子在哪里?
(这大部分是从我之前的答案中偷来的...)
Unicode 允许以几种不同的方式表示某些重音字符:作为表示重音字符的“代码点”,或作为表示字符的非重音版本的一系列代码点,后跟重音符号。例如,“ä”可以表示为预组合为 U+00E4(UTF-8 0xc3a4,带有分音符的拉丁小写字母 a),也可以分解为 U+0061 U+0308(UTF-8 0x61cc88,带有分音符的拉丁小写字母 a +) ).OS X 的 HFS+ 文件系统要求所有文件名都以其“完全分解形式”的 UTF-8 表示形式存储。在 HFS+ 文件名中,“ä”必须编码为 0x61cc88,“ö”必须编码为 0x6fcc88。
因此,这里发生的情况是,您的 shell 脚本包含预组合形式的“Böhmáí”,因此它以这种方式存储在变量 a
touch
)时,文件系统会将其转换为实际文件名的分解形式。 当你
ls
它时,它会显示文件系统的形式:分解的形式。