jm6*_*666 10 filesystems macos encoding utf-8
我有一个小shellcript .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
Run Code Online (Sandbox Code Playgroud)
当我运行这个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
Run Code Online (Sandbox Code Playgroud)
相同的字符串Böhmáí已编码为文件名中的不同字节,而不是文件的内容.在终端(utf8编码)looks same中两个变体中的字符串.
兔子在哪里?
Gor*_*son 26
(这大部分是从我以前的答案中偷来的......)
Unicode允许一些重音字符以几种不同的方式表示:作为表示重音字符的"代码点",或表示字符的非重音版本的一系列代码点,后跟重音符号.例如,"ä"可以表示为预先组合为U + 00E4(UTF-8 0xc3a4,带有分音符的拉丁文小写字母1)或分解为U + 0061 U + 0308(UTF-8 0x61cc88,拉丁文小写字母a +组合分音符) ).
OS X的HFS +文件系统要求所有文件名都以其完全分解形式的UTF-8表示形式存储.在HFS +文件名中,"ä"必须编码为0x61cc88,"ö"必须编码为0x6fcc88.
所以这里发生的是你的shell脚本以预先组合的形式包含"Böhmáí",因此它以这种方式存储在变量中a,并以这种方式存储在.text文件中.但是当您使用该名称(with touch)创建文件时,文件系统会将其转换为实际文件名的分解形式.当你ls它,它显示文件系统的形式:分解形式.
| 归档时间: |
|
| 查看次数: |
9387 次 |
| 最近记录: |