• 締切済み

ubuntuのようなutf8マシンでsjisを扱う方法について

perlでwebページを作ってるんですが、ブラウザからサーバーにformで文字が遅れなくて困っています。 1.ブラウザで文字入力 2.perlで取得してsjisに変換。 3.MySQLにその文字列を登録。 ということをしようと思っているのですが、2の段階でsjisに変換できず困っています。 $a=Jcode::convert($a,"sjis","utf8") などと書いてみますがうまくいきません。 どなたかご指南頂けたら幸いです。

みんなの回答

  • t-okura
  • ベストアンサー率75% (253/335)
回答No.6

うまく伝えられるかわからないですが、 > %が\xにエスケープされてしまい文字として認識されない というのが誤解です。 ブラウザは日本語文字を送信する際、元の文字を %83%65%83%58%83%67 などにエンコードして送ります。 ウェブアプリケーションは、受け取った %83%65%83%58%83%67 を デコードし、元の文字に戻して処理します。 「\xにエスケープ」されていると仰っているのは元の文字に 戻されたデータを 2バイト単位に 16進表現で出力しているも のと思われます。 $a に「\xにエスケープ」されたデータが入っているのでしたら SJIS が正しく表示される端末で print $a すればデコード された文字が表示されるはずです。

keeeeeeeen
質問者

お礼

>t-okuraさん 丁寧なご回答ありがとうございます。 実はこれをそのままDBに入れ(sjis設定のDB)、それを再びブラウザで表示すると?混じりの文字になってしまうのです。 では\xが問題なのではなく、DBに入れるところで問題が起きている可能性が高いですね。

  • t-okura
  • ベストアンサー率75% (253/335)
回答No.5

form タグに accept-charset を指定しているので UTF-8 で データが送られてきていると思っているが、 実際に届いているデータは UTF-8 ではなく Shift_JIS だよ ということです。 accept-charset の指定方法が間違っているか、 accept-charset を理解しないブラウザを使っている のではないでしょうか。 データが Shift_JIS で届いているのだから $a=Jcode::convert($a,"sjis","sjis"); とすれば、あるいは何も変換せずに $a をそのまま 使えばよいのでしょう。 Shift_JIS 以外で届く場合も考慮して、文字コードの 判定処理を入れて変換した方がよいとは思いますが。

keeeeeeeen
質問者

お礼

>t-okuraさん ありがとうございます。わかりました、そういうことだったんですね。 formの方ではちゃんと届いてるのわかります。 ただ入ってきた時点で%が\xにエスケープされてしまい文字として認識されないのです。 それをuri_escapdeで変換して\xを%に変換すろと文字として認識されなくなります。

  • zxcv0000
  • ベストアンサー率56% (111/196)
回答No.4

私が言っているのは、 ・%83e%83X%83g はUTF-8では無く SJISである。 (UTF-8の「テスト」は E3 83 86 E3 82 B9 E3 83 88) ・ブラウザからUTF-8でサーバーに送るというのは勘違いでは無いか? と言う事です。 誤解はありませんか?

keeeeeeeen
質問者

お礼

>zxcv0000さん 度々ありがとうございます。 こちらの書き方に問題があるようで申し訳ないです。 おっしゃる通り%83e%83X%83gはsjisです。 >・ブラウザからUTF-8でサーバーに送るというのは勘違いでは無いか? 問題点が少々分からないです。 すいません。

  • zxcv0000
  • ベストアンサー率56% (111/196)
回答No.3

No.2 です。 > \x83e\x83X\x83g これは、 16進で 83 65 83 58 83 67 というオクテット列で、SJISと解釈すれば「テスト」ですね。 まずは、ブラウザから送られる文字列のコードが何かを確認されるのが良いと思いますよ。 通常は「そのフォームを含むHTMLと同じ文字コード」だと思いますが、InternetExplorerには「URLを全てUTF-8で送る」とか言うオプションがあったりして、私は良く知らないです。

keeeeeeeen
質問者

お礼

>zxcv0000さん ありがとうございます。 formタグのAccept-chatsetという属性指定でutf8で遅れるのですが、実際utf8でサーバーに送って受け取った後にsjisに戻せないんです。(この時は%83e%83X%83gもutf8形式に変換されています…が日本語としては認識できません) 実際このままデータを取得してSQLにぶち込んで再度そのSQLから引っ張るってHTMLで表示するという作業をしているのですが、その文字列(例だと%83e%83X%83g)のまま表示されてしまいます。

  • zxcv0000
  • ベストアンサー率56% (111/196)
回答No.2

STDERR を見ないと、当てずっぽうを超えた原因特定は困難でしょう。 CGIが吐くSTDERRを見ることができないなら、「Jcode のテスト用の CGI で無いスクリプト」で試すのが早道では無いかと思います。 私の当てずっぽう予測は、ブラウザに入力した文字列中に正しいShift_Jisに無い文字(Windows依存文字)が含まれてるから sjis への変換でコけた、です。 当っていれば、変換先の sjis を Windows-31J の替えればOKかと。 # 私は Jcode を知らなくて、Encode と同等を予想して書いてます。 違ってたらすみません。

keeeeeeeen
質問者

お礼

>zxcv0000さん ご指摘ありがとうございます。 cgi内でwarnをかけた結果でよろしいでしょうか? 下記がformで送られたものの文字をターミナルソフトteraterm内で見たものです。 \x83e\x83X\x83g 一応エスケープして\x→%に直しましたがうまくいきませんでした。 入力した文字も特に問題ありません。 ちなみに上記は【テスト】を入れたものです。 おそらくutf8としてではなくバイトとして認識されてしまっているようです。 >「Jcode のテスト用の CGI で無いスクリプト」 すいませんこちらどういうことでしょうか? 理解力が乏しくて申し訳ないです。

  • takas223
  • ベストアンサー率22% (299/1308)
回答No.1

私はFedoraでサーバを構築してますが、、、 CPANのモジュールとかどうですかね? なんかいいものがあるといいですが、、、

参考URL:
http://search.cpan.org/search?query=sjis&mode=all
keeeeeeeen
質問者

お礼

>takas223さん 解答ありがとうございます。 fedoraだとeucで書いていたので問題なかったのですが…。

関連するQ&A