文件名os x中的不同utf8编码

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它,它显示文件系统的形式:分解形式.

  • HFS +实际上使用NFD的变体(规范化形式分解),其中某些字符范围是预先组合的,因此文件名未被完全分解.请参阅[VFS中的文本编码](http://developer.apple.com/library/mac/#qa/qa1173/_index.html). (2认同)