[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