C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: 全角文字と半角文字を半角スペースで区分する


(過去ログ 171 を表示中)

[トピック内 2 記事 (1 - 2 表示)]  << 0 >>

■98363 / inTopicNo.1)  全角文字と半角文字を半角スペースで区分する
  
□投稿者/ 星は昴 (14回)-(2021/11/06(Sat) 13:55:40)

分類:[C#] 

 以下 の string InsertHankSpace(string s) は等幅フォントで表示された日本語と半角英数字が混じった文字列に対して、全角文字と半角文字の間に半角スペースを挿入することを目的にしたメソッドです。ただし全角の '。' や '、' などは例外とします。具体的な例を示すと(意図的に変な文章になっています)

M高校の男女比は男25%、女75%です。男子生徒の80%、90%の女子生徒が進学します。
        ↓
M 高校の男女比は男 25%、女 75% です。男子生徒の 80%、90% の女子生徒が進学します。

のように変形するのが目的ですが、現状では

M 高校の男女比は男 25% 、女 75% です。男子生徒の 80% 、 90% の女子生徒が進学します。

のように半角の '%' と全角の '、' の間と'、'と'9'の間にスペースが挿入されてしまいます。つまり
  private bool IsZmap(char c)
の効果がまったくありません。これを解決するにはどうしたらいいでしょうか?

private Encoding sf_enc = Encoding.GetEncoding("Shift_JIS"); //やむなく

private string InsertHankSpace(string s)
{
  var sb = new StringBuilder();
  bool prev = IsNarrow(s[0]);
  sb.Append(s[0]);
  int index = 1;
  while (index < s.Length)
  {
    bool current = IsNarrow(s[index]);
    if ( !(IsZmap(s[index])) )
    {
      if (prev != current)
      {
        sb.Append(" ");
        prev = current;
      }
    }
    sb.Append(s[index]);
    index++;
  }
  return sb.ToString();
}

private bool IsNarrow(char c)
{
  char[] buff = new char[1];
  buff[0] = c;
  if (sf_enc.GetByteCount(buff) == 1)
  {
    return true;
  }
  return false;
}

//例外となる全角文字
private bool IsZmap(char c)
{
  char[] zmap = new char[] { ' ', '。', '”', '゛', '゜', '´', '(', ')', '〔', '〕' };
  foreach (char zc in zmap)
  {
    if (zc == c) return true;
  }
  return false;
}

引用返信 編集キー/
■98364 / inTopicNo.2)  Re[1]: 全角文字と半角文字を半角スペースで区分する
□投稿者/ 星は昴 (15回)-(2021/11/06(Sat) 16:00:20)
No98363 (星は昴 さん) に返信
コードにおかしいところがありました。見直してもう一度改めて質問させていただきます。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -