Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Как работает Utf8ToString ?  [new]
Pcrepair
Member

Откуда:
Сообщений: 661
Добрый день. Есть следующая ситуация :
функция Utf8ToString которой передается строка Спасибо Р·Р° ваше РїРёСЃСЊРјРѕ
на выходе все нормально, но
изначально без использования Utf8ToString, Length возвращает 43 символа, после Utf8ToString остается 24 символа

Вопрос : где остальные символы?
8 май 18, 21:47    [21396963]     Ответить | Цитировать Сообщить модератору
 Re: Как работает Utf8ToString ?  [new]
SOFT FOR YOU
Member [заблокирован]

Откуда:
Сообщений: 2761
Pcrepair,

Их изначально своровали у цыган, а сейчас вернули )
8 май 18, 22:03    [21396994]     Ответить | Цитировать Сообщить модератору
 Re: Как работает Utf8ToString ?  [new]
alekcvp
Member

Откуда:
Сообщений: 1103
Pcrepair
Вопрос : где остальные символы?

Length(строка) возвращает количество элементов строки, а не символов. У AnsiString и Utf8String элемент - это байт, у UnicodeString (и WideString?) элемент - это слово (Word).
Соответственно в вашем случае Length возвращает длину строки в байтах.
8 май 18, 23:35    [21397160]     Ответить | Цитировать Сообщить модератору
 Re: Как работает Utf8ToString ?  [new]
alekcvp
Member

Откуда:
Сообщений: 1103
alekcvp
У AnsiString и Utf8String элемент - это байт, у UnicodeString (и WideString?) элемент - это слово (Word).

Если быть более дотошным, то у AnsiString элемент - это AnsiChar, у Utf8String - это байт ( = AnsiChar), а у UnicodeString - это Char (= Word).
8 май 18, 23:37    [21397164]     Ответить | Цитировать Сообщить модератору
 Re: Как работает Utf8ToString ?  [new]
bk0010
Member

Откуда:
Сообщений: 4619
Почти вся правда про UTF-8
PS
Pcrepair
Length возвращает 43 символа, после Utf8ToString остается 24 символа
- это нормально.
Для дальнейшей беседы рекомендую указывать версию Dephi и предупреждаю, что в юникодных Delphi число байт и число символов будут ощутимо различаться, а так же о том, что "юникоды бывают разные" (с) Кролик.
8 май 18, 23:38    [21397168]     Ответить | Цитировать Сообщить модератору
 Re: Как работает Utf8ToString ?  [new]
Pcrepair
Member

Откуда:
Сообщений: 661
версия XE3

больше информации
- есть строки с разной кодировкой, Utf8ToString позволяет восстановить нужную кодировку (Спасибо Р·Р° ваше РїРёСЃСЊРјРѕ = Спасибо за ваше письмо)
- но нужно определять когда использовать функцию, так как отдельные строки не нуждаются в смене кодовой? страницы? там наоборот, если применить функцию выходят кракозябры
тут возникает задача как определить, применять функцию или нет, пока вот так :
BodyText:RawByteString;
s1,s2:string;

      s1:=BodyText;
      s2:=Utf8ToString(BodyText);
          if (Length(s1) > Length(s2)) then
          begin
            Memo1.Lines.Add(DeleteAllTegs(DelFullTegs(DelUseLessSymbol(s2)),FALSE));
          end
          else
          begin
            Memo1.Lines.Add(DeleteAllTegs(DelFullTegs(DelUseLessSymbol(s1)),FALSE));
          end;

но это какой то мутный способ. не уверен что 100% -ный
может есть еще способ определить, использовать Utf8ToString или нет?
9 май 18, 08:17    [21397364]     Ответить | Цитировать Сообщить модератору
 Re: Как работает Utf8ToString ?  [new]
SOFT FOR YOU
Member [заблокирован]

Откуда:
Сообщений: 2761
Pcrepair,

Элементы UTF-8 имеют строго регламентированную маску и разнообразие бит. Кроме того, разумеется, каждый символ должен быть <= #$00ff

Это не гарантированный вариант, но на практике даст очень высокую точность.

А вообще лучше не смешивать ANSI и UTF-8
9 май 18, 09:34    [21397467]     Ответить | Цитировать Сообщить модератору
 Re: Как работает Utf8ToString ?  [new]
alekcvp
Member

Откуда:
Сообщений: 1103
Pcrepair,

Кроме вышеприведённого совета ещё можно использовать статистический анализ текста, но стоит ли заморочек - вопрос.
Как пример: если текст точно русский, то можно посчитать количество символов "Р" в строке - если превышен некий порог, то значит это UTF8. Кстати, для латинского текста UTF8 совпадает с Win1252 AFAIK.
9 май 18, 12:43    [21397710]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить