我在.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
当我运行此scrpit 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
。
兔子在哪儿?
答案 0 :(得分:25)
(这主要是从previous answer of mine ......)
中偷走的Unicode允许一些重音字符以几种不同的方式表示:作为表示重音字符的“代码点”,或表示字符的非重音版本的一系列代码点,后跟重音符号。例如,“ä”可以表示为预先组合为U + 00E4(UTF-8 0xc3a4,带有分音符的拉丁文小写字母1)或分解为U + 0061 U + 0308(UTF-8 0x61cc88,拉丁文小写字母a +组合分音符) )。
OS X的HFS +文件系统要求所有文件名都存储在fully decomposed form的UTF-8表示中。在HFS +文件名中,“ä”必须编码为0x61cc88,“ö”必须编码为0x6fcc88。
所以这里发生的事情是你的shell脚本以预先组合的形式包含“Böhmáí”,因此它以那种方式存储在变量a
中,并以这种方式存储在.text文件中。但是当您使用该名称创建文件(使用touch
)时,文件系统会将其转换为实际文件名的分解形式。当你ls
它时,它会显示文件系统所具有的形式:分解形式。