Различная кодировка utf8 в именах файлов os x - PullRequest
9 голосов
/ 27 мая 2011

У меня есть небольшой скрипт в .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

Та же строка1009 * закодирован в разные байты в имени файла против содержимого файла.В терминале (в кодировке utf8) строка looks same в обоих вариантах.

Где кролик?

1 Ответ

25 голосов
/ 27 мая 2011

(Это в основном украдено из моего предыдущего ответа ...)

Юникод позволяет отображать некоторые акцентированные символы несколькими различными способами: в виде «кодовой точки», представляющей акцентированный символ, или в виде последовательности кодовых точек, представляющих безударную версию символа, за которой следует акцент (ы). Например, «ä» может быть представлен либо предварительно составленным как U + 00E4 (UTF-8 0xc3a4, латинская строчная буква 1 с диарезом), либо разложенным как U + 0061 U + 0308 (UTF-8 0x61cc88, латинская строчная буква a +, сочетающим диарез ).

Файловая система OS X HFS + требует, чтобы все имена файлов были сохранены в представлении UTF-8 их полностью разложенной формы . В имени файла HFS + «ä» ДОЛЖЕН быть закодирован как 0x61cc88, а «ö» ДОЛЖЕН быть закодирован как 0x6fcc88.

Итак, здесь происходит то, что ваш сценарий оболочки содержит «Böhmáí» в предварительно составленном виде, поэтому он сохраняется таким образом в переменной a и сохраняется таким образом в файле .text. Но когда вы создаете файл с таким именем (с touch), файловая система преобразует его в разложенную форму для фактического имени файла. И когда вы ls это, он показывает форму, которую имеет файловая система: декомпозированная форма.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...