0

ソフトウェアはUTF-8ファイルを生成していますが、ユニコードではないファイルにコンテンツを書き込んでいます。そのソフトウェアを変更することはできず、現在のように出力を取得する必要があります。これがここに正しく表示されるかどうかはわかりませんが、ドイツ語のウムラウト「ä」はファイルに「ä​​」として表示されます。

Notepad ++でファイルを開くと、ファイルがUTF-8(BOMなし)でエンコードされていることがわかります。ここで、メモ帳で「ANSIに変換」と言ってから、ファイルのエンコードをUTF-8に戻すと(変換せずに)、ファイル内のドイツ語のウムラウトは正しいです。Perlでまったく同じ動作を実現するにはどうすればよいですか?今まで何を試しても、ウムラウトの混乱はさらに悪化しました。

複製するには、UTF-8でエンコードされたファイルを自分で作成し、それにコンテンツを書き込みます。

はい、やってみます。自分でUTF-8ファイルを作成し、これを書き込みます:MännerSchüleVöogelSüÃ

次に、UTF-8 mysqlデータベースで、varcharフィールドを使用してUTF8_unicodeエンコーディングのテーブルを作成します。ここで、次のスクリプトを使用します。

use utf8;
use DBI;
use Encode;
if (open FILE, "test.csv") {
  my $db = DBI->connect(
    'DBI:mysql:your_db;host=127.0.0.1;mysql_compression=1', 'root', 'Yourpass',
    { PrintError => 1 }
  );
  my $sql="";
  my $sql = qq{SET NAMES 'utf8';};
  $db->do($sql);
  while (my $line = <FILE>) {
    my $sth = $db->prepare("INSERT IGNORE INTO testtable (testline) VALUES (?);");
    $sth->execute($line);
  }
}

ファイルの正確な内容がデータベースに書き込まれます。しかし、私がデータベースに期待する出力は、ドイツ語のウムラウトです。

MännerSchülerVögelSüß

では、どうすればそれを正しく変換できますか?

4

2 に答える 2

3

皮肉なことに、私が見ているように、あなたが話しているソフトウェアは「非ユニコードコンテンツ」(それはナンセンスです)を書いていません-それはUTF-8を2回エンコードします。この文字を例にとってみましょうä。UTF-8では2バイトで表されます%C3 %A4。しかし、そのプログラムの何かが、代わりにこれらのバイトをLatin-1エンコーディングとして扱うことを決定します。したがって、これらは2つの別々の文字になります(最終的にUTF-8にエンコードされ、それがファイルに保存されます)。

これを元に戻す最も簡単な方法は、ファイルから読み取られた文字列を処理するときに、Perlに一連のバイト(文字のシーケンスではなく)を使用していると思わせることだと思います。それは同じくらい簡単に(そして醜く)行うことができます...

open my $fh, '<:utf8', $file_name or die $!;
my $string = <$fh>;              # a sequence of characters            
$string = utf8::decode($string); # ... will be considered a sequence of octets
于 2012-07-06T12:42:42.033 に答える
1

ISO 8859-15のようなものであると想定し、それをUTF-8に変換していると仮定して、何かが2回目に変換しているように聞こえます。これを元に戻すには、UTF-8をISO 8859-15(またはデータにとって意味があると思われるエンコーディング)に変換します。

http://www.fileformat.info/info/unicode/char/E4/index.htmに見られるように、バイト0xC30xA4はの有効なUTF-8エンコーディングですä。ISO 8859-15(または8859-1、Windows-1252、または他の多くの8ビットエンコーディング)として表示すると、文字列が表示されますä

于 2012-07-06T12:35:24.837 に答える