[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Unikody, UTF-8 i Progress - Finał



Witam !
W piąteka zostałem "przywołany do tablicy" w sprawie konwersji na UTF-8. Jest to temat, na który szukałem wcześniej odpowiedzi na naszej liście dyskusyjnej. Ponieważ nikt na ten temat nie miał żadnych propozycji, więc musiałem temat rozpracować sam. Historia jest puczająca, więc podam ją w całości.
W poprzednim liscie pisałem, że Progress dokonuje takiej konwersji, tyle że tekst zapisanyw UTF-8 przez produkt firmy Sybase nie jest poprawnie czytany przez program Progress'owy (chodzi oczywiscie o nasze rodzime polskie znaki). Wygenerowałem więc tekst z polskimi literami w Progress'ie i zapisałem go w UTF-8 do pliku. Porównałem ten sam tekst zapisany do pliku przez prdukt Sybase, też w UTF-8, oczywiście wyglądał inaczej. Zabrałem się więc do studiowania Unikodów i standardu UTF-8 na stronach WWW. Kiedy już poznałem z jak wygląda zamiana znaków na kody jedno i dwubajtowe, jakie kody przypisano poszczególnym znakom rozpisałem to co zapisał do pliku Progress i Sybase by znaleźć jakie wartości kodów przypisał Progress i Sybase naszym ogonkowo-kreskowym literom. No i tutaj sprawa się wyjaśniła: Sybase naszym literkom przypisał kody obowiązujące w standardzie Unikod, natomiast Progress przypisał kody ze standardu 1250 (zgodne z cpinternal, bo działałem pod Windows'ami) !!!.  Jedynym logicznym wnioskiem było obejrzenie tablicy konwersji 1250 -- UTF-8. I tutaj kolejne zaskoczenie - w pliku convmap.dat nie ma w ogóle tablicy konwersji: 1250 -- UTF-8. Jest sporo innych tablic konwersji, np: ISO8859-1 -- UTF-8, ISO8859-2 -- UTF-8, 1252, 1253, 1254, 1256 -- UTF-8, ale tej co potrzeba to nie ma. I tutaj rodzi się kolejne pytanie: to dlaczego nie ma komunikatu będu, ze brak tablicy konwersji 1250 -- UTF-8, które Progress zawsze wypisywał ilekroć brakowało jakiejś tablicy konwersji ? Uruchomiłem więc mój program, by zapisał w standardzie UTF-9 (zmyślonym), oczywiście komunikat błedu pojawił się, że brak tablicy konwersji 1250 -- UTF-9. Dlaczego nie sygnalizuje tego w przypdadku UTF-8 i wykonuje jakąś abstrakcyjna knwersję to jest słodką tajemnicą Progress'a. Oczywiście po zdefiniowaniu własnej tablicy konwersji wszystko zaczęło działać (jakie są kody polskik liter w Unikodzie to nauczyłem się wcześniej niejako przy okazji).
Oczywiście, teraz wiem, że powinienem zacząć od sprawdzenia, czy taka tablica konwersji jest zdefiniowana, ale skoro w dokumentacji tak zachęcają  do Unikodów i UTF-8, skoro jest tych tablic konwersji chyba ponad setka, skoro Progress nie pisze, że brak takiej tablicy, no to niestety wyszło jak wyszło i nie jest to tylko moja nieuwaga - firma Progress też mogłaby wziąć trochę winy na siebie, i potraktować moje dociekanie jako konsultacje (najlepiej w cenie 2999 zł za 8 godzin pracy, wg oficjalnego cennika).
Do listu dołączam stworzoną przeze mnie taką tablicę konwersji (tablicę konwersji w drugą stronę: UTF-8 -- 1250 Progress tworzy automatycznie). Jest ona raczej przymiarką do rozwiązania tego problemu, bo poprwanie zamienia na Unikody znaki o kodach 0-127 i polskie litery. By tablicę zdefiniować porządnie, należałoby znaleźć odpowiednik każdego znaku ze strony kodowej 1250 w Unikodzie (wbrew pozorom, nie jest to banalna czynność, bo znaków jest tysiące i niektóre sa bardzo podobne do siebie) i jego kod wpisać w odpowiednią pozycję tabeli konwersji. Ponieważ wymaga to trochę czasu a moje potrzeby w tym zakresie zaspokaja stworzona przeze mnie tabela, więc zabawę z tym tematem przerywam. Jak życie mnie przymusi do dalszych kroków, to udostepnię ulepszoną tabelę.

PS. Dalsza część listu wraz z załcznikiem w nastepnym liście, bo "maszynka" obsługująca pocztę nie dopuszcza listów większych niż 10KB i nie przepuściła mego zbyt długiego listu.

                   
Henryk Jusza               mailto:henju@pg.gda.pl
--------------------------------------------------------------
Ośrodek Informatyczny Politechniki Gdańskiej
Pracownia Rozwoju Oprogramowania
tel (058) 347-28-01          fax (058) 347-24-63