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

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

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

wwswowsogon
постоялец
Сообщения: 157
Зарегистрирован: 23.12.2008 19:41:37

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

Сообщение wwswowsogon »

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

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

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

Т.е. один кириллический символ компилятор считает за два. Наверное, это нормально, но
1) подскажите, где про это можно почитать подробнее?
2) как с этим бороться? Мне помогло Length(UTF8ToAnsi(s)).
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

Сообщение pupsik »

utf8Length
в wiki всё описано
Аватара пользователя
Дож
энтузиаст
Сообщения: 900
Зарегистрирован: 12.10.2008 16:14:47

Сообщение Дож »

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

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

Использовать не Length, которая во многих случаях считает число байт в строке, а ту функцию, которая посчитает число utf-8 символов.
wwswowsogon
постоялец
Сообщения: 157
Зарегистрирован: 23.12.2008 19:41:37

Сообщение wwswowsogon »

Спасибо! А есть ли такие функции в FPC?
SSerge
энтузиаст
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Сообщение SSerge »

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


Var S:UnicodeString;

-- в отношении русского языка length длину будет считать правильно. До тех пор, пока в тексте не встретятся знаки с суррогатными парами :D
wwswowsogon
постоялец
Сообщения: 157
Зарегистрирован: 23.12.2008 19:41:37

Сообщение wwswowsogon »

Спасибо, но не понятно, подойдет ли это.
Ладно, буду пока использовать UTF8ToAnsi, спасибо всем за информацию!
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

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

Имхо это только
1)форматирование и отрисовка текста - т.е. написание чегото типа tmemo
2)Выполнение какойнить кривой студенческой задачки
SSerge
энтузиаст
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Сообщение SSerge »

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


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

например не будет работать нормально на строках UTF-8
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

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


Например, при сдаче текста в типографию могут потребовать уложиться в определенный объем символов (включая пробелы, но исключая переводы строк) или слов. Обычно, правда, это касается репортеров, т. к. в газетах и журналах очень жесткие рамки по объемам текстов.
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

Сообщение pupsik »

UTF8ToAnsi - не советую. Разные по смыслу функции. Используйте utf8Length из модуля LazUTF8.
Аватара пользователя
runewalsh
энтузиаст
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

Сообщение runewalsh »

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

Сообщение wwswowsogon »

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

Спасибо.
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

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


Для этого в контексте есть специальная функция, которая позволяет узнать ширину всей строки в пикселях. И вот она уже, по большому счету, нужна только для печати и для переноса слов на другую строку.
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

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

Лекс Айрин
length(s) никогда и не соответствовало количеству символов в "типографском" понимании - переводы строк, табуляции, суррогатные пары
SSerge
энтузиаст
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Сообщение SSerge »

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


не работает.
Ответить