- PR -

POSTされたデータが文字化けする

投稿者投稿内容
よしまさ
常連さん
会議室デビュー日: 2003/11/04
投稿数: 20
投稿日時: 2006-01-25 14:41
囚人様

ご返答ありがとうございます。

私もいけそうな気がしたんですが、
だめでした。

Web.conifgの
responseEncodingキーあたりが
いけない気がしています。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-01-25 15:15
試したら先のコードで解消されたんですが、何かまだ条件があるのかな?
EUC って EUC-JP ですよね?

Shift_JIS -> Unicode
requestEncoding が Shift_JIS だという事は、サーバ側は Shift_JIS だと思って受け取るわけですよね。
内部で処理するときは String だとか Char だとかで扱いたいので、その Shift_JIS で来た文字列を Unicode にしてやってるわけですよね。

だから戻す。

Unicode -> Shift_JIS
byte[] b1 = Encoding.GetEncoding( "Shift_JIS" ).GetBytes ( Request[ "value1" ] );

この b1 がクライアントが送信した値になっているわけですよね。
で、これが EUC-JP だと言うのだから

EUC-JP -> Unicode
string s2 = Encoding.GetEncoding( "euc-jp" ).GetString( b1 );

かな?と思ったんですが。

_________________
囚人のジレンマな日々
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2006-01-25 15:33
引用:

囚人さんの書き込み (2006-01-25 15:15) より:
試したら先のコードで解消されたんですが、何かまだ条件があるのかな?


たまたまと思ったほうがいいでしょう。
でたらめな文字コードでデコードしたものが
元の情報を全て保持している保証はありません。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-01-25 16:04
引用:

たまたまと思ったほうがいいでしょう。


ありゃ。まじっすか^^;

コード:
	Encoding shift = Encoding.GetEncoding( "Shift_JIS" );
	Encoding euc = Encoding.GetEncoding( "euc-jp" );

	// a.txt は euc-jp でかかれている。Shift_JIS で読み込んだ。
	StreamReader r = new StreamReader( @"D:\\a.txt", shift );

	// もちろん文字化け
	string source = r.ReadToEnd();

	// バラす
	byte[] b = shift.GetBytes( source );

	// 戻す。化けてない
	string result = euc.GetString( b );



実際試したのは、POST を送る方をプレーン HTML で書き、euc-jp で保存。POST を受ける方は質問者と同じ条件でやりました。処理を入れなかったら化けてますが、処理を入れると OK のようです。

上記はまた別の例です。
いろんな文字を試したのですが、いけているような…。

_________________
囚人のジレンマな日々
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2006-01-25 16:39
引用:

囚人さんの書き込み (2006-01-25 16:04) より:
引用:

たまたまと思ったほうがいいでしょう。


ありゃ。まじっすか^^;


まじっす。

.NETに限らずUnicodeへの変換はテーブルを見ながら一文字ずつ置き換える以外にありません。この時、Unicode変換テーブルに定義されていない文字(外字領域やShiftJISで文字を割当てていない領域)は単純に捨てられるか、変換できなかった事を示す文字コードに置き換えられます。逆変換なんて出来ません。

なので攻略方法としては、ASP.NETフレームワークが文字コードを変換する手前で、EUC->ShiftJIS又はEUC->Unicodeに変換する以外にありません。ISAPIフィルターを作るか、Proxyサーバーを作るか、相手側で変換してから送ってもらうか、方法はいろいろあるでしょうけど。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-01-25 23:54
引用:

まじっす。

.NETに限らずUnicodeへの変換はテーブルを見ながら一文字ずつ置き換える以外にありません。この時、Unicode変換テーブルに定義されていない文字(外字領域やShiftJISで文字を割当てていない領域)は単純に捨てられるか、変換できなかった事を示す文字コードに置き換えられます。逆変換なんて出来ません。


まじだったっすか。
なるほど。奥が深いですね。ありがとうございます。

そうなると、この問題は根が深いですねぇ。
_________________
囚人のジレンマな日々
よしまさ
常連さん
会議室デビュー日: 2003/11/04
投稿数: 20
投稿日時: 2006-01-26 10:54
遅くなりまして申し訳ありません。
みなさまご返答ありがとうございます。

todo様にお教えいただいた
<location>要素を使用して、
外部連携のあるページだけ、
euc-jpに設定してみましたが、
以下のエラーが発生してしまい
結局うまくいきませんでした。

[ArgumentException: mlang はサポートされたエンコード名ではありません。
パラメータ名 : name]
System.Globalization.EncodingTable.internalGetCodePageFromName(String name) +225
System.Globalization.EncodingTable.GetCodePageFromName(String name) +158
System.Web.HttpResponse.get_ContentEncoding() +466
System.Web.HttpWriter.UpdateResponseEncoding() +35
System.Web.HttpWriter..ctor(HttpResponse response) +173
System.Web.HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr) +283

mlang.dllが特定のコードページ(51932等)を指定したときだけ
.Netからみえていない感じなのですが。

またmlangのバージョンも、
2003では6.0.37890.1830

XPは6.0.2900.2530
となっておりこのあたりも気になっております。

nanbu
大ベテラン
会議室デビュー日: 2004/08/19
投稿数: 178
投稿日時: 2006-01-26 13:30
南部です。

コード:
Global.aspx.cs

protected void Application_BeginRequest(Object sender, EventArgs e)
{
  //例)localhostからのPOSTの場合
  if(Request.UrlReferrer != null && Request.UrlReferrer.Host == "localhost")
    Request.ContentEncoding = System.Text.Encoding.GetEncoding("EUC-JP");
}

スキルアップ/キャリアアップ(JOB@IT)