Thread [Wx] Wx::STC und Wx::Scintilla: Text-Dateien als UTF-8 speichern und CR/LF (9 answers)
Opened by Jürgen at 2015-08-21 09:31

Gast Jürgen
 2015-08-21 09:31
#181853 #181853
Hallo zusammen,

leider muss ich euch wieder einmal mit einer Frage belästigen:
Hintergrund:
Ich habe ein GUI-Anwendung mit Wx und Wx::XRC.
Ich verwende zur Texeingabe" das Widget Wx::STC (ich kenne auch den Workaround/Einsatz von Wx::Scintilla, da habe ich aber das Gleiche Problem)
Ich möchte Textdateien erstellen, bearbeiten und speichern.
Das Format der Textdatei soll UTF-8 sein, das Zeilenende CR/LF (Windows)
Das Programm läuft unter Windows 7

Das Problem:
Beim Speichern der Datei habe ich immer das Format "CP1252" und nicht "UTF-8".
Des Weiteren wird die Datei immer mit dem Zeilenende "LF"(Unix) abgespeichert.
Woher weiß ich das? Ich öffne die gespeicherte Datei mit dem Texteditor "Geany".

Was habe ich schon versucht:
1. Ich verwende in meinem script (betickler.pl) schon folgende Module:
Code (perl): (dl )
1
2
3
4
use Encode;
use utf8;
binmode STDOUT, ":encoding(cp852)";  # für Umlaute im DOS-Fenster
binmode STDERR, ":encoding(cp852)";

2. Ich benutze die Funktion "LoadFile" von Wx::STC bzw. von Wx::StyledTextCtrl: ($STC wurde wie folgt erstellt: my $STC = new Wx::StyledTextCtrl($frame ); )
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
sub load_recent_page_data{
  my( $STC ) = @_;
  if( -f Win32::GetFullPathName( File::Spec->catfile($recent_nb, $recent_page) ) ){
    my $tmp_path = Win32::GetFullPathName( File::Spec->catfile($recent_nb, $recent_page) );
    $STC->SetCodePage(65001);
    $STC->LoadFile( $tmp_path );
    $STC->SetCurrentPos( $STC->GetTextLength());
    $STC->SetSelection( $STC->GetTextLength(), $STC->GetTextLength());
  }
  else{
    INFO "default page exists not...";
  }
}

Mit "SetCodePage(65001)" kann ich, so weit ich mich durch die Doku gewühlt habe, utf-8 einstellen: das 65001 steht wohl für utf-8.
Die Datei wird korrekt geladen.
Wenn ich dann speichern möchte, verwende ich folgendes:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
sub save_STC_values{
  my ( $this ) = @_;
  
  # TODO: check, if the file has changed - if not, do nothing
  
  print "save file...\n";
  my $STC = $this->FindWindow(Wx::XmlResource::GetXRCID('STC_edit'));
  my $tmp_path = Win32::GetFullPathName( File::Spec->catfile($recent_nb, $recent_page) );
        
  my %H_cur_data;
  my $stc_content = $STC->GetText();
  my @A_stc_content = split("\n", $stc_content);
  my @A_new_stc_content;
  my $line_counter = 1;
  
  # TODO: find all data from "this" file in DB and remove them!
    
  foreach my $cur_line( @A_stc_content ){
    my $sorted_line = BT_Parse_Line::parse_line( $cur_line, \%H_cur_data, $H_cfgs );
    if( $sorted_line){
      push( @A_new_stc_content, $sorted_line );
      
      DB_WorkOn::check_linedata( \%H_cur_data, $line_counter, $tmp_path );
      DB_WorkOn::insert_linedata( \%H_cur_data, $line_counter, $tmp_path );
    }
    else{
      push( @A_new_stc_content, "");
    }
    $line_counter++;
  }
  $STC->SetText('');
  $STC->SetText(join("\n", @A_new_stc_content)."\n");

  print $STC->GetCodePage()."\n";
  $STC->SaveFile( $tmp_path );
  get_classifications_from_db();
}

Ich lasse mit mit "GetCodePage()" noch ausgeben, was eingestellt ist: Da wird 65001 (=utf-8) ausgegeben.

Trotzdem: wenn ich die Datei dann mit dem Editor öffne, habe ich wieder CP1252...

Für das Zeilenende gilt genau das Gleiche - ich kriegs nicht hin das einzustellen...

Kann mir hier bitte jemand helfen, ich weiß nicht was ich falsch mache :(

Danke und Grüße
Jürgen

P.S.: Wie kann ich denn als "Gast" Themen, die gelöst sind, als solche markieren?
Last edited: 2015-08-21 09:52:56 +0200 (CEST)

View full thread [Wx] Wx::STC und Wx::Scintilla: Text-Dateien als UTF-8 speichern und CR/LF