 |
Coders' city Nasza pasja to programowanie!
|
| Zobacz poprzedni temat :: Zobacz następny temat |
| Autor |
Wiadomość |
mikmas

Dołączył: 26 Maj 2005 Posty: 5617 Skąd: From Alex Stadt
|
Wysłany: Wto Sty 10, 2012 10:26 am Temat postu: [WinAPI] win1259 <-> UTF8 |
|
|
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 |
|
 |
|
|
marcin_an Site Admin
Dołączył: 26 Maj 2005 Posty: 17278 Skąd: z drugiej strony Kabla
|
Wysłany: Wto Sty 10, 2012 10:40 am Temat postu: |
|
|
UTF-8 pod Windowsem? Zostałeś masochistą? ;)
- Użyj MultiByteToWideChar do konwersji z win-1259 na UCS-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 |
|
 |
mikmas

Dołączył: 26 Maj 2005 Posty: 5617 Skąd: From Alex Stadt
|
Wysłany: Wto Sty 10, 2012 11:54 am Temat postu: |
|
|
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 |
|
 |
marcin_an Site Admin
Dołączył: 26 Maj 2005 Posty: 17278 Skąd: z drugiej strony Kabla
|
Wysłany: Wto Sty 10, 2012 11:58 am Temat postu: |
|
|
| 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 |
|
 |
mikmas

Dołączył: 26 Maj 2005 Posty: 5617 Skąd: From Alex Stadt
|
Wysłany: Wto Sty 10, 2012 12:02 pm Temat postu: |
|
|
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 |
|
 |
Taeril
Dołączył: 20 Cze 2005 Posty: 1163
|
Wysłany: Wto Sty 10, 2012 12:58 pm Temat postu: |
|
|
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 |
|
 |
mikmas

Dołączył: 26 Maj 2005 Posty: 5617 Skąd: From Alex Stadt
|
Wysłany: Wto Sty 10, 2012 2:28 pm Temat postu: |
|
|
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 |
|
 |
hejmus
Dołączył: 26 Maj 2005 Posty: 2135
|
Wysłany: Wto Sty 10, 2012 2:49 pm Temat postu: |
|
|
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 |
|
 |
Taeril
Dołączył: 20 Cze 2005 Posty: 1163
|
Wysłany: Sro Sty 11, 2012 1:22 pm Temat postu: |
|
|
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 |
|
 |
hejmus
Dołączył: 26 Maj 2005 Posty: 2135
|
Wysłany: Sro Sty 11, 2012 4:34 pm Temat postu: |
|
|
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 |
|
 |
|
|
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
|