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
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) |