1

これは、Kohana3バリデータールールで私が見つけたものです。

public static function digit($str, $utf8 = FALSE)
{
    if ($utf8 === TRUE)
    {
        return (bool) preg_match('/^\pN++$/uD', $str);
    }
    else
    {
        return (is_int($str) AND $str >= 0) OR ctype_digit($str);
    }
}

$utf8誰かがパラメータをとして渡すときに例を挙げて、異なる結果を与えることができますかtruefalse正確には-の誤検知$utf8 == false)?

私が覚えていることから、数字はASCIIセーフな文字であり、utf-8文字のどれもそれらと混同されることはありません。

PS:さらに詳細-このチェックをだまして、UTF-8では数字のようには見えないが、次のようにチェックに合格するものに合格することは可能ですか?$utf-8 == false

4

3 に答える 3

3

0〜9はASCIIで安全ですが、Unicodeには他にもたくさんの数字があります。

リストについては、「数値、10進数」カテゴリのUnicode文字を 参照してください。いくつかの例は、U + 0660 ARABIC-INDIC DIGIT ZERO(٠)およびU + 1D7EC MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO()です。

于 2012-11-08T22:42:22.673 に答える
2

2番目の質問の部分にもう少しアルコールを与えました。私の結論は、UTF-8シーケンスでASCII数字を非表示にすることはできないということです。数字は0x30..0x39またはビット範囲00110000....である必要があり00110110ます00111001

UTF-8エンコーディングには、次のようなプレフィックスが含まれます

 11110xxx  10xxxxxx  10xxxxxx

したがって、数字のASCII表現はどこにも一致しません。

 00110000 
 ▲▲        00110000  ▼
           ▲         00110000

したがって、Latin-1 / ASCIIモードで一致することは不可能ですが、モードでも\pN満足してい/uます。もちろん、無効なエンコーディングは無視します。

于 2012-11-08T23:22:39.463 に答える
1
  1. エーゲ海の数

  2. 古代ギリシャ数字

...等。

于 2012-11-08T22:53:38.023 に答える