もしあなたが大量のEUC-JPファイルを作っていたら、どうやってUTF-8へ移行するか頭を抱える事でしょう。
しかし、私はここにとてもよい解決方法を見つけました。
kanjitranslatorというフォルダ一括変換ツールです。これを使うとwikiの様なフォルダにある大量のEUC-JPファイルを一括してUTF-8へ変換できます。
もう、文字列コード変換で悩む事はありません。
2011年2月11日金曜日
2011年2月9日水曜日
サニタイズについて
Rails の場合 white list に基づいて3段階、RESTRICTED,BASIC,RELAXED
とサニタイズします。
XOOPSのコアにもこんなサニタイズのクラスが欲しいですね。
# html = Sanitize.clean(対象のhtml文字列, オプションのhash)
require 'rubygems' require 'sanitize' html = '<b><a href="http://foo.com/">foo</a></b> <img src="http://foo.com/bar.jpg" />' Sanitize.clean(html) # => 'foo'
Sanitize.clean(html, Sanitize::Config::RESTRICTED) # => '<b>foo</b>' Sanitize.clean(html, Sanitize::Config::BASIC) # => '<b><a href="http://foo.com/" rel="nofollow">foo</a></b>' Sanitize.clean(html, Sanitize::Config::RELAXED) # => '<b><a href="http://foo.com/">foo</a></b><img src="http://foo.com/bar.jpg" />'
カスタマイズでこんな事も
Sanitize.clean(html, :elements => ['a', 'span'], :attributes => {'a' => ['href', 'title'], 'span' => ['class']}, :protocols => {'a' => {'href' => ['http', 'https', 'mailto']}})
module.textsanitizer.php 日本語のクリッカブルリンクでHTMLが壊れる件
XOOPS Cube 2.1.8 のコアの話ですが、日本語混じりだとHTMLが壊れる事があります。こんな感じで、正規表現を変えます。
/**
* Make links in the text clickable
* 2010/07/06 Y.Sakai change pattern for japanese char
* @param string $text
* @return string
**/
function &makeClickable(&$text)
{
// $patterns[] = "/(^|[^]_a-z0-9-=\"'\/])([a-z]+?):\/\/([^, \r\n\"\(\)'<>]+)/i";
// $replacements[] = "\\1<a href=\"\\2://\\3\" target=\"_blank\">\\2://\\3</a>";
$patterns[] = "/(^|[^]_a-z0-9-=\"'\/])([a-z]+?):\/\/([-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)/i";
$replacements[] = "\\1<a href=\"\\2://\\3\" target=\"_blank\">\\2://\\3</a>";
$patterns[] = "/(^|[^]_a-z0-9-=\"'\/])www\.([a-z0-9\-]+)\.([^, \r\n\"\(\)'<>]+)/i";
$replacements[] = "\\1<a href=\"http://www.\\2.\\3\" target=\"_blank\">www.\\2.\\3</a>";
$patterns[] = "/(^|[^]_a-z0-9-=\"'\/])ftp\.([a-z0-9\-]+)\.([^, \r\n\"\(\)'<>]+)/i";
$replacements[] = "\\1<a href=\"ftp://ftp.\\2.\\3\" target=\"_blank\">ftp.\\2.\\3</a>";
$patterns[] = "/(^|[^]_a-z0-9-=\"'\/:\.])([a-z0-9\-_\.]+?)@([a-z0-9!#\$%&'\*\+\-\/=\?^_\`{\|}~\.]+)/i";
$replacements[] = "\\1<a href=\"mailto:\\2@\\3\">\\2@\\3</a>";
return preg_replace($patterns, $replacements, $text);
}
2011年1月3日月曜日
sakura VPS の postfix を google mail へ一本化
さて、apacheでサクッと複数ドメインは設定できたがそれらのメールアドレスはどうするの?という問題。dovecotでもいいが、一番簡単なのは、 virtusertable でgmail.comへ飛ばす方法。
/etc/postfix/main.cf の最下行に以下2行を追加
次は /etc/postfix/virtusertable に振り分けをテキストで書く
保存したら、 sudo postmap /etc/postfix/virtusertable で virtusertable.db 作成
後は、 sudo /etc/init.d/postfix restart でおしまい。
以上、早食い sakura VPS マルチドメインのメールアドレスを gmail.comへ飛ばす編でした。
Yoshi Sakai @ bluemoon inc.
/etc/postfix/main.cf の最下行に以下2行を追加
virtual_alias_domains = hoge1.com , hoge2.info
virtual_maps=hash:/etc/postfix/virtusertable
次は /etc/postfix/virtusertable に振り分けをテキストで書く
info@hoge1.com hoge@gmail.com
info@hoge2.info hoge@gmail.com
保存したら、 sudo postmap /etc/postfix/virtusertable で virtusertable.db 作成
後は、 sudo /etc/init.d/postfix restart でおしまい。
以上、早食い sakura VPS マルチドメインのメールアドレスを gmail.comへ飛ばす編でした。
Yoshi Sakai @ bluemoon inc.
2010年12月28日火曜日
formatedAddressの細部取得
/// <summary>/// 住所を表します。/// </summary>class Address{ /// <summary> /// JavaScript によって、Goole Map の Geocoder から取得した住所情報から Address インスタンスを生成します。 /// Address クラスのインスタンスは、このメソッドだけが生成可能です。 /// </summary> /// <param name="address">Geocoder から取得した住所文字列。</param> /// <returns></returns> public static Address FromGeocoderAddress( string address ) { if( String.IsNullOrEmpty( address ) ) { return null; } // 整形済みの住所は常に存在している必要がある var formatedAddress = Address.GetAdressValue( address, Address.TagFormatedAddress ); if( String.IsNullOrEmpty( formatedAddress ) ) { return null; } return new Address() { FormatedAddress = formatedAddress, Country = Address.GetAdressValue( address, Address.TagCountry ), ProvinceState = Address.GetAdressValue( address, Address.TagProvinceState ), City = Address.GetAddressValueCity( address ) }; } /// <summary> /// JavaScript によって、Goole Map の Geocoder から取得した住所情報から、一つの住所区分を取得します。 /// 住所情報となる文字列は、"country:日本;administrative_area_level_1:東京都; ...etc" という形式となります。 /// </summary> /// <param name="address">Geocoder から取得した住所情報の文字列。</param> /// <param name="tag">取得する値の種別を示すタグ名。</param> /// <returns>取得した住所区分。</returns> private static string GetAdressValue( string address, string tag ) { return Address.GetAdressValue( address, tag, true ); } /// <summary> /// JavaScript によって、Goole Map の Geocoder から取得した住所情報から、一つの住所区分を取得します。 /// 住所情報となる文字列は、"country:日本;administrative_area_level_1:東京都; ...etc" という形式となります。 /// </summary> /// <param name="address">Geocoder から取得した住所情報の文字列。</param> /// <param name="tag">取得する値の種別を示すタグ名。</param> /// <param name="isLastIndexOf">tag を先頭から検索する場合は true、末尾からの場合は false。</param> /// <returns>取得した住所区分。</returns> private static string GetAdressValue( string address, string tag, bool isIndexOf ) { int index = ( isIndexOf ? address.IndexOf( tag ) : address.LastIndexOf( tag ) ); if( index == -1 ) { return null; } int begin = index + tag.Length; index = address.IndexOf( ";", begin ); if( index == -1 ) { return null; } int length = index - begin; return address.Substring( begin, length ); } /// <summary> /// 都市情報を取得します。 /// </summary> /// <param name="address">Geocoder から取得した住所情報の文字列。</param> /// <returns></returns> private static string GetAddressValueCity( string address ) { // 例えば住所の都市部分が A 市 B 町 6-2 の場合、{ "2", "6", "B 町", "A 市" } のように格納されていて、 // "A 市" が TagCity、それ以降が全て TagSubCity になるので、TagCity と最後に登場する TagSubCity で取得する。 // var city = String.Format( "{0}{1}", Address.GetAdressValue( address, Address.TagCity ), Address.GetAdressValue( address, Address.TagSubCity, false ) ); if( String.IsNullOrEmpty( city ) ) { city = String.Format( "{0}{1}", Address.GetAdressValue( address, Address.TagProvinceState2 ), Address.GetAdressValue( address, Address.TagProvinceState3 ) ); } return city; }}formatted_addressの取得サンプル
<script type="text/javascript"><!--
google_ad_client = "ca-pub-7939613401472758";
/* getAddressByLatLng top */
google_ad_slot = "2186761428";
google_ad_width = 678;
google_ad_height = 15;
//--></script></div>
<div id="map" style="width: 680px; height: 340px;"> </div>
<script type='text/javascript'><!--
var map = new google.maps.Map(document.getElementById("map"), {
zoom: 12,
center: new google.maps.LatLng(35.712036115726725, 139.60383224487302),
mapTypeId: google.maps.MapTypeId.ROADMAP
});
google.maps.event.addListener(map, 'click', function(mouseEvent) {
getAddress(mouseEvent.latLng);
});
function getAddress(latlng) {
var geocoder = new google.maps.Geocoder();
geocoder.geocode({
latLng: latlng
}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
if (results[0].geometry) {
var address = results[0].formatted_address.replace(/^日本, /, '');
address = replace(/^日本, /, '');
new google.maps.InfoWindow({
content: address + "<br>(Lat, Lng) = " + latlng
}).open(map, new google.maps.Marker({
position: latlng,
map: map
}));
}
} else if (status == google.maps.GeocoderStatus.ERROR) {
alert("サーバとの通信時に何らかのエラーが発生!");
} else if (status == google.maps.GeocoderStatus.INVALID_REQUEST) {
alert("リクエストに問題アリ!geocode()に渡すGeocoderRequestを確認せよ!!");
} else if (status == google.maps.GeocoderStatus.OVER_QUERY_LIMIT) {
alert("短時間にクエリを送りすぎ!落ち着いて!!");
} else if (status == google.maps.GeocoderStatus.REQUEST_DENIED) {
alert("このページではジオコーダの利用が許可されていない!・・・なぜ!?");
} else if (status == google.maps.GeocoderStatus.UNKNOWN_ERROR) {
alert("サーバ側でなんらかのトラブルが発生した模様。再挑戦されたし。");
} else if (status == google.maps.GeocoderStatus.ZERO_RESULTS) {
alert("見つかりません");
} else {
alert("えぇ~っと・・、バージョンアップ?");
}
});
}
//--></script>
2010年12月18日土曜日
メーラーの文字コードが ISO-2022-JP ではイケない件
ウェブサイトで「スペイン語が文字化けしますっ」と言われて ó とか入れれば 大丈夫ですね~という対応で文字化けを救った後の話題です。
メーラーでは、いわゆる特殊文字で「①(マルイチ)」とか入っているとまずいので、 「ISO-2022-JP で送りましょうねー」という暗黙の了解の元にソースを書いているのですが、 ó はメチャメチャ文字化けする訳です。
しかし、受け取り手がみんなUTF-8では無い訳ですからぢゃあUTF-8ねという事もできません。・・・ハテ
文字化けする条件
なんだかんだ見て行くと西欧なら iso-885901 で間に合いそうだが、韓国語だと EUC-KR だし、中国語だと Big5 と GB2312 になる。受け取り手のメーラーを予想してコード変換は無意味な感じがするので、古いコードを捨てよう。
ちなみにXOOPSだと
$xoopsMailer->charSet = "UTF-8";
$xoopsMailer->Encoding = "base64";
とやらないとデフォでiso-2022-jp/7bitになる。最新ソースは未調査
ちなみにガラケー用には ISO-2022-JP にしておかないと化けますよ、多分。
メーラーでは、いわゆる特殊文字で「①(マルイチ)」とか入っているとまずいので、 「ISO-2022-JP で送りましょうねー」という暗黙の了解の元にソースを書いているのですが、 ó はメチャメチャ文字化けする訳です。
しかし、受け取り手がみんなUTF-8では無い訳ですからぢゃあUTF-8ねという事もできません。・・・ハテ
文字化けする条件
なんだかんだ見て行くと西欧なら iso-885901 で間に合いそうだが、韓国語だと EUC-KR だし、中国語だと Big5 と GB2312 になる。受け取り手のメーラーを予想してコード変換は無意味な感じがするので、古いコードを捨てよう。
ちなみにXOOPSだと
$xoopsMailer->charSet = "UTF-8";
$xoopsMailer->Encoding = "base64";
とやらないとデフォでiso-2022-jp/7bitになる。最新ソースは未調査
ちなみにガラケー用には ISO-2022-JP にしておかないと化けますよ、多分。
登録:
投稿 (Atom)