全角文字を半角にしたい。
C#でコーディングしている同僚から、
全角から半角に変換したいんだけど、調べても「
Microsoft.VisualBasic.dll
を追加してStrConv
を使え」というのばかり。C#で作ってるのにVisualBasicを使うのはなんか違和感
と。
うん。答え出てるよね。
その変な違和感なんて捨てちゃってStrConv
を使えばええやん。こんな感じやん。
Strings.StrConv(testStr, VbStrConv.Narrow, 0);
・・・と思いつつ、なんか方法ないかな?と調べてみたら
いいのあるよね。(@tricogimmickさん ありがとう)
と思ったのもつかの間、
同僚: 濁音、半濁音が混ざると文字が欠けるんだよねー
・・・・何言ってんだ??欠けるわけないやん・・・・ ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1909386/5993b739-49d0-8d48-988b-7eee6450309f.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()
で締めくくろうか(なんか要らんかもしれんけど)
というテンションで改変(笑)
うん。できたね。
もっとスマートな方法があるかもしれないし、この方法は実は違っている可能性もあるけれども、
要件はクリアしたので今回は良しとしよう。
改善
いただいたコメント、および「?」と思ったところがあったので書き換えました。
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;
}
いい感じかな?(だといいな)