• ベストアンサー

欧文 iso-8859-1 と 日本語 euc-jp の混在するウェブページ

 フランス語圏の人と日本人が、お互いの文化や語学について話し合うフォーラム形式の掲示板をPerlで制作したいのですが、フランス語には英語にないアクセント付のアルファベットがあり、一つのログファイルに二つの文字コードが混在すると一方が化けてしまいとても不便です。  Unicodeを使えば解決するのでしょうが、具体的にどうすれば良いのかわかりません。 jcode.plのように簡単に文字コードを変換してくれるモジュールでもあるのでしょうか。 それとも全く違う方法で解決できるのでしょうか。  初心者なので、なるべくわかりやすく説明していただければ幸いです。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • proust
  • ベストアンサー率57% (62/108)
回答No.2

惜しいのですがログファイルの保存形式が違います。 ログファイルもスクリプトなどと形式をあわせる、 つまりutf-8にする必要があります。 いい加減なスクリプトを書いて試したところ、 WindowsXP + IE6/Opera7の環境では、正しく入力・表示できています。 以下に載せます。 #!/usr/bin/perl #テスト用に作成したもので、セキュリティ対策や #ロックなどの通常欠くべからざる処理をはしょって #います。このまま使用しないでください sub mourir { my ($erreur) = @_; print "Content-type: text/plain\r\n\r\n"; print "error $erreur"; exit 0; } sub decoder { my ($enigme) = @_; $enigme =~ s/%([0-9a-fA-F].)/{chr(hex('0x'.$1))}/ge; return $enigme; } sub laver { my ($morceau) = @_; $morceau =~ s/\&/\&amp;/g; $morceau =~ s/\</\&lt;/g; return $morceau; } $fichier = "/tmp/logfile.txt"; print <<FDP; Content-type: text/html;charset=utf-8\r \r <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> </head> <body> <form action="/cgi-bin/a.cgi" method="POST"> N'h&eacute;sitez pas de nous &eacute;crire par ici: <BR> <textarea name="texte"></textarea> <input type="submit" name="bouton" value="cliquer"> </form> FDP unless (defined($ENV{'CONTENT_LENGTH'})) { print "</body></html>"; exit 0; } $longueur = $ENV{'CONTENT_LENGTH'}; open dfo, ">>$fichier" || mourir $!.':1:'.__LINE__; print dfo "<hr><pre>\n"; while ( 0 < ($resultat = read(STDIN, $morceau, $longueur))) { print dfo $morceau; $longueur -= $resultat; last unless $longueur; } print dfo "\n</pre>\n"; close dfo || mourir $!.':3:'; print "Et voici..."; open dfi, $fichier || mourir $!.':4:'; while( <dfi>) { print decoder($_); } close dfi || mourir $!.':5:'; print <<FDC; </body> </html> FDC

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • proust
  • ベストアンサー率57% (62/108)
回答No.1

ログの表示等で1画面に日仏両言語を混在させるなら、 たぶん「UTF-8」を使用するのがいいかなと思います。 今手元に環境がないので試していませんが、 表示するページの「レスポンスヘッダ」に Content-type: text/html; charset=utf-8 をつけ、なおかつHEADエレメント内に <meta http-equiv="content-type" content="text/html; charset=utf-8"> を書けば、utf-8の内容でform入出力できそうです。 ログファイルには、formから入力されたままの 形式で保存しておけばよいと思います。 ただし、cgi/htmlの漢字はutf-8対応のエディタで 書いておく必要があります。

参考URL:
http://euc.jp/i18n/charcode.ja.html
pouta
質問者

お礼

