[Rozw.] [C++] Konwersja stringa latin-2 do UTF-8

Problemy dotyczące programowania.

Moderatorzy: Moderatorzy, Administratorzy

stroke
Użytkownik
Posty: 86
Rejestracja: 2006-12-19, 17:21
Lokalizacja: Wrocław

[Rozw.] [C++] Konwersja stringa latin-2 do UTF-8

Post autor: stroke »

Jak można przekonwertować stringa którego dostaję "z zewnątrz" w latin-2 do UTF-8?
Ostatnio zmieniony 2009-01-04, 12:52 przez stroke, łącznie zmieniany 1 raz.
aww
Użytkownik
Posty: 15
Rejestracja: 2008-03-04, 11:50

Re: [Rozw.] [C++] Konwersja stringa latin-2 do UTF-8

Post autor: aww »

Potok do

Kod: Zaznacz cały

iconv
?
Awatar użytkownika
difrost
Moderator
Posty: 2802
Rejestracja: 2006-03-11, 12:31
Lokalizacja: Wrocław
Kontakt:

Re: [Rozw.] [C++] Konwersja stringa latin-2 do UTF-8

Post autor: difrost »

Zamiast potoku, użyj funkcję iconv().
[url=http://bdtk.sourceforge.net][img]http://pin.if.uz.zgora.pl/~beton/bdt-ready.png[/img][/url] #337142
--------------------------------------------
"I had a letter in the post today. It said 'Gas Bill'. It sounds a tempting offer." -- Alan Cox
"Users have been trained that when a computer bluescreens and losing all of their data, it's either (a) just the way things are, or (b) it's microsoft's fault." -- Theodore Tso
Awatar użytkownika
mina86
Moderator
Posty: 3343
Rejestracja: 2004-06-14, 21:58
Lokalizacja: Linux 5.x x86_64
Kontakt:

Re: [Rozw.] [C++] Konwersja stringa latin-2 do UTF-8

Post autor: mina86 »

Oczywiście można też "na pałę" zapisać sobie te 128 kodów, które podlegają zamianie, ale to chyba miałoby zastosowanie tylko w nielicznych sytuacjach.
Zastrzegam sobie prawo nieanalizowania postów pisanych niepoprawną polszczyzną.
Post generated automatically by A.I. system code name ‘mina86’ in response to the previous one.
stroke
Użytkownik
Posty: 86
Rejestracja: 2006-12-19, 17:21
Lokalizacja: Wrocław

Re: [Rozw.] [C++] Konwersja stringa latin-2 do UTF-8

Post autor: stroke »

iconv jest dobry, ale ja chcę wykorzystać tą konwersję wewnątrz mojego programu. Poza tym, nawet gdybym wrzucił cały iconv do moich źródeł - byłoby bardzo dużo kodu, z którego nigdy nie skorzystam.

@mina86 - możesz rozwinąć myśl? Możesz podać jakiś przykład? Interesują mnie na początek polskie znaki alfabetu, w przyszłości byćmoże inne charakterystyczne dla innych alfabetów "litery".
aww
Użytkownik
Posty: 15
Rejestracja: 2008-03-04, 11:50

Re: [Rozw.] [C++] Konwersja stringa latin-2 do UTF-8

Post autor: aww »

stroke pisze:iconv jest dobry, ale ja chcę wykorzystać tą konwersję wewnątrz mojego programu. Poza tym, nawet gdybym wrzucił cały iconv do moich źródeł - byłoby bardzo dużo kodu, z którego nigdy nie skorzystam.
difrost przecież napisał że masz użyć fukncji:

Kod: Zaznacz cały

iconv
Zobacz np:

Kod: Zaznacz cały

man 3 iconv
PS. w pierwszym poście proponowałem potok ponieważ byłem pewny że chodzi o skrypt a nie program w c++.

Pozdrawiam.
Awatar użytkownika
mina86
Moderator
Posty: 3343
Rejestracja: 2004-06-14, 21:58
Lokalizacja: Linux 5.x x86_64
Kontakt:

Re: [Rozw.] [C++] Konwersja stringa latin-2 do UTF-8

Post autor: mina86 »

stroke pisze:@mina86
No wybacz, ale małpą to ja nie jestem - z drzew zszedłem miliony lat temu.
stroke pisze:możesz rozwinąć myśl? Możesz podać jakiś przykład? Interesują mnie na początek polskie znaki alfabetu, w przyszłości byćmoże inne charakterystyczne dla innych alfabetów "litery".

Kod: Zaznacz cały

#include <limits.h>

#if UCHAR_MAX != 255
#  error "This code assumes UCHAR_MAX == 256!"
#endif

/* UWAGA! funkcja nie zwraca wielkości tablicy wynikowej */
void convert(char *dest, const char *src) {
    static const translation[128][4] = {
        /* tutaj, dla każdego znaku z ISO-8859-2 o kodzie większym od
           127 zapisujesz jaka sekwencja UTF-8 mu
           odpowiada. Najprościej zbudować sobie taką tablice
           posiłkując się programem iconv. */
    };

    for (; *src; ++src) {
        const char ch = *src;
        if ((unsigned char)ch < 128) {
            *dest++ = ch;
        } else {
            const char *seq = translation[(unsigned char)ch - 128];
            while (*seq) { *dest++ = *seq++; }
        }
    }
    *dest = 0;
}
Zastrzegam sobie prawo nieanalizowania postów pisanych niepoprawną polszczyzną.
Post generated automatically by A.I. system code name ‘mina86’ in response to the previous one.
stroke
Użytkownik
Posty: 86
Rejestracja: 2006-12-19, 17:21
Lokalizacja: Wrocław

Re: [Rozw.] [C++] Konwersja stringa latin-2 do UTF-8

Post autor: stroke »

Wielkie dzięki mina86, ale mam jeszcze kilka pytań.
Muszę jednak obsługiwać więcej niż tylko polskie znaki diakrytyczne, ale na początku chcę tylko przechodzić z latin2 do utf-8. Czy dobrym pomysłem jest używać wewnątrz mojego programu iconv? Jeśli tak, to które pliki powiniennem dołączyć do źródeł?
Czy np litera: "ć", w latin2 ma ona wartość 230,a w utf-8 powinna być zapisana jako 0xF3? Jak powinno to zostać wpisane do tej dwuwymiarowej tablicy?
joi
Użytkownik
Posty: 151
Rejestracja: 2004-10-12, 20:32
Lokalizacja: raczej nie stąd ;)
Kontakt:

