none
IIS7、UTF-8 でHTMLENCODEすると文字化けする

    Question

  • IIS7

    aspページにて以下のコードを書きました

    <%@LANGUAGE = "VBScript" codepage=65001%>
    <% Option Explicit %>
    <% session.CodePage=65001 %>
    <% Response.Buffer = true %>
    <% Response.CacheControl = "Private"  %>
    <% Response.Expires=-1 %>
    <% Response.CharSet = "utf-8" %>

    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    --------途中省略-------------------------

    <%=HTMLENcode(text1)%>   

    ----------------------------------------------

    入力文字:だ → 表示:だ

    入力文字:< → 表示:□□

    入力文字:< → 表示:<

    入力文字:% → 表示:□□

    入力文字:% → 表示:%

     

    質問内容:入力画面側で、半角¥は使用できず\(バックスラッシュ)となってしまうのは

    よいとして、半角%、半角<が□□と文字化けしないようにするにはどうしたらよいのでしょうか?

    よろしくお願いいたします。

     

    Wednesday, December 24, 2008 5:31 PM

Answers

  • こんにちは。だどさんと申します。

     

    下記のコードで試してみましたが、残念ながら再現しませんでした。

     

    Code Snippet

    <%@ Language="VBScript" codepage="65001" %>
    <% Option Explicit %>
    <% session.CodePage=65001 %>
    <% Response.Buffer = true %>
    <% Response.CacheControl = "Private"  %>
    <% Response.Expires=-1 %>
    <% Response.CharSet = "utf-8" %>
    <%
    Dim text1

    text1 = Request("text1")
    text1 = Server.HTMLEncode(text1)

    %>   

    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    </head>
    <body>
    <form method="POST" action="htmlencode_test.asp">
    <input type="text" name="text1">
    <input type="submit" value="OK">
    </form>

    <pre>
    <%= text1 %>
    </pre>
    </body>
    </html>

     

     

     

    このコードが何か役に立つでしょうか。。。

     

    ご参考になれば幸いです。

     

    ----------------------------------------

    だどさん http://keicode.com/

     

    Wednesday, December 24, 2008 11:38 PM
  • こんにちは。

     

    コードを拝見したところ、SQLEnc, GetStringForm, HTMLENcode というのがユーザー定義関数のようですね。

     

    基本的に、私のサンプルコードは ASP/VBScript の標準関数のみで書きましたが、それで文字化けしないことを踏まえて、どの関数で文字化けが発生しているか切り分けてみるのが良いと思います。

     

    # ただの勘ですが、どれか COM (ActiveX DLL) を使って実装してませんか?もしそういうのがあったら、それが怪しいです。

     

    参考になりましたら幸いです。

     

    -----------------------------------

    だどさん http://keicode.com/

     

    Thursday, December 25, 2008 7:44 AM
  • やはり再現できないと対処は難しいですね。

    問題を小さいコードに切り分けていくしかないですね。

     

    ポイントは、今回の化け方からして UTF-8 と Unicode の変換で化けるとか、そういう点ではないということですね。(通常そこは CodePage を指定していれば無事通過できます) ですから、バイト操作するような箇所で壊れているでしょうね。

     

    ------------------------------------------

    だどさん http://keicode.com/

     

    Wednesday, January 07, 2009 4:58 PM

