操作系统 x 文件名中的不同 utf8 编码

问题描述 投票:0回答:1

我有一个小 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

兔子在哪里?

macos encoding utf-8 filesystems
1个回答
46
投票

(这大部分是从我之前的答案中偷来的...)

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

中,并以这种方式存储在 .text 文件中。 但是,当您创建具有该名称的文件(带有

touch

)时,文件系统会将其转换为实际文件名的分解形式。  当你
ls
它时,它会显示文件系统的形式:分解的形式。
	

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.