[Rozw.] [C++] Konwersja stringa latin-2 do UTF-8
Moderatorzy: Moderatorzy, Administratorzy
[Rozw.] [C++] Konwersja stringa latin-2 do UTF-8
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.
Re: [Rozw.] [C++] Konwersja stringa latin-2 do UTF-8
Potok do
?
Kod: Zaznacz cały
iconv
Re: [Rozw.] [C++] Konwersja stringa latin-2 do UTF-8
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
--------------------------------------------
"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
Re: [Rozw.] [C++] Konwersja stringa latin-2 do UTF-8
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.
Post generated automatically by A.I. system code name ‘mina86’ in response to the previous one.
Re: [Rozw.] [C++] Konwersja stringa latin-2 do UTF-8
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".
@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".
Re: [Rozw.] [C++] Konwersja stringa latin-2 do UTF-8
difrost przecież napisał że masz użyć fukncji: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.
Kod: Zaznacz cały
iconv
Kod: Zaznacz cały
man 3 iconv
Pozdrawiam.
Re: [Rozw.] [C++] Konwersja stringa latin-2 do UTF-8
No wybacz, ale małpą to ja nie jestem - z drzew zszedłem miliony lat temu.stroke pisze:@mina86
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.
Post generated automatically by A.I. system code name ‘mina86’ in response to the previous one.
Re: [Rozw.] [C++] Konwersja stringa latin-2 do UTF-8
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?
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?
Re: [Rozw.] [C++] Konwersja stringa latin-2 do UTF-8
utf-8 zapisuje poszczególne znaki w od 1 do 6 bajtów - polskie znaki w utf-8 akurat zapisywane są przez 2 bajty
Re: [Rozw.] [C++] Konwersja stringa latin-2 do UTF-8
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:Czy dobrym pomysłem jest używać wewnątrz mojego programu iconv?
Nie wiem, sprawdź w manualu.stroke pisze:Jeśli tak, to które pliki powiniennem dołączyć do źródeł?
Należy zapisać pod indeksem 230-128 ciąg kodujący za pomocą UTF-8 wartość unicode literki "ć".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?
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.
Post generated automatically by A.I. system code name ‘mina86’ in response to the previous one.
Re: [Rozw.] [C++] Konwersja stringa latin-2 do UTF-8
Nie mam dostępu do linuxa przez kilka dni. Patrząc na to:mina86 pisze:Nie wiem, sprawdź w manualu.
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?
Re: [Rozw.] [C++] Konwersja stringa latin-2 do UTF-8
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.
Post generated automatically by A.I. system code name ‘mina86’ in response to the previous one.
Re: [Rozw.] [C++] Konwersja stringa latin-2 do UTF-8
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.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.
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';
Re: [Rozw.] [C++] Konwersja stringa latin-2 do UTF-8
No to byś musiał połowę kodów źródłowych iconv dodać do programu, ale w takim razie łatwiej będzie zastosować tablicę.stroke pisze:Chciałbym wykorzystać cały lub tylko część iconv w moim programie.
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.
Post generated automatically by A.I. system code name ‘mina86’ in response to the previous one.
Re: [Rozw.] [C++] Konwersja stringa latin-2 do UTF-8
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 tę tablicę wartość tej litery w UTF-8 to: 196 135. Gdzie popełniam błąd?