WebSurfer's Home

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

日付表示の変更(2)

by WebSurfer 2010年5月21日 00:00

先の投稿 日付表示の変更(1) で、日付の表示について「"yyyy年MM月dd日 HH:mm" としなかったのは、国際化対応にこだわったからです。」などと書いたのですが、結局 "2010年5月1日 12:00" 形式にしました。

今までの形式 "2010/05/01 12:00" では、日本語表示としてはどうしてもイマイチに思えたものですから。(汗)

でも、国際対応にはまだこだわっていて(笑)、ブラウザの言語の設定が日本語(ja-JP または ja)の時のみ "2010年5月1日 12:00" 形式とし、それ以外のときは BlogEngine のデフォルトの "d. MMMM yyyy HH:mm" 形式になるようにしました。

具体的には、PostView.ascx, CommentView.ascx で以下のようにしています(下記は PostView.ascx の場合です)。

<script runat="server"> protected void Page_PreRender(object sender, EventArgs e) { System.Globalization.CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentUICulture; if (ci.Name == "ja-JP" || ci.Name == "ja") { Label1.Text = Post.DateCreated.ToString("yyyy年M月d日 HH:mm"); } else { Label1.Text = Post.DateCreated.ToString("d. MMMM yyyy HH:mm"); } } </script> <div class="post xfolkentry" id="post<%=Index %>"> <h1> <a href="<%=Post.RelativeLink %>" class="taggedlink"> <%=Server.HtmlEncode(Post.Title) %> </a> </h1> <span class="author"> by <a href="<%=VirtualPathUtility.ToAbsolute("~/") + "author/" + BlogEngine.Core.Utils.RemoveIllegalCharacters(Post.Author) %>.aspx"> <%=Post.AuthorProfile != null ? Post.AuthorProfile.DisplayName : Post.Author %> </a> </span> <asp:Label ID="Label1" runat="server" CssClass="pubDate"></asp:Label> ・・・後略・・・

ブラウザで、言語の設定を変えると表示が変わります。IE8 ですと、[インターネットオプション]→[全般]タブ →[言語(L)]→[言語の優先順位]ダイアログで言語の設定を変えられますので、興味のある方はお試しください。

他に、カレンダーについても日本語の場合の表示を変更しました。その話は別途アップします。

Tags:

BlogEngine.NET

日本語の文字化けの問題(2)

by WebSurfer 2010年5月19日 22:24
[WebResource.axdを圧縮] の設定

先の投稿 日本語の文字化けの問題(1) で書きました [WebResource.axdを圧縮] にチェックを入れると日本語が文字化けする問題に対応しました。

原因は、BlogEngine.Core の Web\HttpModules フォルダの中にある HTTP モジュール CompressionModule.cs で、Encoding.Default でバイト列を文字列に変換し、文字列を処理した後、 再び Encoding.Default で文字列をバイト列に戻しているところでした。

MSDN ライブラリによると、Encoding.Default は "オペレーティング システムの現在の ANSI コード ページのエンコーディングを取得します" とのことで、 サーバーの OS のデフォルトの Encoding になるようです。自分が使っているホスティングサービス会社のサーバーは日本にあるので、Encoding.Default は Shift_JIS になるようです。

一方、実際の Encoding は UTF-8 であるため、Encoding.Default での変換で情報が失われて文字化けしてしまうようです。

web.config の globalization 要素の requestEncoding, responseEncoding を Shift_JIS にすると文字化けがなくなるという話を Web で見ますが、そういう理由のようです。

正しい解決方法は、CompressionModule.cs で使われている Encoding.Default を実際に使用されている Encoding にすることだと思われます。

WebResourceFilter クラスの Write メソッドの中に 2 ヶ所問題の部分がありますが、それを以下のように変更してみました。

public override void Write(byte[] buffer, int offset, int count) { //string html = System.Text.Encoding.Default.GetString(buffer); string html = HttpContext.Current.Response.ContentEncoding.GetString(buffer);      ・・・中略・・・ //byte[] outdata = System.Text.Encoding.Default.GetBytes(html); byte[] outdata = HttpContext.Current.Response.ContentEncoding.GetBytes(html); _sink.Write(outdata, 0, outdata.GetLength(0)); }

とりあえず、上の写真のように [WebResource.axdを圧縮] にチェックを入れても文字化けはしなくなりました。このまましばらく様子を見たいと思います。

Tags:

BlogEngine.NET

IIS7 Integrated mode での BlogEngine の実行

by WebSurfer 2010年5月9日 17:30
HttpModule, HttpHandler を <system.web> セクションに定義したときのエラー

このホームページのサーバーは Windows Server 2008 の IIS7 で、アプリケーションプールのマネージパイプラインモードは Integrated mode がデフォルトになっています。

一方、CodePlex のサイトにある Documentation によると、IIS7 を使用する場合、BlogEngine を運用するアプリケーションプールは "Classic .NET AppPool" にしないと、"some of the software will fail in strange ways" と書いてありました。

BlogEngine はホームページ本体とは別アプリケーションなので、自分でサーバーを運用していれば、それのみ "Classic .NET AppPool" にするのは簡単ですが、レンタルサ��バーではどうしようもありません(念のため、できないか聞いてみましたが、ダメとのこと)。

Microsoft の MSDN ライブラリの ASP.NET と IIS 7 の統合 などを読んで、対応方法を検討してみました。

それを見ると、問題は web.config における HttpModule と HttpHandler の定義方法のようです。要するに、<system.web> セクションの <httpModules> と <httpHandlers> 内に定義してはダメで、すべて <system.webServer> セクションの <modules> と <handlers> 内に移す必要があるということのようです。

実際に、<system.web> セクションの <httpModules> と <httpHandlers> 内のみに HttpModule と HttpHandler を定義すると、上の写真のようなエラーになります。

対処方法としては、MSDN ライブラリや写真のエラーメッセージに書いてあるように、appcmd.exe migrate config コマンドを実行するのがよさそうですが、レンタルサーバーではどうしようもありません。

仕方がないので、自分の PC でコマンドを走らせて web.config がどのように修正されるか調べ、それに従って手動でサーバーにある web.config を書き換えることにしました。

で、結論から言うと、BlogEngine.NET 1.6.1 の場合、web.config はすでにコマンドを走らせたのと同様な形に対応済みで、修正の必要はなかったです。

というわけで、BlogEngine.NET 1.6.1 は web.config の修正なしで IIS7 Integrated mode で動くということと理解しました。(これだけの対応で本当に済むのかどうかはまだちょっと疑問ですが・・・(汗))

ちなみに、appcmd.exe を走らせると web.config がどのように変わるかというと、<system.webServer> およびその中に <modules> と <handlers> が追加され、<system.web> セクションで定義されている HttpModule と HttpHandler がコピーされます。また、<validation validateIntegratedModeConfiguration="false" /> も追加されます。

要するに、Visual Studio 2008 がデフォルトで作る web.config と同じような内容になるということです。苦労して調べたのに、なんのこっちゃ・・・という感じです。(笑)

Tags: ,

BlogEngine.NET

About this blog

2010年5月にこのブログを立ち上げました。主に ASP.NET Web アプリ関係の記事です。

Calendar

<<  2024年5月  >>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

View posts in large calendar