Forum Coders' city Strona Główna Coders' city
Nasza pasja to programowanie!
 

 PomocPomoc   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy  RejestracjaRejestracja 
Archiwum starego forum + teoria    RSS & Panel/SideBar
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Potrzebuję szybkiej odpowiedzi na moje pytanie... Skrócony regulamin

[WinAPI] win1259 <-> UTF8

Idź do strony 1, 2  Następny

 
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Biblioteki
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
mikmas



Dołączył: 26 Maj 2005
Posty: 5617
Skąd: From Alex Stadt

PostWysłany: Wto Sty 10, 2012 10:26 am      Temat postu: [WinAPI] win1259 <-> UTF8 Odpowiedz z cytatem Pisownia

Czy jest funkcja konwertująca z/do win1259 do/z UTF-8?
_________________
-----BEGIN GEEK CODE BLOCK-----
Version: 3.1
GCS d- s---:--->+:+ a-->--- C++(+++) U-- P+ L-- E--
W++ N+ o-- K- w++(+++) O--- M-(--) V-- PS PE++ Y
PGP- t 5 X++ R tv- b+ DI- D+++(++++) G++ e h* r+ y?
------END GEEK CODE BLOCK------
Alternatywny komunikator GG
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email Odwiedź stronę autora Numer GG Tlen
marcin_an
Site Admin


Dołączył: 26 Maj 2005
Posty: 17278
Skąd: z drugiej strony Kabla

PostWysłany: Wto Sty 10, 2012 10:40 am      Temat postu: Odpowiedz z cytatem Pisownia

UTF-8 pod Windowsem? Zostałeś masochistą? ;)
  1. Użyj MultiByteToWideChar do konwersji z win-1259 na UCS-2.
  2. Użyj WideCharToMultiByte do konwersji z UCS-2 na UTF-8.
Nie wiem, jak jest z prawidłowością wyniku w UTF-8 - wszak to MS, a oni lubią tworzyć swoje własne, "ulepszone" wersje standardów.

_________________
Matematyka to taki twór, który pozwala opisać sokowirówkę jako urządzenie pobierające ujemne odpadki i produkujące z nich sok.
"Lameria atakuje" | RTFM | UMLet - edytor UML inaczej | Wykłady ks.Pawlukiewicza
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
mikmas



Dołączył: 26 Maj 2005
Posty: 5617
Skąd: From Alex Stadt

PostWysłany: Wto Sty 10, 2012 11:54 am      Temat postu: Odpowiedz z cytatem Pisownia

Dane, które muszę wysłać na FTP niestety muszą być w UTF-8

Trochę nie rozumiem tych funkcji:
1. Użyj AdoB, aby skonwertować A do B
2. Użyj BdoA, aby skonwertować B do C

? :D

EDIT!
A widzisz! Cwaniaki dali różne argumenty :D. Zaraz przetestuję

_________________
-----BEGIN GEEK CODE BLOCK-----
Version: 3.1
GCS d- s---:--->+:+ a-->--- C++(+++) U-- P+ L-- E--
W++ N+ o-- K- w++(+++) O--- M-(--) V-- PS PE++ Y
PGP- t 5 X++ R tv- b+ DI- D+++(++++) G++ e h* r+ y?
------END GEEK CODE BLOCK------
Alternatywny komunikator GG
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email Odwiedź stronę autora Numer GG Tlen
marcin_an
Site Admin


Dołączył: 26 Maj 2005
Posty: 17278
Skąd: z drugiej strony Kabla

PostWysłany: Wto Sty 10, 2012 11:58 am      Temat postu: Odpowiedz z cytatem Pisownia

mikmas napisał:
Dane, które muszę wysłać na FTP niestety muszą być w UTF-8
A.. no to jeszcze zrozumiałe. Myślałem, że chcesz pisać w WinAPI aplikację, która w całości będzie chodziła na UTF-8. Niestety, Windows nadal chodzi na UCS-2, więc koniecznym byłoby konwertowanie wszystkiego co chwilę.
mikmas napisał:
Trochę nie rozumiem tych funkcji:
1. Użyj AdoB, aby skonwertować A do B
2. Użyj BdoA, aby skonwertować B do C
A czego nie rozumiesz? Najpierw zamieniasz A na B, a potem B na C, bo nie ma niczego (przynajmniej mnie nie wiadomo, by istniało), co pozwalałby zamienić A na C bezpośrednio.

Z ciekawości: co to za kodowanie? Z cp1259 spotykam się pierwszy raz, a Google nie daje żadnej sensownej odpowiedzi.

_________________
Matematyka to taki twór, który pozwala opisać sokowirówkę jako urządzenie pobierające ujemne odpadki i produkujące z nich sok.
"Lameria atakuje" | RTFM | UMLet - edytor UML inaczej | Wykłady ks.Pawlukiewicza
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
mikmas



Dołączył: 26 Maj 2005
Posty: 5617
Skąd: From Alex Stadt

PostWysłany: Wto Sty 10, 2012 12:02 pm      Temat postu: Odpowiedz z cytatem Pisownia

Wiem, wiem zedytowałem posta dopiero po tym, jak rzuciłem okiem na msdn :)

Dodane przez moderatora (łączenie postów)

Coś źle robię. Na szybko machnąłem taki kodzik (docelowo i tak inny język będzie):
Kod:
int main()
{
    BOOL udc;
    char src[60];
    char output[60];
    int i,ret;
    
    strcpy(src,"zażółć gęślą jaźń");
    ret=MultiByteToWideChar(CP_ACP,0,src,strlen(src),(LPWSTR)output,60)*2;
    for (i=0;src[i];i++)
        src[i]=0;
    ret=WideCharToMultiByte(CP_UTF8,0,(LPWSTR)output,ret,src,60,NULL,&udc);
    for (i=0;i<ret;i++)
        if (src[i])
            cout << src[i];
        else
            cout << '.';
    getch();
}

