Как обеспечить длину символов для азиатских языков, таких как китайский?

Использование Django v1.10 и Postgres

есть поле данных, которое может содержать смесь символов (например, \|?), цифр, букв алфавита, а также символов азиатских языков.

Пользователь говорит, что максимум этого поля должен быть 15 символов.

Как мне обеспечить это, используя Django и Postgres в качестве базы данных? В postgres мы используем кодировку utf-8.

1 символ может быть цифрой, китайским символом или буквой английского алфавита.

Я знаю, что в PHP есть функция mb_strlen. А в python эквивалентом будет использование строк Unicode.

В рамках Django, как лучше всего обеспечить максимальную длину строки?


person Kim Stacks    schedule 10.09.2017    source источник


Ответы (1)


Прежде всего, вы должны начать с определения того, что вы подразумеваете под символами. Вы упомянули корейский язык, который является одним из языков, которые неправильно интерпретируются многими функциями длины строки.

Несколько символов Юникода могут использоваться для описания одной графемы (символа, воспринимаемого пользователем), например:

>>> len(u"한")
3

Использование строк Unicode упрощает подсчет количества символов Unicode, но это не то же самое, что количество воспринимаемых пользователем символов. Я бы рекомендовал прочитать эту статью о длине текста Python.

Если вы хотите считать символы Юникода вместо графем, то это просто. Просто используйте CharField с аргументом max_length (в вашей модели и ваших формах).

Однако, если вы хотите ограничить поле максимум 15 графемами, вы должны позволить полю базы данных содержать больше символов, чем это, и сделать некоторые пользовательская проверка для ваших форм.

Полезной библиотекой для такого валидатора может быть grapheme, которая может вычислить количество графем в нить.

person Alvin Lindstam    schedule 11.09.2017
comment
Я определил символ как цифру, букву или китайский символ - person Kim Stacks; 11.09.2017
comment
Буква тоже не является определением. Например, использованный выше знак 한 состоит из трех символов Юникода (слогов хангыля): ㅎ, ㅏ и ㄴ. Вы хотите посчитать длину 한 как 1 или 3? - person Alvin Lindstam; 11.09.2017
comment
Я исключил корейский и японский из соображений - person Kim Stacks; 11.09.2017
comment
Итак, кажется, вы просто хотите считать символы Юникода, а не графемы. У вас есть модель Джанго? Где вы хотите, чтобы это применялось? Как я уже писал, наиболее распространенным способом является CharField в модели с max_length=15, который создает 15-символьный столбец базы данных и проверяет длину в сгенерированных ModelForms. - person Alvin Lindstam; 12.09.2017