ご丁寧な回答ありがとうございます。 さて、私はこれを、 cgiのヘッダー → Content-type: text/html; charset=utf-8 出力されるHTMLのHEADエレメント内 → <meta http-equiv="content-type" content="text/html; charset=utf-8"> スクリプトの記述・保存フォーマット → UTF-8 (私の使用しているエディターでは、Unicode(UTF-8)と表示されます。) ログファイル → iso-8859-1 と euc-jp の混合 と理解して試してみたのですが、両方とも文字化けしてしまいました。 ブラウザのエンコード設定を変えれば、どちらか片方は正常に見ることができます。 間違っているようでしたら、ご指摘していただけますか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • CGI(perl)での一部日本語の文字化けについて

    perlでCGIを作成しています。jcode.plを使っているのですが、 表示される日本の一部だけが文字化けしてしまいます。 何が原因なのでしょうか。 解決方法について教えてください。 ◆perl文中の記述 ”登録申請を行ってください。”  ↓ ◆ブラウザ上の出力結果 ”登録瑞ソを行ってください。” 参考:jcode.pl,v 2.6 1997/12/24 17:01:11

    • ベストアンサー
    • Perl
  • 検索サイトとエンコード

    人から頼まれてフランス語と日本語が混在する。ホームページを作りました。 フランス語のアクセントの都合上unicode(utf-8)で、 保存しサーバーにのせました。 ロボット型の検索サイトに数件登録したのですが、 unicodeでもきちんと読み取って検索サイトに乗るのでしょうか。 それともjisコードでないと日本語の場合は読み取れないとかあるのでしょうか。 どなたかご教授ください。

  • 日本語と韓国語の混在入力と文字化けについて

    ホームページ上の掲示板で、韓国語を入力したとき、 Windows98SE IE6.0 エンコードがShift-JISでは韓国語入力ができ Windows2000 IE6.0 エンコードがShift-JISでは書き込んだときは 韓国語がの日本語EUCコードの文字に化けしてしまいます。 この掲示板はUNICODEでないため、韓国語が入力できること自体 不思議なのですが、どうしたら、文字化けせず韓国語と日本語の 混在が可能でしょうか?

  • UTF-8 -> CP1251にエンコードするには?

    Perlの勉強しながらTeraPadを使って簡単なCGIをつくっている初心者です。 メインはUTF-8(多言語混在なので)で書いていて、sendmailを使ってCP1251形式(メールは全文キリル語)のメール送信したいのですが、エンコードはどのようにすればいいのでしょうか?タイトルも本文も文字化けしてしまって全く読めません(;_;) 日本語ならjcode.pl等を使って &jcode'convert(*title, "jis") のようにすればいいのでしょうがキリル語(CP1251かKOI8=R)の変換モジュールを探しても全く見つかりませんし、糸口さえ分かりません。どなたか詳しい方助けてください!ホントに困っています(T_T よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • フランス語と日本語の混在するページを作成したい。

    フランス語の特殊文字やアクセント記号を、日本語と一緒に表示したいのですが、<meta>タグでcharset指定はどうすればよいのでしょうか? charset指定「Shift_JIS」のままでも「ç」とHTMLに書けば、IE5.1では表示されますが、古いNC4.7では「?」になってしまうもので。。※両方Macです。 NN7でも表示されるので、化けてしまうのはブラウザが古いからなのでしょうか? それともcharset指定が間違ってますか?

  • 正規表現で全角スペースと誤認

    OS:solaris8 perlのver:5.8.6 perlで、”食器洗い乾燥機|0”という文字列に対し、 空白文字(半角スペース、タブ、改行、全角スペース) が含まれているかを検査しているのですが、 空白文字有りとなってしまいます。 恐らく文字コードの問題だと思うのですが、 詳しくないため、解決方法が分からないでいます。 どのようにしたら解決できるでしょうか? require "jcode.pl"; としているので、jcodeのモジュールで 解決できないでしょうか? 文字コードはEUCです。 以下はソースです。 # 空白文字(半角スペース、タブ、改行、全角スペース)が #入力されていないかチェック $data = "食器洗い乾燥機|0"; if ($data =~ /\s|(?:\xA1\xA1)/) { #含まれている場合 } よろしくお願いします。

    • ベストアンサー
    • Perl
  • 日本語入力

    普通の日本語入力のパソコン使っているのですが、フランス語、ドイツ、チェコ語その他アルファベット言語などの A E Cなどの上や下にセディーユ、ウムラウト、その他アクサン記号が入った 文字を入力 または文字化けせず見れる手法はありませんでしょうか?もちろんソフトを買ったりせず、無料でです。詳しいかた御願いします。

  • Encodeモジュールで日本語化したい

    今まで全てのPerlをjcode.plを使って日本語化してきました。 長年根本の構造をきちんと理解せず、jcode.plは呪文のように最初に宣言して使用してきたため、現在文字化け対策をするため、今回Encodeモジュールを使って日本語変換を行うための方法が分からず困っています。 formから送信されてきたものを変換するため、 foreach $pair(@pairs) { ($name,$value) = split(/=/,$pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; $name =~ tr/+/ /; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; &jcode'convert(*name,'sjis'); &jcode'convert(*value,'sjis'); $in{$name} = $value;#ここは状況に応じて変えてます } として最初に一括して変換してやり、 ウェブ上で表示させるときは <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> を指定してそのまま表示、 メールなどでは &jis("Subject: $sub"); print AAA "$msg\n"; sub jis { $msg = $_[0]; &jcode'convert(*msg, 'jis'); } などとして出力してきました。 これらをEncodeモジュールを使って書き換えたいのですが、参考に http://digit.que.ne.jp/work/wiki.cgi?Perl%E3%83%A1%E3%83%A2%2F%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%81%AE%E6%89%B1%E3%81%84 このページを読んだのですが、perlの根本が理解できていないので、どこをどうしていいのか分かりません。 上のような形式をEncodeモジュールを使って書き換えるとすればどのようにすればいいのでしょうか。 (どう聞けばいいかも分からないので、うまく伝えられたか不安ですが)

    • ベストアンサー
    • Perl
  • Encode.pmで文字コードの判別

    文字コードの変換に以前はjcode.plを利用していたのですが、Perl5.8をインストールしたのでEncode.pmでこれを行おうと思っています。 変換にはfrom_toを利用しようと思っているのですが、肝心の文字コードの判別方法が分かりません。 jcode.plでいうところのgetcodeに当たる機能は、用意されているのでしょうか? ご存知の方おられましたら、よろしくお願いします。

    • ベストアンサー
    • Perl
  • Pythonで非日本語のUnicode文字が使えない

    日本Pythonユーザ会が配布している、Windows用のPython2.6.1を使用していますが、 日本語以外のUnicode文字、アクセントのあるフランス語やウムラウトのあるドイツ語を 「Unicode文字として」扱うと、強制終了してしまいます。 たとえば UTF-8 で保存した test.py   # encoding: utf-8   txt = u"日本語、にほんご、Japanese"   print txt   raw_input() は正しく実行・表示できますが、   # encoding: utf-8   txt = u"Français"   print txt   raw_input() とすると実行しても強制終了されてしまいます。 "u" を外すと "Franテァais" と表示してくれますが…。 どうすればフランス語の文字などを扱えるのでしょうか? Python初心者(1ヶ月程度)ですので、時間があれば、詳しく具体的に教えていただけると助かります。