21 Востаннє редагувалося Betterthanyou (24.01.2018 02:30:37)

Re: UTF8 Приблуда - нащо?

Так є ж спеціальні методи і типи даних для роботи з UTF8
http://docwiki.embarcadero.com/RADStudi … n_Routines
http://docs.embarcadero.com/products/ra … rings.html
System.WideStrUtils.UTF8CharLength
System.WideStrUtils.UTF8CharSize

http://docwiki.embarcadero.com/RADStudi … s_(Delphi)
UnicodeString
WideString

Я не знаю delfi 7 Delphi 7 тому наведу приклад в C++Builder XE8, це все легко робиться (у віконних програмах)

//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    UnicodeString Str1 = Edit1->Text;
    unsigned int Str1Length = Str1.Length();
    for(int i=1;i<=Str1Length; i++)
        RichEdit1->Lines->Add(L"Рядок " + IntToStr( i ) + ") " + Str1[i]);
//Str1[i] - оперування посимвольно
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    RichEdit1->Lines->Add(L"Розмір рядка: " +
        IntToStr (Edit1->Text.Length()) + L" символи");
//визначення довжини [s]стрічки[/s] рядка
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
    UnicodeString Str1 = Edit1->Text;
    unsigned int Str1Length = Str1.Length();
    for(int i=1;i<=Str1Length; i++)
        RichEdit1->Lines->Add(L"Байти символа " +
        IntToStr( i ) + ") " +
        IntToHex(Str1[i],4)
        );
//IntToHex(Str1[i],4) - масив байт (конвертування в рядок)
}
//---------------------------------------------------------------------------

Демонстрація результату
http://i.piccy.info/i9/d562ff2feecdbcafb6cec8333108b291/1516751592/13887/1214016/Untitlged.png
https://drive.google.com/open?id=1rDvBX … fpxzfpTwQu


по перше великий розмір даних

Текст, що складається тільки з символів, коди яких менші ніж 128, при записі в UTF-8 перетворюється на звичайний текст ASCII., об'єм даних збільшується тільки тоді, коли використовуються символи що не ввійшли у ASCII

Подякували: 221VOLT1

22

Re: UTF8 Приблуда - нащо?

vsprosto написав:

по перше великий розмір даних- для  не латинських символів -для кирилиці в два рази.(Зауважу для веб сторінок це менше- багато займають службові слова)

З юнікодом інакше ніяк не вийде, а без юнікоду в сучасному світі життя уже немає.

vsprosto написав:

по друге складність оперування посимвольно для не латинських символів - не можна звернутись як до масиву байт, програмно оперувати з utf8 стрічкою складніше.
по третє на великих обємах падає продуктивність.

Вам ніхто не забороняє конвертувати текст в UTF-32 перед початком обробки. Але у цьому випадку у вас швидкість може впасти іще більше, бо у сучасних процесорів доволі маленькі кеші.

vsprosto написав:

З реальних давніх  випадків - була база 17 тис абонентів - доступ був через базу sql firebird писана була спочатку на delfi 7 потім на codetyphon без підтримки потім з підтримкою utf8 - швидкість виборки з utf8 - в два рази повільніше.

Можна конвертувати базу UTF-16, але по хорошому, якщо вас не влаштовує швидкодія, то спочатку треба провести тести, і визначити, що саме тормозить. Бо інколи бувають сюрпризи, наприклад під час конвертування зламався індекс, чи щось подібне.

Подякували: 221VOLT, vsprosto, HetmanNet3

23

Re: UTF8 Приблуда - нащо?

0xDADA11C7 написав:

vsprosto
Якою кодовою сторінкою ви послуговувалися до того?

З реальних давніх  випадків - була база 17 тис абонентів - доступ був через базу sql firebird писана була спочатку на delfi 7 потім на codetyphon без підтримки потім з підтримкою utf8 - швидкість виборки з utf8 - в два рази повільніше.

Ну то ведіть БД кодовою сторінкою, але імпортуйте дані з УТФ8. Я вважаю, що всі кодові сторінки гидотні і юнікод гидотний, нема людської кодової сторінки для ціє ї ж кирилиці(не лише чинний правопис) з псевдографікою і грецькою абеткою.

У моїй ситуації - кодова сторінка даних бази та тексту був win1251, але компоненти всі- форми, гріди в utf8 і при зєднанні потрібно було вказувати, що нам потрібні дані в utf8- сервер відповідно в себе швидко все це переконвертував(прозоро) та збільшені в два рази данні.

продовжу пізніше ...

Подякували: 0xDADA11C71