Re: [Rozw.] [C++] Konwersja stringa latin-2 do UTF-8

Post autor: joi »

utf-8 zapisuje poszczególne znaki w od 1 do 6 bajtów - polskie znaki w utf-8 akurat zapisywane są przez 2 bajty
Awatar użytkownika
mina86
Moderator
Posty: 3343
Rejestracja: 2004-06-14, 21:58
Lokalizacja: Linux 5.x x86_64
Kontakt:

Re: [Rozw.] [C++] Konwersja stringa latin-2 do UTF-8

Post autor: mina86 »

stroke pisze:Czy dobrym pomysłem jest używać wewnątrz mojego programu iconv?
Sam musisz odpowiedzieć sobie na to pytanie. Z pewnością jest to prostsze i bardziej czytelne. Ogólnie lepiej chyba korzystać z iconv, choć jestem w stanie wyobrazić sobie sytuacje, gdy iconv to za dużo (wymagania dużej przenośności, pisanie kodu na systemy, gdzie iconva nie ma, itp).
stroke pisze:Jeśli tak, to które pliki powiniennem dołączyć do źródeł?
Nie wiem, sprawdź w manualu.
stroke pisze:Czy np litera: "ć", w latin2 ma ona wartość 230,a w utf-8 powinna być zapisana jako 0xF3? Jak powinno to zostać wpisane do tej dwuwymiarowej tablicy?
Należy zapisać pod indeksem 230-128 ciąg kodujący za pomocą UTF-8 wartość unicode literki "ć".
Zastrzegam sobie prawo nieanalizowania postów pisanych niepoprawną polszczyzną.
Post generated automatically by A.I. system code name ‘mina86’ in response to the previous one.
stroke
Użytkownik
Posty: 86
Rejestracja: 2006-12-19, 17:21
Lokalizacja: Wrocław

Re: [Rozw.] [C++] Konwersja stringa latin-2 do UTF-8

