WebSurfer's Home

トップ > Blog 2   |   ログイン
APMLフィルター

日本語の著者名の問題

by WebSurfer 2011年6月13日 23:14

各記事の左上に著者名が表示されます。この記事では By WebSurfer がそれです。この著者名をクリックすると、その著者が投稿した記事が選択され表示されるようになっています。(BlogEngine.NET は複数の投稿者を許しています)

ところが、著者名に日本語(たぶん、その他の Multi-Byte 文字も)を使うと、著者名のリンクをクリックしても何も選択されない(従って記事は何も表示されない)という問題があります。

例えば、著者名が "日本太郎" の場合、リンクの URL には以下のように設定されます。

http://surferonwww.info/BlogEngine2/author/日本太郎.aspx

このリンクをクリックすると、ブラウザはこれを URL エンコードしてからサーバーに送信し、これを受けたサーバーは、URL をデコードしてから UrlRewrite モジュールで以下のように書き換えます。

http://surferonwww.info/BlogEngine2/default.aspx?name=日本太郎

default.aspx.cs で、以下のコードで著者名を取得しようとしていますが、URL エンコードしてない生 UTF-8 なので正しく取得できません。

string author = Server.UrlDecode(Request.QueryString["name"]);

結果、著者名が日本語の場合は、著者名が正しく取得できないので著者に関連する記事を選択できず、何も表示されないということになります。

この問題を解決するには、default.aspx.cs に渡すクエリ文字列を URL エンコードしてやります。さらに、default.aspx.cs でクエリ文字列から著者名を取得する際デコードしないようにします。

具体的には以下のとおり修正しました。これで問題なく動いています。

Core/Web/HttpModule/UrlRewrite.cs の ContextBeginRequest メソッド

else if (url.Contains("/AUTHOR/"))
{
  // 日本語の author 名が認識されないので修正。具体的には、
  // author → context.Server.UrlEncode(author) としたのみ。
                
  var author = ExtractTitle(context, url);
  context.RewritePath(
    string.Format("{0}default{1}?name={2}{3}", 
      Utils.RelativeWebRoot, 
      BlogSettings.Instance.FileExtension, 
      context.Server.UrlEncode(author), 
      GetQueryString(context)),
    false);
}

default.aspx.cs の DisplayAuthors メソッド

private void DisplayAuthors()
{
  if (!string.IsNullOrEmpty(Request.QueryString["name"]))
  {
    // UrlDecode は不要なので以下の行を変更。
    //string author = Server.UrlDecode(Request.QueryString["name"]);

    string author = Request.QueryString["name"];

    PostList1.ContentBy = ServingContentBy.Author;
    PostList1.Posts = 
      Post.GetPostsByAuthor(author).ConvertAll(
        new Converter<Post, IPublishable>(delegate(Post p) 
          { return p as IPublishable; }));
    Title = "All posts by " + Server.HtmlEncode(author);
  }
}

なお、この問題は 1.6.1 では発生しません。

1.6.1 の場合、RemoveIllegalCharacters メソッドで UrlEncode が使われ、さらにそれから '%' 文字が除去された著者名がリンクの URL のクエリ文字列に設定されます。従って、DisplayAuthors メソッドで取得できる author はクエリ文字列に設定されたものと全く同じです。

それが Post.GetPostsByAuthor メソッドの引数として渡され、Post.Author で取得した著者名に RemoveIllegalCharacters メソッドを適用した文字列と比較され、一致する記事が選択されます。

ただし、Title に表示される著者名は、RemoveIllegalCharacters メソッドで変換された文字列になります(正しい日本語にはなりません)。

Tags:

BlogEngine.NET 2.0

About this blog

ここブログ2は日々の出来事、ブログ1はプログラミング関係のトピックスになっています。

Calendar

<<  2024年4月  >>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

View posts in large calendar