Delphi źle odczytuje wyrazy z polskimi literami

0

Witam.

Po przeczytaniu art: Eof

Zrobiłem sobie taki program, który przepisuje słowo z jednego pliku do drugiego, tylko wtedy, gdy ten ma odpowiednią ilość liter:

   AssignFile(F1, 'slowa.txt');

  try
    Reset(F1);
    AssignFile(F2, 'slowa2.txt');

    try
      ReWrite(F2);
      while not Eof(F1) do
      begin
        Readln(F1, Line);
        if Length(line)=5 then Writeln(F2, Line);
      end;
    finally
      CloseFile(F2);
    end;
  finally
    CloseFile(F1);
  end;

Problem jest taki, że jeżeli w pliku źródłowym występuje np słowo masło, to nie przepisze teraz tego słowa do nowego pliku.
Jak dam dwa razy ten kod -> Z Odczytuje z pliku źródłowego, jak ma 5 liter, to zapisuje do słowa2.txt, a jak ma 6 liter, to do słowa3.txt, to wyraz "masło" znajdować się będzie w pliku z wyrazami mającymi 6 liter.

Proszę o pomoc.

1

Bo ten plik masz kodowany w UTF-8, a nie w ANSI, dzięki czemu literka ł (i wszystkie pozostałe polskie znaki diakrytyzowane) zajmuje dwa bajty, a nie jeden. Jeśli chcesz policzyć faktyczną liczbę liter to skorzystaj z funkcji przeznaczonej dla ciągów kodowanych w UTF-8.

To nie Delphi źle odczytuje – to Twój kod jest nieprawidłowy. ;)

0

Ok, rozumiem koncepcję, ale to wtedy czego użyć zamiast length() ? Szukam w google czegoś co by działało z UTF-8, ale wszędzie wciskają to nieszczęsne length().

0

Której wersji Delphi używasz?

0

Delphi 7 - system mam Win 7 64bit (ale to chyba nie będzie robić różnicy)

0

To masz bardzo stare narzędzie. Delphi dopiero od wersji 2009 wspiera Unicode.
Przyjrzyj się darmowemu Lazarusowi

0

robi i to ogromną Delphi7 jako takie nie obsługuje UTF8 - ściągnij sobie flazarusa i w nim działaj bo D7 ma ponad 15 lat

0
Huherko napisał(a):

Delphi 7 - system mam Win 7 64bit (ale to chyba nie będzie robić różnicy)

Skoro o to pytam, to robi różnicę – i to ogromną.

Delphi 7 – pisząc zgrubsza – obsługuje ASCII i ANSI w postaci łańcuchów AnsiString oraz Unicode w postaci ciągów WideString. UTF-8 nie jest obsługiwany, bo o ile reprezentowany może być jako AnsiString, to w swojej bibliotece standardowej nie posiada funkcji przeznaczonych dla wymaganego kodowania.

Lazarus natywnie wykorzystuje kodowanie UTF-8 i posiada stosowne funkcje do ich obsługi. Do pozyskania liczby znaków służy funkcja UTF8Length, a do objętości w bajtach zwykła Length (lub jako metoda o tej samej nazwie).

0

nie wiem jak jak jest w Lazarusie (Free Pascal), ale Delphi od wersji 2009 rozróżnia dwa typy stringów. Jest typ string obsługujący Unicode (i wielobajtowe kodowanie znaków) i ansistring obsługujący jednobajtowe kodowanie (ANSI)

0

W Delphi 7 typ String był równoznaczny z AnsiString i składał się z jednobajtowych komórek, a WideString z dwubajtowych. We Free Pascalu jest tak samo – typ String też jest równoznaczny z AnsiString (jeśli o domyślne ustawienia chodzi), istnieją też inne – WideString, UnicodeString, Utf8String itd.

To co umożliwia podstawowy typ String w zupełności wystarczy do zrealizowania tego zadania (w Lazarusie).

0

z tym kodowaniem to jest niezły miszmasz, nowe aplikacje i narzędzia programistyczne radzą sobie z tym bez problemu (Unicode, UTF.... ) i nie ma problemu ... Ale parę dni temu musiałem zaimportować do bazy dane zapisane z kodowaniem Mazovii (baza danych dosowej aplikacji FPP). Cczy ktoś jeszcze pamięta co to takiego Mazovia ? :)

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