|
分類:[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; }
|