Length(s) и кириллица
Модератор: Модераторы
-
wwswowsogon
- постоялец
- Сообщения: 157
- Зарегистрирован: 23.12.2008 19:41:37
Length(s) и кириллица
Всем доброго времени суток!
Прошу прощения, если поднял избитую тему, но для меня это было новостью.
Сущность явления:
s = '111s1';
Length(s) = 5;
s = '111ы1';
Length(s) = 6.
Т.е. один кириллический символ компилятор считает за два. Наверное, это нормально, но
1) подскажите, где про это можно почитать подробнее?
2) как с этим бороться? Мне помогло Length(UTF8ToAnsi(s)).
Прошу прощения, если поднял избитую тему, но для меня это было новостью.
Сущность явления:
s = '111s1';
Length(s) = 5;
s = '111ы1';
Length(s) = 6.
Т.е. один кириллический символ компилятор считает за два. Наверное, это нормально, но
1) подскажите, где про это можно почитать подробнее?
2) как с этим бороться? Мне помогло Length(UTF8ToAnsi(s)).
utf8Length
в wiki всё описано
в wiki всё описано
подскажите, где про это можно почитать подробнее?
https://ru.wikipedia.org/wiki/UTF-8
как с этим бороться?
Использовать не Length, которая во многих случаях считает число байт в строке, а ту функцию, которая посчитает число utf-8 символов.
-
wwswowsogon
- постоялец
- Сообщения: 157
- Зарегистрирован: 23.12.2008 19:41:37
Спасибо! А есть ли такие функции в FPC?
wwswowsogon писал(а):Спасибо! А есть ли такие функции в FPC?
Var S:UnicodeString;
-- в отношении русского языка length длину будет считать правильно. До тех пор, пока в тексте не встретятся знаки с суррогатными парами
-
wwswowsogon
- постоялец
- Сообщения: 157
- Зарегистрирован: 23.12.2008 19:41:37
Спасибо, но не понятно, подойдет ли это.
Ладно, буду пока использовать UTF8ToAnsi, спасибо всем за информацию!
Ладно, буду пока использовать UTF8ToAnsi, спасибо всем за информацию!
>>Ладно, буду пока использовать UTF8ToAnsi, спасибо всем за информацию!
зачем может понадобиться длина строки в символах?
Имхо это только
1)форматирование и отрисовка текста - т.е. написание чегото типа tmemo
2)Выполнение какойнить кривой студенческой задачки
зачем может понадобиться длина строки в символах?
Имхо это только
1)форматирование и отрисовка текста - т.е. написание чегото типа tmemo
2)Выполнение какойнить кривой студенческой задачки
zub писал(а):зачем может понадобиться длина строки в символах?
Var s,s1:string;
...
writeln(s:10,s1:20);
например не будет работать нормально на строках UTF-8
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
zub писал(а):зачем может понадобиться длина строки в символах?
Например, при сдаче текста в типографию могут потребовать уложиться в определенный объем символов (включая пробелы, но исключая переводы строк) или слов. Обычно, правда, это касается репортеров, т. к. в газетах и журналах очень жесткие рамки по объемам текстов.
UTF8ToAnsi - не советую. Разные по смыслу функции. Используйте utf8Length из модуля LazUTF8.
Наверное, имелось в виду, что длина строки в общем случае не даст нужной информации, например, из неё нельзя сделать вывод об отображаемой ширине, даже моноширинного текста, т. к. есть комбинируемые символы (диакритика etc., например, ударение U+0301) или пустые (типа U+2060 WORD JOINER). Правильный вариант — обойти все символы последовательно, длина для этого не нужна. А так да, функции из модуля LazUTF8.
-
wwswowsogon
- постоялец
- Сообщения: 157
- Зарегистрирован: 23.12.2008 19:41:37
В моем случае проверка делается для того, чтобы уложить в поле ввода символов не более положенного, с последующей записью в БД.
Спасибо.
pupsik писал(а):Используйте utf8Length из модуля LazUTF8.
Спасибо.
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
runewalsh писал(а):Наверное, имелось в виду, что длина строки в общем случае не даст нужной информации, например, из неё нельзя сделать вывод об отображаемой ширине, даже моноширинного текста, т. к.
Для этого в контексте есть специальная функция, которая позволяет узнать ширину всей строки в пикселях. И вот она уже, по большому счету, нужна только для печати и для переноса слов на другую строку.
SSerge
>>writeln(s:10,s1:20);
а разве это не подпадает под пункт 1? И емнип это должно работать, т.к. :10 это выделенное под вывод место, а не подрезка s по количеству символов или вру?.
Лекс Айрин
length(s) никогда и не соответствовало количеству символов в "типографском" понимании - переводы строк, табуляции, суррогатные пары
>>writeln(s:10,s1:20);
а разве это не подпадает под пункт 1? И емнип это должно работать, т.к. :10 это выделенное под вывод место, а не подрезка s по количеству символов или вру?.
Лекс Айрин
length(s) никогда и не соответствовало количеству символов в "типографском" понимании - переводы строк, табуляции, суррогатные пары
zub писал(а):И емнип это должно работать
не работает.
