Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9763

C# の Trim メソッドで取り除かれる「空白」文字は具体的に何なのか

$
0
0

string.Trimメソッドとは

C# string.Trimメソッドは文字列の前後の「空白」を削除するメソッドです。

.NET の文字列からの文字のトリミングと削除

単語の両端に空白(空白とも呼ばれます)が含まれる単語になってしまう可能性があります。

String.Trim Method

文字列の最初と最後から、文字の配列で指定された空白または文字を削除します。

ただ、一口に「空白」といっても半角スペース・全角スペース・タブ、改行コード...などさまざま空白が存在します。

取り除かれる「空白」は具体的にどの文字を指しているのか?

string.Trimメソッドで取り除かれる「空白」はChar.IsWhiteSpaceにマッチする文字を指します。

空白文字は Unicode 標準で定義されています。この Trim メソッドは true、Char.IsWhiteSpace メソッドに渡されたときの戻り値を生成する先頭と末尾の文字をすべて削除します。

Char.IsWhiteSpaceがマッチする文字は下記の通りです。

  • Members of the UnicodeCategory.SpaceSeparator category, which includes the characters SPACE (U+0020), NO-BREAK SPACE (U+00A0), OGHAM SPACE MARK (U+1680), EN QUAD (U+2000), EM QUAD (U+2001), EN SPACE (U+2002), EM SPACE (U+2003), THREE-PER-EM SPACE (U+2004), FOUR-PER-EM SPACE (U+2005), SIX-PER-EM SPACE (U+2006), FIGURE SPACE (U+2007), PUNCTUATION SPACE (U+2008), THIN SPACE (U+2009), HAIR SPACE (U+200A), NARROW NO-BREAK SPACE (U+202F), MEDIUM MATHEMATICAL SPACE (U+205F), and IDEOGRAPHIC SPACE (U+3000).
  • Members of the UnicodeCategory.LineSeparator category, which consists solely of the LINE SEPARATOR character (U+2028).
  • Members of the UnicodeCategory.ParagraphSeparator category, which consists solely of the PARAGRAPH SEPARATOR character (U+2029).
  • The characters CHARACTER TABULATION (U+0009), LINE FEED (U+000A), LINE TABULATION (U+000B), FORM FEED (U+000C), CARRIAGE RETURN (U+000D), and NEXT LINE (U+0085).

なぜ調査したのか

ここからは補足で、なぜ上記の調査をしたか記述いたします。

見た目上問題ないのに電話番号がエラー

外部から連携される電話番号が問題ないように見えるのに正規表現にマッチせずバリデーションエラーになっていました。

電話番号の文字列の先頭でカーソルキーが滑るので、先頭にゼロ幅スペース(Zero Width Space U+200B)があると考えました。

ゼロ幅スペース | Unicode キャラクター図鑑

ただ、string.Trimしてもエラーが出続けました。

※※この時点ではU+200Bstring.Trimで取り除かれる対象だと勘違いしていました。※※

そこで、具体的に「空白」判定される文字(char)は何なのか調べることにしました。

電話番号のエラーの原因はなんだったのか

電話番号の文字列の Unicode を確認しました。

すると先頭に双方向テキストの「左から右への埋め込み」(Left-To-Right Embedding U+202A)というものが付いていました。

左から右への埋め込み | Unicode キャラクター図鑑

string.TrimにはChar型の配列を引数に取るオーバーロードもあります。

U+202Aも取り除くようにして最終的に解決しました。

phoneNumber=phoneNumber.Trim().Trim(new[]{'U+202A'})

Char型の配列を引数に取るオーバーロードメソッドは「空白」のトリム処理は行われないのでTrimを2度呼び出しています。


Viewing all articles
Browse latest Browse all 9763

Trending Articles