Jednak cały czas dostaję WRONG PARAMETER (&& ret==0)

Używaj przycisku "zmień" do edycji postów!

_________________
-----BEGIN GEEK CODE BLOCK-----
Version: 3.1
GCS d- s---:--->+:+ a-->--- C++(+++) U-- P+ L-- E--
W++ N+ o-- K- w++(+++) O--- M-(--) V-- PS PE++ Y
PGP- t 5 X++ R tv- b+ DI- D+++(++++) G++ e h* r+ y?
------END GEEK CODE BLOCK------
Alternatywny komunikator GG
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email Odwiedź stronę autora Numer GG Tlen
Taeril



Dołączył: 20 Cze 2005
Posty: 1163

PostWysłany: Wto Sty 10, 2012 12:58 pm      Temat postu: Odpowiedz z cytatem Pisownia

MultiByteToWideChar -> wchar_t
Tak tylko rzucam hasło nie analizując reszty. Ta konwersja A->B->C to jest char* -> wchar_t* -> char*
Przy konwersji jak dajesz stałe wielkości to wynik (UTF-8) powinien mieć wielkość 4 (czy 6?) razy większą niż wejście a pośrednie wchar_t pod Windows dwa razy niż wejście. Oczywiście mając konkretne kodowanie można zmniejszyć te wartości :)

Jak masz jedno, stałe, ośmiobitowe kodowanie, to może po prostu wygenerować sobie tablicę konwersji i ręcznie zamienić na UTF-8? Generalnie lepiej używać gotowych funkcji ale przecież tu masz specyficzny przypadek.

_________________
T.

"Some people, when confronted with a problem, think 'I know, I'll use regular expressions.' Now they have two problems." - Jamie Zawinski
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
mikmas



Dołączył: 26 Maj 2005
Posty: 5617
Skąd: From Alex Stadt

PostWysłany: Wto Sty 10, 2012 2:28 pm      Temat postu: Odpowiedz z cytatem Pisownia

Czyli w skrócie mówiąc - za małe buforki? Zwiększyłem do 255 i to samo mam
_________________
-----BEGIN GEEK CODE BLOCK-----
Version: 3.1
GCS d- s---:--->+:+ a-->--- C++(+++) U-- P+ L-- E--
W++ N+ o-- K- w++(+++) O--- M-(--) V-- PS PE++ Y
PGP- t 5 X++ R tv- b+ DI- D+++(++++) G++ e h* r+ y?
------END GEEK CODE BLOCK------
Alternatywny komunikator GG
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email Odwiedź stronę autora Numer GG Tlen
hejmus



Dołączył: 26 Maj 2005
Posty: 2135

PostWysłany: Wto Sty 10, 2012 2:49 pm      Temat postu: Odpowiedz z cytatem Pisownia

A MSDNa czytałeś? :)
Cytat:
lpUsedDefaultChar [out]
(,,,)
For the CP_UTF7 and CP_UTF8 settings for CodePage, this parameter must be set to NULL. Otherwise, the function fails with ERROR_INVALID_PARAMETER.
Kod:
strcpy(src,"zażółć gęślą jaźń");
ret=MultiByteToWideChar(CP_ACP,0,src,-1,buf,sizeof(buf));
cnt=WideCharToMultiByte(CP_UTF8,0,buf,-1,NULL,0,NULL,NULL);
ret=WideCharToMultiByte(CP_UTF8,0,buf,-1,src,cnt,NULL,NULL);

-1 jako długość źródła wystarcza, jeśli string jest null-terminated, środkowe wywołanie zwraca rozmiar potrzebnego bufora, żeby można było sobie zaalokować przed właściwą konwersją.

_________________
kompilacja Gentoo na Pentium MMX 233MHz - niezapomniane przeżycia ;)
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email
Taeril



Dołączył: 20 Cze 2005
Posty: 1163

PostWysłany: Sro Sty 11, 2012 1:22 pm      Temat postu: Odpowiedz z cytatem Pisownia

W podanym kodzie output jest złego typu - powinien być wchar_t.
Tekst po konwersji może być dłuższy niż w ośmiobitowym kodowaniu. W sumie nie jestem pewien jak będzie z wchar_t pod Windows ale tworząc statyczne bufory lepiej przewidzieć najgorszą sytuację. Albo właśnie najpierw sprawdzić ile będzie potrzeba i dynamicznie alokować pamięć.

_________________
T.

"Some people, when confronted with a problem, think 'I know, I'll use regular expressions.' Now they have two problems." - Jamie Zawinski
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
hejmus



Dołączył: 26 Maj 2005
Posty: 2135

PostWysłany: Sro Sty 11, 2012 4:34 pm      Temat postu: Odpowiedz z cytatem Pisownia

A to akurat mój błąd przy przeklejaniu kodu, zapomniałem że pozmieniałem zmienne :)
Kod:
    CHAR src[60];
    WCHAR buf[60];
    int cnt,ret;

_________________
kompilacja Gentoo na Pentium MMX 233MHz - niezapomniane przeżycia ;)
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email
Wyświetl posty z ostatnich:   
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Biblioteki Wszystkie czasy w strefie CET (Europa)
Idź do strony 1, 2  Następny
Strona 1 z 2

 
Skocz do:  
Możesz pisać nowe tematy
Możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Możesz dodawać załączniki na tym forum
Możesz pobierać pliki z tego forum




Debug: strone wygenerowano w 0.09032 sekund, zapytan = 7
contact

| Darmowe programy i porady Jelcyna | VB4all | Tansze zakupy w Helionie |