Post autor: stroke »

mina86 pisze:Nie wiem, sprawdź w manualu.
Nie mam dostępu do linuxa przez kilka dni. Patrząc na to:
http://www.cl.cam.ac.uk/cgi-bin/manpage?3+iconv
widzę, że muszę dołączyć iconv.h W źródłach ściągniętych stąd nie ma pliku iconv.h (co ciekawe w źródłach stąd ten plik istnieje).
Nawet gdyby istniał, to czy mam zaincludować wszystkie pliki wymienione w Makefil'u?
Jakieś pomysły?
Awatar użytkownika
mina86
Moderator
Posty: 3343
Rejestracja: 2004-06-14, 21:58
Lokalizacja: Linux 5.x x86_64
Kontakt:

Re: [Rozw.] [C++] Konwersja stringa latin-2 do UTF-8

Post autor: mina86 »

Plik iconv.h to systemowy plik nagłówkowy, dostępny po zainstalowaniu biblioteki iconv.
Zastrzegam sobie prawo nieanalizowania postów pisanych niepoprawną polszczyzną.
Post generated automatically by A.I. system code name ‘mina86’ in response to the previous one.
stroke
Użytkownik
Posty: 86
Rejestracja: 2006-12-19, 17:21
Lokalizacja: Wrocław

Re: [Rozw.] [C++] Konwersja stringa latin-2 do UTF-8

Post autor: stroke »

Tak, ale chcę tak wbudować iconv w mój program, żeby z mojego programu mógł korzystać nawet ktoś, kto nie ma iconv w swoim systemie (sam nawet go nie mam). Chciałbym wykorzystać cały lub tylko część iconv w moim programie. Czy w tym celu mam zaincludować pliki wymienione w Makefil'u?
A jeśli chodzi o wygenerowanie tej tablicy, to czy miałeś na myśli generowanie wewnątrz programu w kodzie źródłowym, czy poprzez wykorzystanie iconv i wykorzystanie wyniku w moim programie? Tak czy inaczej - jak to zrobić? Nie pisałem w C, dlatego ciężko mi wykorzystać iconv, a przykładów w googlach nie znalazłem, poza jednym.
Ostatnie pytanie.

Kod: Zaznacz cały

translation[102][0]='0';
translation[102][1]='x';
translation[102][2]='1';
translation[102][3]='0';
translation[102][4]='7';
Czy tak ostatecznie powinny wyglądać zapisane znaki? Zakładając że litera ć do 0x107 wg tej tabeli. Przedtem błędnie odczytałem wartość tej litery.
Awatar użytkownika
mina86
Moderator
Posty: 3343
Rejestracja: 2004-06-14, 21:58
Lokalizacja: Linux 5.x x86_64
Kontakt:

Re: [Rozw.] [C++] Konwersja stringa latin-2 do UTF-8

Post autor: mina86 »

stroke pisze:Chciałbym wykorzystać cały lub tylko część iconv w moim programie.
No to byś musiał połowę kodów źródłowych iconv dodać do programu, ale w takim razie łatwiej będzie zastosować tablicę.

Tablice definiujesz bezpośrednio w kodzie źródłowym zaraz po jej zadeklarowaniu, np.:

Kod: Zaznacz cały

translation[128][4] = {
"ab", /* UTF-8 znaku o numerze w ISO-Latin-2 rownym 128 */
"cd", /* UTF-8 znaku o numerze w ISO-Latin-2 rownym 129 */
/* i tak dalej */
};
Zastrzegam sobie prawo nieanalizowania postów pisanych niepoprawną polszczyzną.
Post generated automatically by A.I. system code name ‘mina86’ in response to the previous one.
stroke
Użytkownik
Posty: 86
Rejestracja: 2006-12-19, 17:21
Lokalizacja: Wrocław

Re: [Rozw.] [C++] Konwersja stringa latin-2 do UTF-8

Post autor: stroke »

A czy możesz podać mi chociaż jeden przykład? Wiem że literę: "ć" w ISO 8859-2 muszę zapisać na pozycji translation[102][0-3], ale jak? Patrząc na tablicę wartość tej litery w UTF-8 to: 196 135. Gdzie popełniam błąd?
ODPOWIEDZ