[C#]文字列整形関数

.Netframework 3.0 以降でなるだけ国・地域に依存しない感じで、文字の整形関数を考えてみた。
というのも、もともと用意されているPadLeftなどでは日本語の全角文字を使用するとずれてしまう。
ここでめんどくさいのが文字数と文字コードのバイト数ともに文字の表示数と一致しないこと。

全角文字はよく2バイト文字といわれていたが、Unicodeではそうならない。
表示上2バイト分(全角)でも、バイト数は3バイトとか4バイトも存在する。
もちろん、文字数でカウントしても全角文字は1文字として検出される。
つまり、3バイトの全角文字1文字をPadLeftで整形しようとしたときにめんどくささに気づくわけだ。

で、強引な方法で実装してみたのでメモ。
実際は、半角か全角かを検出できればいいから画面から取得なんて強引なことをしなくてもできそう。
でも、気がついた時にはすでに組み終わってたので、改良された方はトラックバックとかお願いします・・・。


//書式整形に使用するフォント
public Font fixedPitchFont;

public setFixedPitchFont()
{
    //書式整形に使用するフォントをユーザー環境に合わせて切り替える
    System.Globalization.CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentCulture;
    if (ci.TextInfo.LCID == 1041)
    {
   	 //日本
   	 fixedPitchFont = new Font("MS ゴシック", SystemFonts.DefaultFont.SizeInPoints);
    }
    else
    {
   	 //その他("Courier New":マルチバイト時にずれる)
   	 fixedPitchFont = new Font(FontFamily.GenericMonospace, SystemFonts.DefaultFont.SizeInPoints);
    }
}

private void GetFontPitch()
{
    //描画サイズから1文字表示分の幅を取得する
    // 1. DPIから求める
    {
   	 //解像度の取得
   	 Font font20pixel = new Font(FontFamily.GenericMonospace, 20, GraphicsUnit.Pixel);
   	 int dpi = (int)Math.Round((72 * font20pixel.Size) / font20pixel.SizeInPoints);

   	 //固定幅はWidth:Height=1:2で作成されていることを前提として
   	 fixedPitchFontHeight = (int)Math.Ceiling(fixedPitchFont.SizeInPoints * dpi / 72);
   	 fixedPitchFontWidth = fixedPitchFontHeight / 2;
    }
    // 2. 念のため、描画してみた大きさから求めたものと比較する
    {
   	 //適当な大きさで描画用Bmpを作成(メインディスプレイの大きさで作成)
   	 Bitmap bmp = new Bitmap(Screen.PrimaryScreen.WorkingArea.Width, Screen.PrimaryScreen.WorkingArea.Height);
   	 try
   	 {
   		 Graphics g = Graphics.FromImage(bmp);
   		 Size Size1word = TextRenderer.MeasureText(g, " ", fixedPitchFont);  //半角(1Word)
   		 Size Size2word = TextRenderer.MeasureText(g, "m1", fixedPitchFont); //全角(マルチバイト文字も表示上2Word)

   		 int wordWidth = Size2byte.Width - Size1byte.Width;
   		 int wordHeight = Size1byte.Height;

   		 //一致しない場合は固定幅フォントではない可能性がある。とりあえず大きい方を使う。
   		 if (fixedPitchFontWidth != wordWidth)
   		 {
   			 fixedPitchFontWidth = Math.Max(fixedPitchFontWidth, wordWidth);
   		 }
   		 if (fixedPitchFontWidth != wordWidth)
   		 {
   			 fixedPitchFontHeight = Math.Max(fixedPitchFontHeight, wordHeight);
   		 }
   	 }
   	 finally
   	 {
   		 bmp.Dispose();
   	 }
    }
}

public int Display1ByteWordCount(string text)
{
    int displayFontWidth;
    
    //適当な大きさで描画用Bmpを作成(メインディスプレイの大きさで作成)
    Bitmap bmp = new Bitmap(Screen.PrimaryScreen.WorkingArea.Width, Screen.PrimaryScreen.WorkingArea.Height);
    Graphics g = Graphics.FromImage(bmp);
    Size stringSize = TextRenderer.MeasureText(g, text, fixedPitchFont);

    //表示に使用したpixelから文字数を逆算する。
    displayFontWidth = stringSize.Width / fixedPitchFontWidth + (int)Math.Round((double)(stringSize.Width % fixedPitchFontWidth) / 10);
    return displayFontWidth;
}

public string PaddingLeft(string text, int totalWidth)
{
    int diff = Display1ByteWordCount(text) - text.Length;
    return text.PadLeft(totalWidth - diff);
}

public string PaddingRight(string text, int totalWidth)
{
    int diff = Display1ByteWordCount(text) - text.Length;
    return text.PadRight(totalWidth - diff);
}

[CGO]CGOptimizer麦茶v1.00β3

CGOptimizer麦茶の開発版を更新しました。

Download(CGOptimizer.zip)

今回の更新は下記のとおりです。

  • Jpeg・PNG関係ツールで同梱可能なものは同梱
  • コントロールの配置修正
  • 内部コードの最適化

暫定対応のため、細かくパラメータ設定ができません。
また、開発版のため、不具合を含んでいる場合がありますので使用時に画像のバックアップを行うようにしてください。

[CGE]CGEffecterおにぎりv1.13β

ながらく開発が止まっていましたがメールを何通かいただいたので、手を加えました。
時間の都合上未テストコードが含まれていますのでベータ版として公開します。

Download(CGEffecter.zip)

今回の更新内容は下記の

  • GIF形式の標準読み込み対応
  • クリップボードへの格納形式をDIBからBitmapに変更
  • 特定のBitmapがうまく開けない不具合に暫定対応
  • 内部文字コードをUTF-8に変更(Windows98/Meで不具合があるかも・・・)

GIFアニメーションには対応しません。
もし、GIFアニメーションを開いた場合先頭画像のみ表示されます。
また、GIF形式の保存は現在未対応です。
その上、画像処理を施すと透過情報がなくなってしまいます。(該当機能未実装のため)

ベータ版のため画像処理を施す場合は画像ファイルのバックアップを必ず行ってください。

[FSIC]FileStructureImageCapture v0.9.0 Beta

FileStructureImageCapture画面
概要
このソフトはファイルのツリー構造を表示及び画像として保存するためのソフトウェアです。
一般的にはあまり使われないかもしれませんが、マニュアル作成時やフロントエンドソフトで
外部DLLを特定の場所に格納してほしい際にこのソフトを利用することで配置イメージを取得できます。
使い方

  • File->Openからツリー構造を表示したいフォルダを選択してください。
  • ScreenShot->GetTreeImageを押下すると、保存ダイアログが表示されます。
  • ダイアログで保存先を選択し、保存名を入力しOKを押下するとツリーイメージが保存されます。

Download

[I2K]IDM2KeePass 1.00

IDM2KeePassの画面

  • 概要
    このソフトウェアはIDMからエクスポートしたXMLファイルを
    KeePass CSV、XML(1.x)、XML(2.x)形式に変換するソフトウェアです。

    IDMことID ManagerはWoodenSoldier氏によって作られた、
    Windows用の優れたIDとパスワードを管理するツールです。
    公式サイト:WoodenSoldier Software

    KeePassことKeePass Password SafeはDominik Reichl氏によって作られた、
    オープンソースで多くのプラットフォームで動作するIDとパスワードを管理するツールです。
    公式サイト:KeePass Password Safe

    KeePass XML(1.x)をインポートする場合、「VariousImport」プラグインを使用してください。
    公式サイト:Plugins – KeePass

  • 使い方
    1. IDMのデータをXML形式でエクスポートしてください
    2. IDM2KeePassを実行してください
    3. 変換したい出力形式を選択してください
    4. [変換]ボタンを押下し、IDMからエクスポートしたXMLを開いてください
    5. 変換に成功すると、保存先を訪ねるダイアログが表示されますので適切なファイル名で保存してください
    6. KeePassを起動し、保存したファイルをインポートしてください
  • Download

[I2K]IDM2KeePass 1.00 RC

IDM2KeePass画面
KeePass XML(1.x)形式への変換を追加しました。
これにより、CSV,XML(1.x),XML(2.x)の全てに対応しました。
あとは、少し使ってみながら不具合がなさそうであれば正式版をKeePassとIDMに報告しVectorに登録します。

RC版のため、不具合が残っている可能性がありますので、ご使用になるときはファイルのバックアップをしておいてください。

Download

[Tool]Gnu On Windows

LinuxやMacOSXなどと比べるとWindowsだけコマンドが違うとかコマンドが足りないとかクロスコンパイル時に困ることもあった。
こういった場合、今まではCygwinを利用したり、用途によってはMSYSで作業していたがCygwinはレジストリの変更などが多くできれば入れたくない。
そこで、見つけたのがGOW。シンプルなコマンド群でCygwinと比べれば簡易的なものだろうけれど、多くの場合において十分使える。

[Tool]exciteメールを保存

昔はよく使っていたexciteメールだけれど、使い勝手からか使わなくなってしまった。
転送メールの設定もできず、保存するのにツールを使用したのでそのメモ。

  • 準備
  • 使用方法
    1. 「Jupiter5」を起動するとセキュリティ警告が表示される場合があるが、通信を行う必要があるので「ブロックを解除する」を選択
      セキュリティ警告
    2. メニュー[設定]->[スクリプト]->[インストール]を選択する
      スクリプトのインストール01
    3. ダウンロードしたExciteメール Ver. 2.12の[Excite_yobane.js]をドラッグする
      スクリプトのインストール02
    4. ドラッグした[Excite_yobane.js]をダイアログにドロップし、スクリプトをインストールする
      スクリプトのインストール03
    5. メニュー[設定]->[アイテムの追加]を選択する
      設定画面01
    6. ユーザIDやパスワード、メールアドレスを入力する
      設定画面02
    7. 設定したアイテムを右クリックし[このアイテムを実行する]を選択し、取得を開始する
      実行画面

[I2K]IDM2KeePass 1.00 Beta1

IDM2KeePass画面
KeePass CSV形式への変換を追加しました。
この機能は、IDM2KeePass.jsと同じものですが、
こちらのほうが、操作が簡単です。
コマンドプロンプトがわからない方はこちらをご利用ください。

Beta版のため、不具合が残っている可能性がありますので、ご使用になるときはファイルのバックアップをしておいてください。
また、Beta1ではKeePass XML(1.x)形式はまだ未実装のため、使用できる機能はCSV,XML(2.x)形式への2機能となります。

Download

WindowsXPセキュリティ設定その2

Windows XPのセキュリティポリシー設定。パスワードは9文字ぐらいまではあっさりと解析できるという結果が出てるみたいなのでそれ以上15文字以上がおすすめ。

  • [スタートメニュー]->[コントロールパネル]->[管理者ツール]を開く
    コントロールパネル
  • [ローカルセキュリティポリシー]を開く
    ローカルセキュリティポリシー
  • [アカウント ポリシー]->[パスワードのポリシー]を開き、下記の設定を行う
    • パスワードの長さ:9文字以上
    • パスワードの有効期間:31日
    • パスワードの履歴を記録する:0 パスワード数
    • パスワードの要求する複雑さを満たす:有効

  • [ローカル ポリシー]->[セキュリティオプション]を開き、下記の設定を行う
    • アカウント:Administrator アカウントの状態:無効
    • アカウント:Guest アカウントの状態:無効
    • 対話型ログオン:最後のユーザー名を表示しない:有効