Я подозреваю, что один из Java или Mac использует CESU-8 вместо правильного УТФ-8. Java использует «модифицированную UTF-8» (которая представляет собой небольшую вариацию CESU-8) для различных внутренних целей, но я не знал, что она может использоваться как файловая система/кодировка по умолчанию. К сожалению, у меня нет ни Mac, ни Java для тестирования.
«Изменено» — это модифицированный способ сказать «сильно прослушивается». Вместо вывода четырехбайтовой последовательности UTF-8 для дополнительных (не BMP) символов, таких как ????:
\xF0\xA6\xBF\xB6
он выводит последовательность в кодировке UTF-8 для каждого из суррогатов:
\xED\xA1\x9B\xED\xBF\xB6
Это недопустимая последовательность UTF-8, но многие декодеры все равно ее допускают. Проблема в том, что если вы вернетесь туда и обратно через настоящий кодировщик UTF-8, у вас будет другая строка, четырехбайтовая, указанная выше. Попробуйте получить доступ к файлу с таким именем и бум! потерпеть поражение.
Итак, сначала давайте просто проверим, как имена файлов на самом деле хранятся в вашей текущей файловой системе, используя платформу, которая использует байты для имен файлов, например Python 2.x:
$ python
Python 2.x.something (blah blah)
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.listdir('.')
В моей файловой системе (Linux, ext4, UTF-8) имя файла «草????鷗外.gif» выглядит так:
['\xe8\x8d\x89\xf0\xa6\xbf\xb6\xe9\xb7\x97\xe5\xa4\x96.gif']
это то, что вы хотите. Если это то, что вы получаете, вероятно, Java делает это неправильно. Если вы получите более длинную шестибайтовую версию:
['\xe8\x8d\x89\xed\xa1\x9b\xed\xbf\xb6\xe9\xb7\x97\xe5\xa4\x96.gif']
вероятно, OS X делает это неправильно ... всегда ли он хранит такие имена файлов? (Или файлы изначально пришли откуда-то еще?) Что, если вы переименуете файл в «правильную» версию?:
os.rename('\xe8\x8d\x89\xed\xa1\x9b\xed\xbf\xb6\xe9\xb7\x97\xe5\xa4\x96.gif', '\xe8\x8d\x89\xf0\xa6\xbf\xb6\xe9\xb7\x97\xe5\xa4\x96.gif')
person
bobince
schedule
09.10.2009