Фильтровать строку Python до utf8 символов байтов не более 3 - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь отфильтровать строку Python 3 так, чтобы сохранялись только символы utf8 по 3 байта или менее (я пишу в базу данных SQL, которая является utf8_general_ci, которая может занимать только 3 байта или меньше).Есть ли простой способ сделать это в Python?Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

0 голосов
/ 25 апреля 2018

Кодовая точка Unicode, равная и меньшая 0xffff, кодируется с 3 или менее байтами (и, кроме того, требуется 4 байта).

так:

''.join(c for c in my_string if ord(c) <= 0xffff)

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

Что мне не нравится в решении Ignacio, так это использование < в строках. Документация гласит « лексикографический », но такое слово (на английском языке) в словах имеет другое значение. Sso в python '<' для строк часто является ошибкой, но не в этом случае. Я думаю, что это одна из немногих ошибок в дизайне Python (<code>'B' < 'a', правда?). Намерение в моем решении (ИМО) яснее.

0 голосов
/ 26 апреля 2018

Спасибо, Джакомо Катенацци. Ответ: '' .join (c для c в my_string, если ord (c) <= 0xffff) </p>

Альтернативный ответ '' .join ([_ для _ в my_string, если len (_. encode ('utf-8')) <= 3]) работает на половине скорости '' .join (c для c в my_string, если ord (c) <= 0xffff). </p>

0 голосов
/ 25 апреля 2018

Поскольку BMP , отфильтруйте его.

''.join(c for c in S if c < '\U00010000')
...