1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
use strict;
use warnings;
use Tk;
use DBD::SQLite;
my $mw = new MainWindow;
my $types = [ ['Text', '.db'], ['All Files', '*'],];
my $file= $mw->getOpenFile(-filetypes => $types);
my $lco;
#connecting to sqlite
my $dbh = DBI->connect("dbi:SQLite:$file", "", "", { RaiseError => 1, AutoCommit => 1, PrintError => 0 });
my $all = $dbh->selectall_arrayref("SELECT language FROM metadata");
foreach my $row_db (my @all) {
($lco) = @$row_db;
}
print "Connected: $lco\n";
1 2 3 4
use Data::Dumper; $Data::Dumper::Useqq=1; my ($file)=glob('C:/Users/FC/Desktop/*/DATABASE.de'); print Dumper($file);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
use strict;
use warnings;
use UTF8;
use Tk;
use DBD::SQLite;
use Data::Dumper;
$Data::Dumper::Useqq=1;
my $mw = new MainWindow;
my $types = [ ['Text', '.db'], ['All Files', '*'],];
my $file_1= $mw->getOpenFile(-filetypes => $types);
my ($file_2)=glob('C:/Users/FC/Desktop/*/DATABASE.db');
print Dumper($file_1);
print Dumper($file_2);
#connecting to sqlite
my $dbh = DBI->connect("dbi:SQLite:$file_2", "", "", { RaiseError => 1, AutoCommit => 1, PrintError => 0 });
Quote$VAR1 = "C:/Users/FC/Desktop/\x{fc}folder/DATABASE.db";
$VAR1 = "C:/Users/FC/Desktop/\374folder/DATABASE.db";
2013-11-01T22:22:08 topegDas ist eine "CP-1252" (oder "ISO-8859-15") Kodierung wahrscheinlich ein "ü". Bist du dir sicher das der Ordnername UTF-8 kodiert ist?
Aber mach mal:
1 2 3 4
$initfile = $mw->getOpenFile; return unless $initfile; $initfile = encode('iso-8859-1', $initfile); open( my $SUDO, '<', $initfile ) or die("can't open $initfile: $!");
1
2
3
4
5
6
encode decode
------ ------
CP-1252 => uv => uv
iso-8859-15 => uv => uv
iso-8859-1 => uv => uv
UTF-8 => \x{c3}\x{a4} => \x{fffd} (wide char in say)
2013-11-03T17:33:28 GUIfreundDa ich bisher kaum Erfahrungen mit Umkodieren habe (unter XP war ich mit meinem DOS-Fenster recht zufrieden), weiß ich jetzt nicht, was ich noch Sinnvolles probieren könnte. Hoffentlich kann mir jemand einen Tipp geben.
2013-11-03T17:43:25 bianca2013-11-03T17:33:28 GUIfreundDa ich bisher kaum Erfahrungen mit Umkodieren habe (unter XP war ich mit meinem DOS-Fenster recht zufrieden), weiß ich jetzt nicht, was ich noch Sinnvolles probieren könnte. Hoffentlich kann mir jemand einen Tipp geben.
Ging mir früher auch so. Bis ich Text::Iconv hier empfohlen bekam. Damit löse ich seit dem sämtliche Kodierungsprobleme mit Windows. Kann ich sehr empfehlen!
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 38 39 40 41 42
use strict; use warnings; use feature qw( say ); use Tk; use Data::Dumper; use Encode; use Encode qw(is_utf8); my $mw; # main window $mw = MainWindow->new(); $mw->bind( '<Visibility>' => sub {openfile()} ); MainLoop(); exit; sub openfile{ my $initfile = $mw->getOpenFile; return unless $initfile; say "initfile $initfile"; say 'Dumper: ', Dumper($initfile); my $isutf8 = is_utf8($initfile); say "utf8 flag of initfile is ", $isutf8 ? 'on' : 'off'; if ($isutf8) { say ' contains well-formed UTF-8: ', is_utf8($initfile, 1) ? 'ja' : 'nein'; } $initfile = encode('iso-8859-1', $initfile, Encode::FB_CROAK); say "initfile $initfile"; say 'Dumper: ', Dumper($initfile); $isutf8 = is_utf8($initfile); say "utf8 flag of initfile is ", $isutf8 ? 'on' : 'off'; if ($isutf8) { say ' contains well-formed UTF-8: ', is_utf8($initfile, 1) ? 'ja' : 'nein'; } open( my $SUDO, '<', $initfile ) or die("can't open $initfile: $!"); say "opened $initfile"; my @game = <$SUDO>; say "game\n", @game; close($SUDO); return; }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
initfile U:/Benutzer/Klaus/Perl/Sudoku-Trainer/Rätsel/Aufg/Aufg54a.txt
Dumper: $VAR1 = "U:/Benutzer/Klaus/Perl/Sudoku-Trainer/R\x{e4}tsel/Aufg/Aufg54a.txt";
utf8 flag of initfile is on
contains well-formed UTF-8: ja
initfile U:/Benutzer/Klaus/Perl/Sudoku-Trainer/Rätsel/Aufg/Aufg54a.txt
Dumper: $VAR1 = 'U:/Benutzer/Klaus/Perl/Sudoku-Trainer/Rätsel/Aufg/Aufg54a.txt';
utf8 flag of initfile is off
opened U:/Benutzer/Klaus/Perl/Sudoku-Trainer/Rätsel/Aufg/Aufg54a.txt
game
-2- --- ---
4-- --- 836
--- -5- --7
7-5 --- ---
--2 --- -4-
8-- -9- 2-1
--3 7-2 ---
--1 -69 ---
--- 3-- 4-9
1
2
3
4
5
6
7
8
initfile U:/Benutzer/Klaus/Perl/Sudoku-Trainer/Rätsel/Aufg/Aufg54a.txt
Dumper: $VAR1 = "U:/Benutzer/Klaus/Perl/Sudoku-Trainer/R\x{e4}tsel/Aufg/Aufg54a.txt";
utf8 flag of initfile is on
contains well-formed UTF-8: ja
eval_err: can't open U:/Benutzer/Klaus/Perl/Sudoku-Trainer/Rätsel
/Aufg/Aufg54a.txt: No such file or directory at U:/Benutzer/Klaus
/Perl/Sudoku-Trainer/Devel/Trainer/GUI.pm line 395.
2013-11-05T16:07:08 biancaIch kann nicht erkennen, ob du jetzt Text::Iconv probiert hast oder nicht.
1 2
my $converter = Text::Iconv->new('UTF-8', 'iso-8859-1'); my $converted = $converter->convert($initfile);
$initfile = encode('iso-8859-1', $initfile);
2013-11-06T11:52:30 GUIfreundKennst du einen zuverlässigen Weg, wie ich die Kodierung eines vorhandenen Strings feststellen kann?
2013-11-06T11:52:30 GUIfreundEncode::Guess sagte mir "Encode::utf8", was mich auf die falsche Fährte 'utf8' brachte.
2013-11-06T12:20:06 pq2013-11-06T11:52:30 GUIfreundEncode::Guess sagte mir "Encode::utf8", was mich auf die falsche Fährte 'utf8' brachte.
Doku lesen ;-)
guess_encoding() gibt ein objekt zurück (falls ein encoding gefunden werden konnte). mit $enc->name erhältst du den namen der kodierung. dekodieren könntest du dann z.b. direkt mit $enc->decode($data)
1 2 3 4 5 6
my $decoder = Encode::Guess->guess($initfile); die $decoder unless ref($decoder); say "Encoding ", $decoder->name; # => Encoding utf8 ...... my $converter = Text::Iconv->new("utf8", 'iso-8859-1'); # => Unsupported conversion
QuoteCAVEATS
Perl does not have a concept of encoded filesystems yet. This means that operations on filenames like "opendir" and "open" still use byte semantics. Tk however uses character semantics internally, which means that you can get filenames with the UTF-8 flag set in functions like "chooseDirectory", "getOpenFile" and similar. It's the user's responsibility to determine the encoding of the underlying filesystem and convert the result into bytes, e.g.
Code (perl): (dl )1 2 3 4 5use Encode; ... my $dir = $mw->chooseDirectory; $dir = encode("windows-1252", $dir); opendir DIR, $dir or die $!;
2013-11-05T19:27:13 RaubtierNach deiner letzten Nachricht bin ich jetzt aber etwas ratlos, ob du das Problem noch hast oder ob alles geht.
2013-11-05T19:27:13 RaubtierIch habe mal eben in der Doku nachgeschaut. Da steht:
QuoteCAVEATS
Perl does not have a concept of encoded filesystems yet. This means that operations on filenames like "opendir" and "open" still use byte semantics. Tk however uses character semantics internally, which means that you can get filenames with the UTF-8 flag set in functions like "chooseDirectory", "getOpenFile" and similar.
2013-11-05T19:27:13 RaubtierQuoteEs ist also normal, dass man konvertieren muss.It's the user's responsibility to determine the encoding of the underlying filesystem and convert the result into bytes, e.g.
Code (perl): (dl )1 2 3 4 5use Encode; ... my $dir = $mw->chooseDirectory; $dir = encode("windows-1252", $dir); opendir DIR, $dir or die $!;
2013-11-05T19:27:13 RaubtierNach deiner letzten Nachricht bin ich jetzt aber etwas ratlos, ob du das Problem noch hast oder ob alles geht.
2013-11-06T12:48:41 GUIfreund2013-11-05T19:27:13 RaubtierQuoteEs ist also normal, dass man konvertieren muss.It's the user's responsibility to determine the encoding of the underlying filesystem and convert the result into bytes, e.g.
Code (perl): (dl )1 2 3 4 5use Encode; ... my $dir = $mw->chooseDirectory; $dir = encode("windows-1252", $dir); opendir DIR, $dir or die $!;
Interpretierst du das so, dass man für Windows anders kodieren muss als für Linux? Für NTFS anders als für FAT, für ext3 anders als für ext2? Das kann ich nicht glauben. Mein XP-Programm lief jedenfalls auch auf Linux. Zugegeben, damals hatte ich das Problem mit den Umlauten noch nicht bemerkt und daher kein encode eingebaut.
Guest WelleWenn du aber statt eine TXT-Datei eine SQLite-Datenbank verbinden willst (mit dem Modul DBD::SQLite), dann scheitert es mit einer Fehlermeldung "unable to open database file". Ich vermute, dass das Problem bei dem Modul DBD::SQLite liegt. Könnte das sein?
open( my $SUDO, '<', $initfile ) or die("can't open $initfile: $!");
Quotecan't open U:/Benutzer/Klaus/Perl/Sudoku-Trainer/Rätsel/Aufg/Aufg54a.txt: No such file or directory at ...
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
38
39
40
41
42
43
44
45
46
use strict;
use warnings;
use feature qw( say );
use Tk;
use Data::Dumper;
use Encode;
use Encode qw(is_utf8);
use DBD::SQLite;
my $mw; # main window
$mw = MainWindow->new();
$mw->bind( '<Visibility>' => sub {openfile()} );
MainLoop();
exit;
sub openfile{
my $initfile = $mw->getOpenFile;
return unless $initfile;
say "initfile $initfile";
say 'Dumper: ', Dumper($initfile);
my $isutf8 = is_utf8($initfile);
say "utf8 flag of initfile is ", $isutf8 ? 'on' : 'off';
if ($isutf8) {
say ' contains well-formed UTF-8: ', is_utf8($initfile, 1) ? 'ja' : 'nein';
}
$initfile = encode('iso-8859-1', $initfile, Encode::FB_CROAK);
say "initfile $initfile";
say 'Dumper: ', Dumper($initfile);
$isutf8 = is_utf8($initfile);
say "utf8 flag of initfile is ", $isutf8 ? 'on' : 'off';
if ($isutf8) {
say ' contains well-formed UTF-8: ', is_utf8($initfile, 1) ? 'ja' : 'nein';
}
#connecting to sqlite
#my $dbh = DBI->connect("dbi:SQLite:$initfile", "", "", { RaiseError => 1, AutoCommit => 1, PrintError => 0 });
#opening txt file
open( my $SUDO, '<', $initfile ) or die("can't open $initfile: $!");
say "opened $initfile";
my @game = <$SUDO>;
say "game\n", @game;
close($SUDO);
return;
}
1 2 3 4
use Text::Iconv; ......... my $converter = Text::Iconv->new('UTF-8', 'iso-8859-1'); $initfile = $converter->convert($initfile);
2013-11-07T18:28:31 GUIfreundCode (perl): (dl )1 2 3 4use Text::Iconv; ......... my $converter = Text::Iconv->new('UTF-8', 'iso-8859-1'); $initfile = $converter->convert($initfile);
2013-11-09T21:56:45 Raubtier2013-11-07T18:28:31 GUIfreundCode (perl): (dl )1 2 3 4use Text::Iconv; ......... my $converter = Text::Iconv->new('UTF-8', 'iso-8859-1'); $initfile = $converter->convert($initfile);
Wie kommst du eigentlich auf iso-8859-1? Was ist, wenn dein Dateiname das Euro-Zeichen enthält? Ich würde mal stark vermuten, dass Windows-1252 die richtige Wahl wäre. Wobei ich es schon irgendwie komisch finde, dass du iconv bemühen musst und es nicht mit Encode funktioniert.