str.title () и кодирование на Mac - PullRequest
0 голосов
/ 20 декабря 2018

Допустим, у меня есть 3 папки с именами "Grégory MM", "Loïc RR" и "Danièle RR" (пробелы и буквы с акцентом).

Затем я использую следующий код, чтобы получить все имена с заглавной буквы:

import glob
names = [ x.title() for x in glob.glob('*') ]

Если папки были созданы с помощью mkdir из терминала, у меня ожидаемый результат:

>>> names
['Loïc Rr', 'Danièle Rr', 'Grégory Mm']

Если папки были созданы из Finder, я получаю:

>>> names
['LoïC Rr', 'DanièLe Rr', 'GréGory Mm']

Первая буква после каждой буквы с ударением пишется с большой буквы.Это известное поведение?Как я могу избежать этого?

Python версии 3.7.0
Система: macOS Mojave 10.14.1
и sys.getfilesystemencoding() возвращает 'utf-8'

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

На самом деле у нас есть две разные строки:

In [1]: 'Loïc Rr'.encode()
Out[1]: b'Lo\xc3\xafc Rr'

In [2]: 'Loïc Rr'.encode()
Out[2]: b'Loi\xcc\x88c Rr'

\xc3\xaf равно ï и \xcc\x88 равно ̈,

\xcc\x88 распознается как пунктуация, поэтомуВот почему title() использует заглавные буквы в вашем письме.

Вы можете нормализовать вашу строку с помощью unicodedata.normalize():

In [1]: import unicodedata

In [2]: 'Loïc Rr' == 'Loïc Rr'
Out[2]: False

In [3]: unicodedata.normalize('NFC','Loïc Rr') == unicodedata.normalize('NFC','Loïc Rr')
Out[3]: True

In [4]: unicodedata.normalize('NFD','Loïc Rr') == unicodedata.normalize('NFD','Loïc Rr')
Out[4]: True

In [5]: unicodedata.normalize('NFD','Loïc Rr').title() == unicodedata.normalize('NFD','Loïc Rr').title()
Out[5]: True

In [6]: unicodedata.normalize('NFD','Loïc Rr').title() == unicodedata.normalize('NFD','Loïc Rr').title()
Out[6]: True
0 голосов
/ 20 декабря 2018

Скорее всего, это вопрос того, используют ли буквы с акцентированием комбинированные символы акцента или отдельные акцентированные кодовые точки.Я не знаю, какие имена файлов у вас на самом деле есть в вашей системе, но, поместив имена в форме NFC (с одинарным акцентированным кодом):

>>> x = 'Loïc Rr'
>>> unicodedata.normalize('NFC', x).title()
'Loïc Rr'

мы не получаем заглавных букв после акцента, тогда как в NFDформа (с сочетанием символов ударения):

>>> unicodedata.normalize('NFD', x).title()
'Loi\u0308C Rr'

мы получаем заглавную букву.

Похоже, title() считает, что объединяющий символ отмечает границу слова.Нормализация NFC может несколько помочь, но не для странных комбинаций с акцентом, для которых выделенная кодовая точка не существует.Для более надежной обработки вам может потребоваться более мощная библиотека обработки Unicode, чем встроенные строковые методы Python.

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