[delphi] UTF8ToAnsi nie działa/działa źle

0

Witam!

Znów muszę się zwrócić do was o pomoc :)
Tym razem sprawa się wiąże z dekodowanie UTF8 do ANSI w moim programie. Używam Delphi 7 Personal.
Najlepiej pokaże na przykładzie ;)

Stworzyłem sobie 3 testowe pliczki które mają nazwy zawierające znaki dialektyczne (Polski, Rosyjski i chyba Chiński ;P).
user image

Owe pliczki kopiuję na kartę SD mojego telefonu.
No i tu zaczyna się problem bo gdy sczytuję pliki z telefonu moim programem te nazwy się wykrzaczają. Jest tak dla tego że dane z telefonu pobieram po przez Pipy, łącząc się z shellem telefonu. Telefon jest z systemem operacyjnym Android, jest to system oparty na Linuxie, a co za tym idzie, zwracane przez niego info do shella jest w UTF8.
Jeżeli sczytam dane bez żadnej konwersji to wygląda to tak:
user image

Natomiast gdy posłużę się funkcją UTF8ToAnsi wygląda to tak :/ :
user image

Co zrobić aby ta konwersja zadziałała poprawnie?

Mój fragment kodu wygląda tak:


  var
    StdOutPipeRead: THandle;
    bResult: Boolean;
    Buffer: array[0..255] of Char;  
    BytesRead: Cardinal;

  // ...

    if WaitForResult then begin
      repeat
        bResult := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil);
        if BytesRead > 0 then begin
          Buffer[BytesRead] := #0;
          // FResult jest po prostu Stringiem
          FResult := FResult + UTF8ToAnsi(Buffer);
        end;
      until not(bResult) or (BytesRead = 0);
    end;

  // ...

Czy mógł by mi ktoś wyjaśnić czemu to nie działa? Może coś robię źle?

Pozdrawiam!

P.S. Jak mi pomożesz to możesz liczyć oczywiście na moją dźwięczność, ale również na dźwięczność tysięcy użytkowników mojej darmowej aplikacji ;)

0
  1. nie „dialektyczne”, tylko diakrytyczne.
  2. diakrytyczne to są kreski i ogonki, znaki chińskie czy rosyjskie to są po prostu inne znaki i nie można ich tak nazywać.
  3. UTF8Decode zdekoduje ci UTF-8 do widestringa.
  4. widestringa trudno prawidłowo wyświetlić w starych Delphi. ale na początek próbuj z MessageBoxW, żeby zobaczyć czy prawidłowe jest kodowanie.
0
Azarien napisał(a)
  1. nie „dialektyczne”, tylko diakrytyczne.
  2. diakrytyczne to są kreski i ogonki, znaki chińskie czy rosyjskie to są po prostu inne znaki i nie można ich tak nazywać.
  3. UTF8Decode zdekoduje ci UTF-8 do widestringa.

Dobra mistrzu, masz rację :)
Ja prosty człowiek jestem ;P

Azarien napisał(a)
  1. widestringa trudno prawidłowo wyświetlić w starych Delphi. ale na początek próbuj z MessageBoxW, żeby zobaczyć czy prawidłowe jest kodowanie.

Fajne to co piszesz, ale Delphi jednak sobie radzi. Ten sam plik wczytany z dysku komputera i z telefonu wygląda inaczej.

user image

To że zamiast chińskich krzaczków widzę znaki zapytania, to z tego co czytałem kwestia tego że mam w systemie inny język. Ale powiedz mi czemu jak ładują te nazwy plików z kompa to są wszystkie ogonki w polskich znakach, a jak z telefonu to już nie?
Prawdopodobnie coś źle robię przy konwersji, ale co?

Pozdrawiam!

0

To że zamiast chińskich krzaczków widzę znaki zapytania, to z tego co czytałem kwestia tego że mam w systemie inny język

Używając unikodowych funkcji do wyświetlania tekstu (a MessageBoxW jest jedną z nich) można wyświetlić krzaczki niezależnie od języka systemu. Delphi starsze niż 2009 nie używają unikodowych funkcji WinAPI do rysowania kontrolek, dlatego widzisz znaki zapytania.
Obejściem problemu dla starszych Delphi jest użycie kontrolek TNT Unicode Controls. Starsze wersje były freeware, poszukaj w necie. Pamiętam że działały mi pod D7.
Jeśli jednak to co widać to jest twoja własna kontrolka, wystarczy ją odpowiednio rysować (np. TextOutW zamiast TextOut)

Prawdopodobnie coś źle robię przy konwersji, ale co?
Prawdopodobnie, ale tak długo jak używasz UTF8ToAnsi, to na chińskie krzaczki nie ma szans. Wszystko ulega obcięciu. Polskie litery powinny jednak pozostać - chyba że masz w systemie ustawiony język inny niż polski.

0
Azarien napisał(a)

Prawdopodobnie, ale tak długo jak używasz UTF8ToAnsi, to na chińskie krzaczki nie ma szans. Wszystko ulega obcięciu. Polskie litery powinny jednak pozostać - chyba że masz w systemie ustawiony język inny niż polski.

Ano mam inny język niż Polski, używam Angielskiego. Czyli jak ten build odpali ktoś kto ma Polską windę to powinno być ok dla niego, tak? Super :)
Czyli może też i chińczykowi zadziała, muszę puścić betę w net, niech userzy wytestują.
Dzięki wielkie, jak coś to się jeszcze odezwę ;)

Pozdrawiam!</quote>

0

Tak, dla niego będzie ok.
A i u ciebie może być ok, jeśli w Regional Settings ustawisz "system locale" na polski. w tej chwili jestem na XP więc ci dokładnie nie podyktuję gdzie to jest pod Vistą lub Win7.
tak czy inaczej w tej chwili działają ci tylko znaki z bieżącej strony kodowej. mogą działać wszystkie, jeśli użyjesz unicode'u przy wyświetlaniu.

0
Azarien napisał(a)

Tak, dla niego będzie ok.
A i u ciebie może być ok, jeśli w Regional Settings ustawisz "system locale" na polski. w tej chwili jestem na XP więc ci dokładnie nie podyktuję gdzie to jest pod Vistą lub Win7.
tak czy inaczej w tej chwili działają ci tylko znaki z bieżącej strony kodowej. mogą działać wszystkie, jeśli użyjesz unicode'u przy wyświetlaniu.

Mam Win7 po angielsku i polską klawiaturę programisty, więc myślałem że to wystarczy żeby wyświetlało polskie znaki. Dzięki za info, znajdę tę opcję w windzie :)

Pozdrawiam!

1 użytkowników online, w tym zalogowanych: 0, gości: 1