ASP.NETアプリケーションのMonoへの移植。 ロシア語のサポート

最近、小さなASPアプリケーションを.NETからMonoに移植しました。 デフォルト設定でロシア語のサポートがほぼ完全に不足していることに直面しました。 Debian lenny(netinst)+ Apache2 + mono-apache-server2バンドルが使用されました。



問題解決:



最初の問題:ロシア語のテキストが.aspxファイルの本文に表示されない


最初のテストでは、ASPXの本文でロシア語の文字が失われるという問題が発生しました。

たとえば、次のようなファイル:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Test.aspx.cs" Inherits="Test" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server">   <title>Test</title> </head> <body>    . </body> </html>
      
      







ブラウザでは、次のように表示されました。

画像



この問題は、lenny-backportsから最新のモノバージョンをインストールすることで解決しました。

aptitude -t lenny-backports install mono-apache-server libapache2-mod-mono









その結果、読みやすいテキストが得られました。

画像



2番目の問題:ブラウザーのデフォルトの言語設定に応じてアプリケーションの言語を切り替える


IIS + .NETバンドルでは、リクエストを行うブラウザーの設定に応じて、プロセスは自動的にロケールを切り替えます。 Monoはクエリ言語パラメーターを無視し、英語ロケールで常に機能していました。



ブラウザ要求で渡されたパラメーターに応じて、スレッドの言語設定を切り替えるHTTPモジュールを自分で作成する必要がありました。



モジュールコード:

 using System; using System.Collections.Generic; using System.Globalization; using System.Threading; using System.Web; // Class for set interface language from browser language setting. public class LangHTTPModule : IHttpModule { public void Dispose() { } public void Init(HttpApplication context) { context.BeginRequest += new EventHandler(context_BeginRequest); } // Set interface language. private void context_BeginRequest(object sender, EventArgs e) { HttpContext context = ((HttpApplication)sender).Context; HttpRequest req = context.Request; string reqLang = req.UserLanguages[0]; switch (reqLang.ToLower()) { case "ru": // Russian. reqLang = "ru-RU"; break; case "ru-ru": // Russian. reqLang = "ru-RU"; break; default: // Unknow value - set english (US) language. reqLang = "en-US"; break; } Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(reqLang); } }
      
      







そして、<system.web>セクションのweb.configに登録しました。

 <httpModules> <add name="LangHTTPModule" type="LangHTTPModule"/> </httpModules>
      
      







3番目の問題:非Unicodeエンコーディングの使用


ポータブルアプリケーションは、Winアプリケーション用の資料を準備するためのテキストパーサーです。 アプリケーションは古く、CP-1251でのみ機能します。 Monoはデフォルトでそのようなエンコーディングを認識しません。

そしてそのようなコード

Encoding enc = Encoding.GetEncoding("Windows-1251");





例外をスローします。



追加のエンコーディングは別のライブラリにあります。 次のコマンドで入力します。

aptitude -t lenny-backports install libmono-i18n2.0-cil









まとめ


その結果、Monoベースのロシア語で正しく動作するASPアプリケーションを入手しました。 アプリケーション内で変更を加えませんでした。 アプリケーションは、独自のライブラリと既にコンパイルされた外部ライブラリの両方を使用しますが、それらにも問題はありませんでした。 移行は簡単だったと思うし、将来的にはMonoを使い続けるつもりです。






All Articles