Length(s) и кириллица

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Length(s) и кириллица

Сообщение wwswowsogon » 27.10.2017 19:22:46

Всем доброго времени суток!
Прошу прощения, если поднял избитую тему, но для меня это было новостью.
Сущность явления:

s = '111s1';
Length(s) = 5;

s = '111ы1';
Length(s) = 6.

Т.е. один кириллический символ компилятор считает за два. Наверное, это нормально, но
1) подскажите, где про это можно почитать подробнее?
2) как с этим бороться? Мне помогло Length(UTF8ToAnsi(s)).
wwswowsogon
новенький
 
Сообщения: 50
Зарегистрирован: 23.12.2008 20:41:37

Re: Length(s) и кириллица

Сообщение pupsik » 27.10.2017 19:42:41

utf8Length
в wiki всё описано
pupsik
энтузиаст
 
Сообщения: 1014
Зарегистрирован: 20.08.2014 16:20:13

Re: Length(s) и кириллица

Сообщение Дож » 27.10.2017 19:43:36

подскажите, где про это можно почитать подробнее?

https://ru.wikipedia.org/wiki/UTF-8
как с этим бороться?

Использовать не Length, которая во многих случаях считает число байт в строке, а ту функцию, которая посчитает число utf-8 символов.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 689
Зарегистрирован: 12.10.2008 16:14:47

Re: Length(s) и кириллица

Сообщение wwswowsogon » 27.10.2017 20:17:22

Спасибо! А есть ли такие функции в FPC?
wwswowsogon
новенький
 
Сообщения: 50
Зарегистрирован: 23.12.2008 20:41:37

Re: Length(s) и кириллица

Сообщение SSerge » 28.10.2017 04:08:47

wwswowsogon писал(а):Спасибо! А есть ли такие функции в FPC?


Var S:UnicodeString;

-- в отношении русского языка length длину будет считать правильно. До тех пор, пока в тексте не встретятся знаки с суррогатными парами :D
SSerge
энтузиаст
 
Сообщения: 815
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Length(s) и кириллица

Сообщение wwswowsogon » 29.10.2017 20:50:20

Спасибо, но не понятно, подойдет ли это.
Ладно, буду пока использовать UTF8ToAnsi, спасибо всем за информацию!
wwswowsogon
новенький
 
Сообщения: 50
Зарегистрирован: 23.12.2008 20:41:37

Re: Length(s) и кириллица

Сообщение zub » 30.10.2017 00:43:20

>>Ладно, буду пока использовать UTF8ToAnsi, спасибо всем за информацию!
зачем может понадобиться длина строки в символах?

Имхо это только
1)форматирование и отрисовка текста - т.е. написание чегото типа tmemo
2)Выполнение какойнить кривой студенческой задачки
zub
долгожитель
 
Сообщения: 2275
Зарегистрирован: 14.11.2005 23:51:26

Re: Length(s) и кириллица

Сообщение SSerge » 30.10.2017 04:58:41

zub писал(а):зачем может понадобиться длина строки в символах?


Var s,s1:string;
...
writeln(s:10,s1:20);

например не будет работать нормально на строках UTF-8
SSerge
энтузиаст
 
Сообщения: 815
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Length(s) и кириллица

Сообщение Лекс Айрин » 30.10.2017 17:46:22

zub писал(а):зачем может понадобиться длина строки в символах?


Например, при сдаче текста в типографию могут потребовать уложиться в определенный объем символов (включая пробелы, но исключая переводы строк) или слов. Обычно, правда, это касается репортеров, т. к. в газетах и журналах очень жесткие рамки по объемам текстов.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4169
Зарегистрирован: 19.02.2013 16:54:51

Re: Length(s) и кириллица

Сообщение pupsik » 30.10.2017 19:24:43

UTF8ToAnsi - не советую. Разные по смыслу функции. Используйте utf8Length из модуля LazUTF8.
pupsik
энтузиаст
 
Сообщения: 1014
Зарегистрирован: 20.08.2014 16:20:13

Re: Length(s) и кириллица

Сообщение runewalsh » 30.10.2017 21:13:21

Наверное, имелось в виду, что длина строки в общем случае не даст нужной информации, например, из неё нельзя сделать вывод об отображаемой ширине, даже моноширинного текста, т. к. есть комбинируемые символы (диакритика etc., например, ударение U+0301) или пустые (типа U+2060 WORD JOINER). Правильный вариант — обойти все символы последовательно, длина для этого не нужна. А так да, функции из модуля LazUTF8.
Аватара пользователя
runewalsh
постоялец
 
Сообщения: 324
Зарегистрирован: 27.04.2010 00:15:25

Re: Length(s) и кириллица

Сообщение wwswowsogon » 31.10.2017 00:25:48

В моем случае проверка делается для того, чтобы уложить в поле ввода символов не более положенного, с последующей записью в БД.
pupsik писал(а):Используйте utf8Length из модуля LazUTF8.

Спасибо.
wwswowsogon
новенький
 
Сообщения: 50
Зарегистрирован: 23.12.2008 20:41:37

Re: Length(s) и кириллица

Сообщение Лекс Айрин » 31.10.2017 09:53:35

runewalsh писал(а):Наверное, имелось в виду, что длина строки в общем случае не даст нужной информации, например, из неё нельзя сделать вывод об отображаемой ширине, даже моноширинного текста, т. к.


Для этого в контексте есть специальная функция, которая позволяет узнать ширину всей строки в пикселях. И вот она уже, по большому счету, нужна только для печати и для переноса слов на другую строку.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 4169
Зарегистрирован: 19.02.2013 16:54:51

Re: Length(s) и кириллица

Сообщение zub » 31.10.2017 15:07:58

SSerge
>>writeln(s:10,s1:20);
а разве это не подпадает под пункт 1? И емнип это должно работать, т.к. :10 это выделенное под вывод место, а не подрезка s по количеству символов или вру?.

Лекс Айрин
length(s) никогда и не соответствовало количеству символов в "типографском" понимании - переводы строк, табуляции, суррогатные пары
zub
долгожитель
 
Сообщения: 2275
Зарегистрирован: 14.11.2005 23:51:26

Re: Length(s) и кириллица

Сообщение SSerge » 31.10.2017 16:16:24

zub писал(а):И емнип это должно работать


не работает.
SSerge
энтузиаст
 
Сообщения: 815
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

Рейтинг@Mail.ru