All replies

  • こんにちは。だどさんと申します。

     

    下記のコードで試してみましたが、残念ながら再現しませんでした。

     

    Code Snippet

    <%@ Language="VBScript" codepage="65001" %>
    <% Option Explicit %>
    <% session.CodePage=65001 %>
    <% Response.Buffer = true %>
    <% Response.CacheControl = "Private"  %>
    <% Response.Expires=-1 %>
    <% Response.CharSet = "utf-8" %>
    <%
    Dim text1

    text1 = Request("text1")
    text1 = Server.HTMLEncode(text1)

    %>   

    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    </head>
    <body>
    <form method="POST" action="htmlencode_test.asp">
    <input type="text" name="text1">
    <input type="submit" value="OK">
    </form>

    <pre>
    <%= text1 %>
    </pre>
    </body>
    </html>

     

     

     

    このコードが何か役に立つでしょうか。。。

     

    ご参考になれば幸いです。

     

    ----------------------------------------

    だどさん http://keicode.com/

     

    Wednesday, December 24, 2008 11:38 PM
  • だとさん 様またまたありがとうございます。

    今回は、私の書き方が悪かったと思いますので、訂正させていただきます。

    ◎入力側 index.asp

    <%@ Language="VBScript" codepage="65001" %>
    <% Option Explicit %>
    <% session.CodePage=65001 %>
    <% Response.Buffer = true %>
    <% Response.CacheControl = "Private"  %>
    <% Response.Expires=-1 %>
    <% Response.CharSet = "utf-8" %>

    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    </head>
    <body>
    <form style="margin:0px" name="form1" action="check.asp" method="post" target="_self">
    <td><input name="textfield1" type="text" maxlength="100" value="<%=textfield1%>" style="ime-mode:enabled" />
    </td>

    <input type="submit" value="送信">
    </form>

    </body>
    </html>
    ◎結果側 check.asp

    <%@ Language="VBScript" codepage="65001" %>
    <% Option Explicit %>
    <% session.CodePage=65001 %>
    <% Response.Buffer = true %>
    <% Response.CacheControl = "Private"  %>
    <% Response.Expires=-1 %>
    <% Response.CharSet = "utf-8" %>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    </head>
    <% Dim textfield1

        textfield1 = Trim(SQLEnc(GetStringForm("textfield1", NULL, "")))

    %>

         <table class="form">
              <tr>
                <th>サイト名</th>
                <td><%=HTMLENcode(textfield1)%></td>
              </tr>
              <tr>
        </table>

    </body>
    </html>

    となっております。

    クライアントPCはVista、IE7で文字化けが確認されます。

    以上 よろしくお願いいたします。

      

    Thursday, December 25, 2008 12:48 AM
  • こんにちは。

     

    コードを拝見したところ、SQLEnc, GetStringForm, HTMLENcode というのがユーザー定義関数のようですね。

     

    基本的に、私のサンプルコードは ASP/VBScript の標準関数のみで書きましたが、それで文字化けしないことを踏まえて、どの関数で文字化けが発生しているか切り分けてみるのが良いと思います。

     

    # ただの勘ですが、どれか COM (ActiveX DLL) を使って実装してませんか?もしそういうのがあったら、それが怪しいです。

     

    参考になりましたら幸いです。

     

    -----------------------------------

    だどさん http://keicode.com/

     

    Thursday, December 25, 2008 7:44 AM
  • 昔ASPアプリケーションの国際化であれこれやった経験がある(http://blogs.sqlpassj.org/akiraonishi/category/269.aspx)ので、つい気になって調べてみましたが、おそらくSQLEncとHTMLEncodeは次のサイトにあるものでしょうね。

    http://bme.t.u-tokyo.ac.jp/tech_ref/asp_functions/index.html

     

    その内容を見る限りはASP側でUnicodeの処理をしているだけに過ぎないので、文字化けにつながるとは思えません。

    おそらくGetStringFormという部分が怪しいですが、値がNullだったら、""にしようとしているだけなのでしょうか。

    どちらにせよ、そこをのぞいて試しに動作確認してみましたが、文字化けは確認できません。

    動作環境は、Windows Vista SP1 x86、IE 7で同じです。

    ---

    <%@ Language="VBScript" codepage="65001" %>
    <%
    ' input.asp
    Option Explicit
    session.CodePage=65001
    Response.Buffer = true
    Response.CacheControl = "Private"
    Response.Expires=-1
    Response.CharSet = "utf-8"
    Dim textfield1
    textfield1="<%"
    %>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    </head>
    <body>
    <form style="margin:0px" name="form1" action="check.asp" method="post" target="_self">
    <td><input name="textfield1" type="text" maxlength="100" value="<%=textfield1%>" style="ime-mode:enabled" />
    </td>

    <input type="submit" value="送信">
    </form>

    </body>
    </html>
    ---

    <%@ Language="VBScript" codepage="65001"%>
    <%
    ' check.asp
    Option Explicit
    session.CodePage=65001
    Response.Buffer = true
    Response.CacheControl = "Private"
    Response.Expires=-1
    Response.CharSet = "utf-8"

    Function SQLEnc(x)
    x = Replace(x, "'", "''")
    x = Replace(x, "\", "\\")
    SQLEnc = x
    End Function

    Function HTMLENcode(x)
    x = Server.HTMLEncode(x)
    x = Replace(x,Chr(13) + Chr(10),"<br>")
    x = Replace(x,Chr(10),"<br>")
    HTMLENcode = x
    End Function

    %>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    </head>
    <% Dim textfield1
        textfield1 = Trim(SQLEnc(Request.Form("textfield1")))

    %>

         <table class="form">
              <tr>
                <th>サイト名</th>
                <td><%=HTMLENcode(textfield1)%></td>
              </tr>
              <tr>
        </table>

    </body>
    </html>


      この投稿は現状のまま何の保証もなく掲載しているものであり、何らかの権利を許諾するものでもありません。コミュニティにおけるマイクロソフト社員による発言やコメントは、マイクロソフトの正式な見解またはコメントではありません。詳しくは http://www.microsoft.com/japan/communities/msp.mspx をご覧ください。

     

     

     

     

    Wednesday, January 07, 2009 9:40 AM
  • やはり再現できないと対処は難しいですね。

    問題を小さいコードに切り分けていくしかないですね。

     

    ポイントは、今回の化け方からして UTF-8 と Unicode の変換で化けるとか、そういう点ではないということですね。(通常そこは CodePage を指定していれば無事通過できます) ですから、バイト操作するような箇所で壊れているでしょうね。

     

    ------------------------------------------

    だどさん http://keicode.com/

     

    Wednesday, January 07, 2009 4:58 PM
  • こんにちは、フォーラムオペレーターの鈴木裕子です

     

    だどさん さん、検証までしていただいて、丁寧な回答をありがとうございます!

     

    rokuchan さん、その後いかがでしたでしょうか?切り分けの結果どのようになったかが気になるところですが、今回のご質問についてはだどさん さんのご投稿、また弊社 大西の投稿が参考になったのではないかと思いましたので、勝手ながら私の方で回答チェックを付けさせていただきました。

    もし問題が未解決であったり不適切と思われた場合は、遠慮なくチェックを解除して引き続き投稿してくださいね。

     

    解決済みでいらした場合は、その後の経過をご投稿いただけると大変うれしいです。

    検証してくださった だどさん さんや、弊社 大西も気になっていると思いますので!

    お待ちしております

    Thursday, January 15, 2009 5:43 AM
    Moderator