<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
   <channel>
      <title>山本隆の開発日誌</title>
      <link>http://www.gesource.jp/weblog/</link>
      <description>自作のソフトウェアやプログラミング全般についての話題</description>
      <language>ja</language>
      <copyright>Copyright 2009</copyright>
      <lastBuildDate>Sat, 26 Sep 2009 23:11:52 +0900</lastBuildDate>
      <generator>http://www.sixapart.com/movabletype/</generator>
      <docs>http://blogs.law.harvard.edu/tech/rss</docs> 

            <item>
         <title>ブログソフトを変更しました。RSSの変更をお願いします。</title>
         <description>
ブログソフトをMovableTypeからWordpressに変更しました。  
RSSのURLが変更になります。  
RSSリーダーなどに登録されている方は、変更をお願いします。  

あたらしいRSSは次のURLになります。

[http://www.gesource.jp/weblog/?feed=rss2](http://www.gesource.jp/weblog/?feed=rss2)

よろしくお願いします。
</description>
         <link>http://www.gesource.jp/weblog/archives/2009/09/rss_1.html</link>
         <guid>http://www.gesource.jp/weblog/archives/2009/09/rss_1.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">その他</category>
        
        
         <pubDate>Sat, 26 Sep 2009 23:11:52 +0900</pubDate>
      </item>
            <item>
         <title>UnicodeStringの波ダッシュ問題の回避策のまとめ</title>
         <description><![CDATA[UnicodeStringをJISやEUC-JPに変換すると「～」が文字化けします。

    UnicodeString uni = L"10～20";
    AnsiStringT<50220> jis = uni; //=> 「～」が文字化けする

反対に、JISやEUC-JPをUnicodeStringに変換しても「～」が文字化けします。  
\# <del>ちなみにShift-JISでは文字化けしません。</del>  
(修正)Shift-JISでも問題が発生するようです。

この問題を回避する関数が[MECSUtils][1]に用意されています。  
[MecsMappingFix\_UnicodeToJISX0208 関数][4]と[MecsMappingFix\_JISX0208ToUnicode 関数][5]です。  
\# MECSUtils ver1.33から関数名が変わりました。

UnicodeStringをJISやEUC-JPに変換するときは、[MecsMappingFix\_UnicodeToJISX0208 関数][4]を使用してから、変換します。

    #include "MECSUtils.hpp"
    
    UnicodeString uni = L"10～20";
    uni = Mecsutils::MecsMappingFix_UnicodeToJISX0208(uni);
    AnsiStringT<50220> jis = uni; //=>「10～20」

UnicodeStringをShift-JISに変換するときは、[MecsMappingFix\_UnicodeToCP932 関数][3]を使います。

    #include "MECSUtils.hpp"
    
    UnicodeString uni = …
    uni = Mecsutils::MecsMappingFix_UnicodeToCP932(uni);
    AnsiStringT<932> sjis = uni;

反対に、JISやEUC-JPをUnicodeStringに変換するときは、UnicodeStringに変換してから、[MecsMappingFix\_JISX0208ToUnicode関数][5]を使用します。

    #include "MECSUtils.hpp"
    
    UnicodeString uni = Mecsutils::AnsiToUTF16(raw, CodePage);
    uni = Mecsutils::MecsMappingFix_JISX0208ToUnicode(uni);

Shift-JISをUnicodeStringに変換するときは、[MecsMappingFix_CP932ToUnicode 関数][6]を使います。

    #include "MECSUtils.hpp"
    
    UnicodeString uni = Mecsutils::AnsiToUTF16(raw, CodePage);
    uni = Mecsutils::MecsMappingFix_CP932ToUnicode(uni);

各関数についての詳細は、[MECSUtils リファレンス][7]に丁寧な説明がありますので、そちらをご覧下さい。

* [MecsMappingFix_CP932ToUnicode][6]
* [MecsMappingFix_JISX0208ToUnicode][5]
* [MecsMappingFix_UnicodeToCP932][3]
* [MecsMappingFix_UnicodeToJISX0208][4]

追記  
[MECSUtils 1.35][1]でCP932(Shift-JIS)用の関数も用意されました。  
Shift-JISに関する記述を修正しました。

「[ＤＥＫＯのざつだん。][2]」によると、私が思っていたよりも複雑な問題だったようです。  
DEKOさんの丁寧な対応に感謝します。

[1]: http://cc.embarcadero.com/item/26061
[2]: http://homepage1.nifty.com/ht_deko/ft0909.html#090925
[3]: http://homepage1.nifty.com/ht_deko/tech021.html#MecsMappingFix_UnicodeToCP932
[4]: http://homepage1.nifty.com/ht_deko/tech021.html#MecsMappingFix_UnicodeToJISX0208
[5]: http://homepage1.nifty.com/ht_deko/tech021.html#MecsMappingFix_JISX0208ToUnicode
[6]: http://homepage1.nifty.com/ht_deko/tech021.html#MecsMappingFix_CP932ToUnicode
[7]: http://homepage1.nifty.com/ht_deko/tech021.html
]]></description>
         <link>http://www.gesource.jp/weblog/archives/2009/09/unicodestring.html</link>
         <guid>http://www.gesource.jp/weblog/archives/2009/09/unicodestring.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">C++Builder</category>
        
        
         <pubDate>Fri, 25 Sep 2009 11:18:46 +0900</pubDate>
      </item>
            <item>
         <title>RAD Studio 2010 Update 1</title>
         <description>
RAD Studio 2010 Update 1がリリースされました。

[RAD Studio 2010 Update 1 リリースノート][1]によると、今回の修正は

* 製品が All-Access がインストールされている環境で正しく動作するように修正されました。
* ネットワークライセンスを含むライセンスに関係する重要な修正が含まれました。
* 将来のアップデートが正しく適用できるようにするための重要な修正が含まれました。

慌ててアップデートする必要はなさそうです。

[1]: http://edn.embarcadero.com/article/39990</description>
         <link>http://www.gesource.jp/weblog/archives/2009/09/rad_studio_2010_update_1.html</link>
         <guid>http://www.gesource.jp/weblog/archives/2009/09/rad_studio_2010_update_1.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">C++Builder</category>
        
        
         <pubDate>Fri, 25 Sep 2009 09:20:16 +0900</pubDate>
      </item>
            <item>
         <title>CSV Mailer バージョン0.5.8を公開しました。</title>
         <description>CSV Mailer バージョン0.5.8を公開しました。

* [CSV Mailer メール一斉送信ソフト][1]

今回のバージョンアップでは次の変更を行いました。

* 送信するメールのヘッダを修正しました。

CSV Mailerは、CSVのデータをメールに差し込んで送信することができるメール一斉送信ソフトです。  
データの差し込みの自由度が高く、半角カナを全角に変換する機能など差し込み時のデータ変換の機能もあります。  
「POP before SMTP」や「SMTP認証(SMTP Authentication)」にも対応しています。Gmailにも対応しています。

ご意見、ご感想、ご要望をお待ちしています。

[1]: http://www.yamamototakashi.com/soft/csvmailer/ &quot;CSV Mailer メール一斉送信ソフト&quot;</description>
         <link>http://www.gesource.jp/weblog/archives/2009/09/csv_mailer_058.html</link>
         <guid>http://www.gesource.jp/weblog/archives/2009/09/csv_mailer_058.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">CSV Mailer</category>
        
        
         <pubDate>Fri, 25 Sep 2009 09:17:17 +0900</pubDate>
      </item>
            <item>
         <title>文字コードがJISやEUC-JPの文字列をUnicodeStringに変換したときの波ダッシュ問題</title>
         <description>UnicodeStringをJISやEUC-JPに変換するときの波ダッシュ問題は、
[MECSUtils][1]の[MecsMappingFixJA関数][2]を使うことで解決します。

逆にJISやEUC-JPの文字列をUnicodeStringに変換したときの波ダッシュ問題を解決するための関数として、
[MecsMappingFixJA][2]の逆の処理をする関数があると便利だと思います。

処理は単純に[MecsMappingFixJA][2]の反対の変換を行えば良さそうでした。

JISやEUC-JPの文字列をUnicodeStringに変換した後、この関数を使用します。

    UnicodeString uni = Mecsutils::AnsiToUTF16(raw, CodePage);
    uni = Mecsutils::MecsMappingFixJA2(uni);

[MECSUtils][1]に次の関数を追加します。

    //JISやEUC-JPをUnicodeStringに変換したときの波ダッシュ問題を解決する関数
    function MecsMappingFixJA2(const S: UnicodeString): UnicodeString; overload;
    var
      i: Integer;
    begin
      result := S;
      for i:=1 to Length(result) do
        case result[i] of
          #$2016:
            result[i] := #$2225;
          #$2212:
            result[i] := #$FF0D;
          #$301C:
            result[i] := #$FF5E;
          #$00A2:
            result[i] := #$FFE0;
          #$00A3:
            result[i] := #$FFE1;
          #$00AC:
            result[i] := #$FFE2;
        end;
    end;

関数名はもう少し工夫した方がいいでしょう。

追記：  
[MECSUtils][1] 1.33で導入していただきました。  
[UnicodeStringの波ダッシュ問題の回避策のまとめ][3]をご覧下さい。

[1]: http://cc.embarcadero.com/item/26061
[3]: http://www.gesource.jp/weblog/archives/2009/09/unicodestring.html
[2]: http://homepage1.nifty.com/ht_deko/tech021.html#MecsMappingFixJA
</description>
         <link>http://www.gesource.jp/weblog/archives/2009/09/jiseucjpunicodestring.html</link>
         <guid>http://www.gesource.jp/weblog/archives/2009/09/jiseucjpunicodestring.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">C++Builder</category>
        
        
         <pubDate>Thu, 24 Sep 2009 20:46:40 +0900</pubDate>
      </item>
            <item>
         <title>小規模なWebアプリにCodeIgniterが向いている理由</title>
         <description><![CDATA[
小規模なWebアプリを作成するのに、CodeIgniterを使用しました。  
以前にも同じようなことを書いたような気もしますが、
CodeIgniterはやっぱり偉い。  

小規模なWebアプリにCodeIgniterが向いている理由

* インストールはコピーするだけ  
  小規模アプリなのに、導入コストが高いなんてあり得ない。

* 安価なレンタルサーバでも動作可能  
  小規模アプリなので、サーバにお金はかけられない。

* シンプルな作りで学習コストが低い  
  小規模アプリなのに、学習時間が長いと本末転倒

* [充実した日本語マニュアル][0]  
  使い方を学ぶのにお金がかかりません。

* [CodeIgniter日本語化][1]で日本語環境にも完全対応  
  安心して使えます。

* 充実した[バリデーション機能][2]  
  とても便利。開発効率もいい。

* 付属の[ユニットテスト][3]は簡易だが必要十分  
  ただし、大規模アプリには辛いかも。

以下、備忘録

[バリデーション機能][2]は[CodeIgniter日本語化][1]を導入すると、エラーメッセージが日本語になります。  
インストール方法は単純にファイルを上書きするだけ。  
インストール後はconfig.phpを編集して、languageを"japanese"に修正します。

    //$config['language']	= "english";
    $config['language']	= "japanese";

メールの送信も[CodeIgniter日本語化][1]で日本語に対応できるようです。
使い方はとても簡単。詳細はマニュアルの[Email Class][4]を参照。

    $this->load->library('email');
    
    $this->email->from('your@example.com', 'Your Name');
    $this->email->to('someone@example.com');
    $this->email->cc('another@another-example.com');
    $this->email->bcc('them@their-example.com');
    
    $this->email->subject('Email Test');
    $this->email->message('Testing the email class.');
    
    $this->email->send();
    //echo $this->email->print_debugger();

[バリデーション][2]は便利。使わないと損。  
$this->validation->set\_error\_delimiters()は、$this->validation->run() の前に行うこと。

<iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&bc1=FFFFFF&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=gesource-22&o=9&p=8&l=as1&m=amazon&f=ifr&md=1X69VDGQCMF7Z30FM082&asins=4798116769" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>

[0]: http://codeigniter.jp/user_guide_ja/toc.html "CodeIgniter ユーザガイド 日本語版"
[1]: http://sourceforge.jp/projects/codeigniter/ "CodeIgniter日本語化"
[2]: http://codeigniter.jp/user_guide_ja/libraries/validation.html "バリデーション機能"
[3]: http://codeigniter.jp/user_guide_ja/libraries/unit_testing.html "ユニットテスト"
[4]: http://codeigniter.com/user_guide/libraries/email.html "Email Class"
]]></description>
         <link>http://www.gesource.jp/weblog/archives/2009/09/webcodeigniter.html</link>
         <guid>http://www.gesource.jp/weblog/archives/2009/09/webcodeigniter.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">PHP</category>
        
        
         <pubDate>Tue, 22 Sep 2009 01:22:49 +0900</pubDate>
      </item>
            <item>
         <title>UnicodeStringからJISコードへの変換時に起こる波ダッシュ問題の回避策</title>
         <description><![CDATA[UnicodeStringをJISコードに変換すると「～」が文字化けします。

    UnicodeString uni = L"10～20";
    AnsiStringT<50220> jis = uni; //=> 「～」が文字化けする

[DEKOさんがこの問題の回避策を作成してくださりました][0]。

* [MECSUtils ver1.30](http://cc.embarcadero.com/item/26061)

MECSUtils ver1.30で導入された[MecsMappingFixJA関数][1]を使うと、
波ダッシュ問題を回避することができます。

    #include "MECSUtils.hpp"

    UnicodeString uni = L"10～20";
    uni = Mecsutils::MecsMappingFixJA(uni);
    AnsiStringT<50220> jis = uni; //=>「10～20」

すばらしい。

ありがとうございました。

追記：  
[MECSUtils][2] 1.33で関数名が変更されました。  
[UnicodeStringの波ダッシュ問題の回避策のまとめ][3]をご覧下さい。

[0]: http://homepage1.nifty.com/ht_deko/ft0909.html#090918
[1]: http://homepage1.nifty.com/ht_deko/tech021.html#MecsMappingFixJA "MecsMappingFixJA 関数"
[2]: http://cc.embarcadero.com/item/26061
[3]: http://www.gesource.jp/weblog/archives/2009/09/unicodestring.html
]]></description>
         <link>http://www.gesource.jp/weblog/archives/2009/09/unicodestringjis.html</link>
         <guid>http://www.gesource.jp/weblog/archives/2009/09/unicodestringjis.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">C++Builder</category>
        
        
         <pubDate>Sat, 19 Sep 2009 14:11:29 +0900</pubDate>
      </item>
            <item>
         <title>Outlook Export Tool 0.0.1公開</title>
         <description>
Outlook Export Tool バージョン0.0.1を公開しました。

* [Outlook Export Tool][1]

Outlook Export Toolは、Outlookのメールを別形式のファイルにエクスポートするソフトウェアです。

Outlookを操作してメール情報を読み取り、eml形式などのOutlookがサポートしていないファイル形式にエクスポートすることができます。

![ソフトウェアのイメージ][3]

[D2][2]のOutlookのメール読み込み機能は、指定したフォルダのメールをすべて読み込みます。  
特定のメールだけD2で処理したい場合、Outlookには汎用的な形式にエクスポートできないため、Outlookのメールを他のメールソフトにエクスポートして、そのメールソフトから汎用的な形式にエクスポートする必要がありました。

[Outlook Export Tool][1]では任意のメールをeml形式にエクスポートできますので、[D2][2]がより使いやすくなると思います。

eml形式のエクスポートはすべての情報を出力するわけではありません。ご注意下さい。  
eml形式では次の情報をエクスポートします。

* From(差出人)
* To(宛先)
* CC
* Date(送信日)
* Subject(件名)
* Importance(重要度)
* Sensitivity(秘密度)
* X-ReceivedTime(受信日)…独自拡張
* 本文
* 添付ファイル

「X-ReceivedTime」は標準のヘッダではありませんが、Outlookから情報を取得することができましたので、独自のヘッダをして出力するようにしました。  

[D2][2]で処理をするには十分な情報があるとおもいます。

皆様のご意見・ご要望をお待ちしています。

[1]: http://www.yamamototakashi.com/soft/outlookexporttool/
[2]: http://www.yamamototakashi.com/soft/d2/index.html
[3]: http://www.yamamototakashi.com/soft/outlookexporttool/image/software_image.gif
</description>
         <link>http://www.gesource.jp/weblog/archives/2009/09/outlook_export_tool_001.html</link>
         <guid>http://www.gesource.jp/weblog/archives/2009/09/outlook_export_tool_001.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">Outlook Export Tool</category>
        
        
         <pubDate>Sat, 19 Sep 2009 00:05:20 +0900</pubDate>
      </item>
            <item>
         <title>D2 バージョン 2.2.9公開</title>
         <description>
[D2 メール自動データベース変換ソフト][1] バージョン 2.2.9を公開しました。

* [D2 メール自動データベース変換ソフトのダウンロード](http://www.yamamototakashi.com/soft/d2/download.html)

今回はOutlookの機能を強化しました。

* Outlookのメールの読み込みを修正しました。
  * 「From:」「To:」「CC:」「BCC:」で送信者の表示名を取得していたところを、メールアドレスも取得するようにしました。
  * ヘッダに「X-ReceivedTime:」でメールの受信日を取得するようにしました。

メールの受信日が取得できるのは面白いと思います。

他にもOutlookのフォルダ選択画面を少しだけ手を加えています。

皆様のご意見、ご要望、バグ報告をお待ちしています。

[1]: http://www.yamamototakashi.com/soft/d2/index.html
</description>
         <link>http://www.gesource.jp/weblog/archives/2009/09/d2_229.html</link>
         <guid>http://www.gesource.jp/weblog/archives/2009/09/d2_229.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">D2</category>
        
        
         <pubDate>Sat, 19 Sep 2009 00:00:42 +0900</pubDate>
      </item>
            <item>
         <title>C++Builder 2010のIndyでメール送信について</title>
         <description><![CDATA[C++Builder 2010のTIdMessageは、プロパティのCharSetとContentTransferEncodingから、適切に文字コードを変換してエンコードしてくれるようになった。  
これによって、[C++Builder 2009のとき][1]のように、ISO-2022-JPに変換したバイト列をUnicodeStringに代入するという奇妙なコードが不要になった。

しかし、これによって新たに問題が生じている。

一つは[Windows 2000におけるWideCharToMultiByte関数の不具合][1]。  
これによって、Windows 2000ではISO-2022-JPに変換した文字は文字化けする。

もう一つは[波ダッシュ問題][2]。  
WideCharToMultiByte関数による変換では波ダッシュ問題が発生する。

この2つの問題は、Win32APIのWideCharToMultiByte関数が原因なので、Indyの不具合とは言えないと思う。

[C++Builder 2009のとき][1]には、プログラム側で文字コードを変換しBase64エンコードをしなければならなかった。  
一方で、プログラム側でこれらの問題に対応する余地があったとも言える。  
C++Builder 2010ではライブラリ側が自動で変換するために、プログラム側では打つ手が見当たらない。

次の問題は、Indyのバグかもしれない。  
プロジェクトオプションで、「実行時パッケージを使って構築」のチェックを外すと、
「ERangeError(メッセージ'範囲チェックエラー)」が送出される。  

最後に問題が発生するサンプルコードを示す。

    std::unique_ptr<TIdMessage> msg(new TIdMessage(NULL));
    msg->CharSet = "ISO-2022-JP";
    msg->ContentTransferEncoding = "base64";
    msg->ContentType = "text/plain; charset=\"ISO-2022-JP\"";
    msg->Subject = L"メールの件名"; //=> Windows2000なら件名が消える
    msg->Body->Text = L"10～20"; //=> ～が文字化けする
    msg->SaveToFile(ChangeFileExt(Application->ExeName, ".eml"), false);

うまい解決策があったら教えて下さい。

[1]: http://www.gesource.jp/programming/bcb/80.html "C++Builder2009とIndy10でメール送信"
[1]: http://www.gesource.jp/weblog/archives/2009/09/windows_2000widechartomultibyteiso-2022-jp.html "Windows 2000でWideCharToMultiByte関数を使うと、ISO-2022-JPのバイト数を間違う"
[2]: http://ja.wikipedia.org/wiki/%E6%B3%A2%E3%83%80%E3%83%83%E3%82%B7%E3%83%A5
]]></description>
         <link>http://www.gesource.jp/weblog/archives/2009/09/cbuilder_2010indy.html</link>
         <guid>http://www.gesource.jp/weblog/archives/2009/09/cbuilder_2010indy.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">C++Builder</category>
        
        
         <pubDate>Thu, 17 Sep 2009 23:35:58 +0900</pubDate>
      </item>
            <item>
         <title>Windows XPでWideCharToMultiByte関数を使い、ISO-2022-JPに変換するときの注意点</title>
         <description><![CDATA[前回の記事「[Windows 2000でWideCharToMultiByte関数を使うと、ISO-2022-JPのバイト数を間違う][1]」では、
Windows 2000におけるWideCharToMultiByte関数の問題を調べました。

今回はWideCharToMultiByte関数のWindows XPでの問題です。

次のようにユニコード文字列をISO-2022-JPに変換した場合、

    AnsiStringT<50220> jis = L"abcあいう";

Windows XPでは変数jisのバイトコードは「abc&lt;ESC&gt;あいう」のようになります。  
&lt;ESC&gt;はエスケープシーケンスを表しています。  
なお、Windows 7では「abc&lt;ESC&gt;あいう&lt;ESC&gt;」のようになります。  
※UnicodeStringからAnsiStringTへの変換は、内部でWideCharToMultiByte関数を使用しています。

これが問題になるのは次のようなコードの時です。

    AnsiStringT<50220> jis = L"abcあいう";
    AnsiStringT<50220> jis2 = jis + jis;

Windows XPでは変数jis2のバイトコードは「abc&lt;ESC&gt;あいうabc&lt;ESC&gt;あいう」のようになってしまいます。  
「あいうabc」の間に&lt;ESC&gt;がないため、文字化けが発生します。

なお、Windows 7では「abc&lt;ESC&gt;あいう&lt;ESC&gt;abc&lt;ESC&gt;あいう&lt;ESC&gt;」となり問題は発生しません。

Windows XPでも、WideCharToMultiByte関数を使ってISO-2022-JPに変換するときには注意が必要です。


今回のコードは、C++Builder2010で確認しました。

[1]: http://www.gesource.jp/weblog/archives/2009/09/windows_2000widechartomultibyteiso-2022-jp.html
]]></description>
         <link>http://www.gesource.jp/weblog/archives/2009/09/windows_xpwidechartomultibytei.html</link>
         <guid>http://www.gesource.jp/weblog/archives/2009/09/windows_xpwidechartomultibytei.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">C++Builder</category>
        
        
         <pubDate>Wed, 16 Sep 2009 18:53:48 +0900</pubDate>
      </item>
            <item>
         <title>Windows 2000でWideCharToMultiByte関数を使うと、ISO-2022-JPのバイト数を間違う</title>
         <description><![CDATA[
前回の[UnicodeStringをJIS(ISO-2022-JP)に変換すると文字が減る][1]の続き。

UnicodeStringをJISコードに変換すると文字が減るという問題です。

    AnsiStringT<50220> jis1 = L"文字コード"; //=> 文字コ

Windows 2000におけるWin32APIのWideCharToMultiByte関数の動作がおかしいようです。  
WideCharToMultiByte関数は、ISO-2022-JPに変換したときの正しいバイト数を返しません。

なお、Windows XP以降では問題ありませんでした。

次のソースコードは、ユニコード文字列をJIS(ISO-2022-JP)コードに変換したときのバイト数を取得する処理です。

    const int codepage = 50220;
    UnicodeString WCharSource = L"abcテスト";
    int SrcChars = WCharSource.Length();
    int DestBytes = WideCharToMultiByte(codepage, 0, WCharSource.c_str(), SrcChars, NULL, 0, NULL, NULL);

WideCharToMultiByte関数は、変換後の文字列を受け取るために必要なバッファのサイズ（バイト数）を返します。

上のコードでは12バイト必要ですが、この関数は「9」を返します。3バイト足りません。

3バイトというと、エスケープシーケンスが思い当たります。  
JISコードではエスケープシーケンスを用いて、文字集合を切り替えます。

エスケープシーケンスの計算が正しいか試してみました。

    const int codepage = 50222;
    UnicodeString WCharSource = L"abcテストabc";
    int SrcChars = WCharSource.Length();
    int DestBytes = WideCharToMultiByte(codepage, 0, WCharSource.c_str(), SrcChars, NULL, 0, NULL, NULL);

WideCharToMultiByte関数は「12」を返します。6バイト足りません。

    const int codepage = 50220;
    UnicodeString WCharSource = L"abcテストabcテスト";
    int SrcChars = WCharSource.Length();
    int DestBytes = WideCharToMultiByte(codepage, 0, WCharSource.c_str(), SrcChars, NULL, 0, NULL, NULL);

WideCharToMultiByte関数は「18」を返します。9バイト足りません。  
やはりエスケープシーケンスが考慮されていないようです。

原因がわかりましたので、対策も簡単です。  
Windows2000でISO-2022-JPに変換するときはバッファを多めにとればいいのです。

さて、問題のUnicodeStringからAnsiStringT<50220>への変換ですが、
System.pasの_LStrFromPWCharLen関数かCharFromWChar関数で、
文字のバイト数を取得するときに、
OSがWindows2000かつコードページが50220ならば、
バッファのバイト数を増やして文字を取得し、取得後に不要な部分を切り捨てればいいと思います。  
とても汚いコードになりそうです。

調べてみると、同じような問題に遭遇している方がいらっしゃいました。  
「[komatの古往今来: ALM2Thunderbird 1.0の動作OSについて][2]」では、Windows 2000環境で変換に失敗するという問題に遭遇されています。  
「Windows API関数のWideCharToMultiByteとMultiByteToWideCharの動作に問題がある」とありますが、おそらく同じ問題でしょう。

[1]: http://www.gesource.jp/weblog/archives/2009/09/unicodestringjisiso2022jp.html
[2]: http://r0.komat.info/2005/03/alm2thunderbird_1.html
]]></description>
         <link>http://www.gesource.jp/weblog/archives/2009/09/windows_2000widechartomultibyteiso-2022-jp.html</link>
         <guid>http://www.gesource.jp/weblog/archives/2009/09/windows_2000widechartomultibyteiso-2022-jp.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">C++Builder</category>
        
        
         <pubDate>Tue, 15 Sep 2009 21:07:54 +0900</pubDate>
      </item>
            <item>
         <title>UnicodeStringをJIS(ISO-2022-JP)に変換すると文字が減る</title>
         <description><![CDATA[C++Builder 2009で確認したところ、UnicodeStringをJISコードに変換すると文字が減るようだ。

    //UTF-8
    AnsiStringT<65001> utf8 = L"文字コード"; //=> 文字コード

    //Shift_JIS
    AnsiStringT<932> sjis = L"文字コード"; //=> 文字コード

    //EUC_JP
    AnsiStringT<20932> euc = L"文字コード"; //=> 文字コード

    //x-mac-japanese
    AnsiStringT<10001> mac = L"文字コード"; //=> 文字コード

    //JISコードの時は文字が減る
    //iso-2022-jp(JIS)
    AnsiStringT<50220> jis1 = L"文字コード"; //=> 文字コ

    //csISO2022JP (JIS 1 バイト カタカナ可)
    AnsiStringT<50220> jis2 = L"文字コード"; //=> 文字コ

    //iso-2022-jp (JIS 1 バイト カタカナ可 - SO/SI)
    AnsiStringT<50220> jis3 = L"文字コード"; //=> 文字コ

どうやらマルチバイト文字が混ざると問題になるみたい。

    AnsiStringT<50220> jis1 = L"12345";
    UnicodeString s1 = jis1; //12345

    AnsiStringT<50220> jis2 = L"abc";
    UnicodeString s2 = jis2; //abc

    AnsiStringT<50220> jis3 = L"あいう";
    UnicodeString s3 = jis3; //あ

もう少し調べてみたい。

追記  
C++Builder 2009で確認しました。]]></description>
         <link>http://www.gesource.jp/weblog/archives/2009/09/unicodestringjisiso2022jp.html</link>
         <guid>http://www.gesource.jp/weblog/archives/2009/09/unicodestringjisiso2022jp.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">C++Builder</category>
        
        
         <pubDate>Fri, 11 Sep 2009 23:55:32 +0900</pubDate>
      </item>
            <item>
         <title>CSV Mailer バージョン0.5.7を公開しました。</title>
         <description>CSV Mailer バージョン0.5.7を公開しました。

* [CSV Mailer メール一斉送信ソフト][1]

今回のバージョンアップでは、ご要望をいただいたパスワードを暗号化して保存する機能を実装しました。

* 変更点
  * POPサーバのパスワードとSMTP認証のパスワードを暗号化して保存するようにしました。
  * メールサーバ設定画面の不具合を修正しました。

バージョン0.5.7で作成した設定ファイルを、古いバージョンのCSV Mailerで開くと、パスワードを正しく読み込めませんので、ご注意下さい。

ご意見、ご感想、ご要望をお待ちしています。

[1]: http://www.yamamototakashi.com/soft/csvmailer/ &quot;CSV Mailer メール一斉送信ソフト&quot;
</description>
         <link>http://www.gesource.jp/weblog/archives/2009/09/csv_mailer_057.html</link>
         <guid>http://www.gesource.jp/weblog/archives/2009/09/csv_mailer_057.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">CSV Mailer</category>
        
        
         <pubDate>Fri, 11 Sep 2009 09:41:37 +0900</pubDate>
      </item>
            <item>
         <title>初期費用0円、月額料金0円のインターネットFAXサービス</title>
         <description>
先日、久しぶりにFAXを送りました。  
データをプリンタで印刷して、コンビニに行って、50円でFAXを送信。  
送信費も高いと感じましたが、それ以上に費やした時間がもったいない。

インターネットFAXなら、パソコンから直接FAXを送信することができます。

FAXを利用する機会が少ないことから、インターネットを使ったFAX送信サービスを
「初期費用0円、月額料金0円」のサービスに限定して、調べてみました。

* [PamFax](http://www.gol.com/biz/pamfax/)

  * 初期費用 0円
  * 月額料金 0円
  * 送信料金/枚 11.7円

  他のサービスと比較しても、とにかく安い。  
  月々513.52円のプロフェッショナルプランに加入するとFAXの受信もできる。  
  今回調べた中では一番良さそう。

* [BIGLOBE FAX配信サービス](http://email.biglobe.ne.jp/fax/read.html)

  * 初期費用 0円
  * 月額料金 0円
  * 送信料金/枚 42円

  BIGLOBEサービス会員限定だが、初期費用・月額基本料無料の[BIGLOBEコンテンツサービス][1]を利用すると、BIGLOBE以外のプロバイダを使用していても利用可能。

* [e-ネコWebFAX](http://www.nekonet.co.jp/service/network/webfax_index.html)

  * 初期費用 0円
  * 月額料金 0円
  * 送信料金/枚 昼間25.2円、夜間18.9円

  法人契約のみ。

[1]: https://signup.sso.biglobe.ne.jp/cgi-bin/np/page.cgi/introduction/cont?scode=BPS053 &quot;BIGLOBEコンテンツサービス&quot;
</description>
         <link>http://www.gesource.jp/weblog/archives/2009/09/00fax.html</link>
         <guid>http://www.gesource.jp/weblog/archives/2009/09/00fax.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">その他</category>
        
        
         <pubDate>Thu, 10 Sep 2009 11:11:53 +0900</pubDate>
      </item>
      
   </channel>
</rss>

