LoginSignup
3
7

More than 1 year has passed since last update.

文字列の全角・半角変換

Last updated at Posted at 2021-09-13

全角文字を半角にしたい。

C#でコーディングしている同僚から、

全角から半角に変換したいんだけど、調べても「Microsoft.VisualBasic.dllを追加してStrConvを使え」というのばかり。C#で作ってるのにVisualBasicを使うのはなんか違和感

と。
うん。答え出てるよね。
その変な違和感なんて捨てちゃってStrConvを使えばええやん。こんな感じやん。

Strings.StrConv(testStr, VbStrConv.Narrow, 0);




・・・と思いつつ、なんか方法ないかな?と調べてみたら

いいのあるよね。(@tricogimmickさん ありがとう)

と思ったのもつかの間、

同僚: 濁音、半濁音が混ざると文字が欠けるんだよねー



・・・・何言ってんだ??欠けるわけないやん・・・・
image.png
ほんまや!・・・いや、だから素直にStrConvをと・・・(笑

と思いつつ私なりの改変を施した。

改変

// 文字列を変換する
public static string StringConvert(this string str, dwMapFlags flags)
{
    var ci = System.Globalization.CultureInfo.CurrentCulture;
    // すべての文字が濁音or半濁音かもしれないので2倍化
    string result = new string(' ', str.Length * 2);
    LCMapStringW(ci.LCID, (uint)flags, str, str.Length, result, result.Length);
    return result.TrimEnd();
}

・なんとなーく直感で、str.Length分の文字数しか返ってこないのでおかしいのかなー
  → 2倍化してみるか
・なんとなーくTrimEnd()で締めくくろうか(なんか要らんかもしれんけど)

というテンションで改変(笑)

結果

image.png

うん。できたね。
もっとスマートな方法があるかもしれないし、この方法は実は違っている可能性もあるけれども、
要件はクリアしたので今回は良しとしよう。

改善

いただいたコメント、および「?」と思ったところがあったので書き換えました。
string.EndTrim(); だと、元の文字列が"あいうえお "などのように末尾にスペースがある場合におかしくなったんだよなぁ・・・

/// <summary>
/// 文字列を変換する
/// </summary>
/// <param name="str"></param>
/// <param name="flags"></param>
/// <returns></returns>
public static string StringConvert(this string str, dwMapFlags flags)
{
    var ci = System.Globalization.CultureInfo.CurrentCulture;
    // すべてが濁音 or 半濁音かもしれないので2倍化しておく
    string result = new string(' ', str.Length * 2);
    // resultCount に変換後の文字数が格納される
    int resultCount = LCMapStringW(ci.LCID, (uint)flags, str, str.Length, result, result.Length);

    // 変換後の文字数分だけ返却
    return resultCount > 0 ?
        result.Substring(0, resultCount) :
        result;
}


実行結果が以下
image.png

いい感じかな?(だといいな)

3
7
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
7