2016-12-12 3 views
0

現在ユニコード文字列の正規表現を使用していますが、ASCII文字と一致させるだけですべてのユニコード文字を無視し、regex.hの関数はうまく動作しますlinuxので、エンコーディングはutf8です)。しかし、誰かがそのようにするのが本当にOKかどうかを確認できますか?または、ユニコードで正規表現ライブラリが必要ですか(ICUのように)正規表現をC言語のユニコード文字列で使用しています

+2

UTF-8は、非ASCII文字をASCII文字と決して符合しないようにエンコードします。そのため、すべての文字を検索または照合すると安全です。もちろん、私が言ったように、誰かが私が間違っていると言って来るだろう - 私は反例を歓迎する。 –

答えて

2

UTF-8 is a variable length encoding;いくつかの文字は1バイト、いくつかは2、その他のものは3または4です。今では、各文字の接頭辞によって読み込むバイト数が分かります。 1バイトは0、2バイトは110、3バイトは1110、4バイトは11110である。

UTF-8文字列をASCIIや他の固定幅のコードとして読み取ろうとすると、物事は非常に間違っています... UTF-8文字列には1バイト文字だけが含まれていなければASCII。

しかし UTF-8にはバイトはNULLバイトが含まれていない、と余分なバイトはいずれもASCIIと混同することはできない、とあなたが本当に唯一のASCIIに一致している場合、あなたを取得することができるかもしれませんので、 POSIXよりも優れた正規表現オプションがあるので、使い方が簡単で、後で取り上げるためにコードに隠されたエンコード爆弾を残すのはなぜですか?代わりに、Perl Compatible Regular Expressions(PCRE)のようなUnicode対応の正規表現ライブラリを使用してください。 フラグをpcre2_compileに渡すことにより、PCRE is Unicode awareに変更します。 PCRE正規表現構文はPOSIX正規表現よりも強力で広く理解されており、PCREはより多くの機能を備えています。 PCRE comes with Gnome Libそれ自体は非常に便利なCの機能の饗宴を提供します。

+0

私はユニコードになると単なる初心者です。可能であれば外部ライブラリを使用しないほうがいいですから、そのライブラリを使用する方法があるのだろうかと思います。とにかく、私はあなたのアドバイスのおかげで、PCREを試してみましょう。 – AtheS21

+0

@ AtheS21標準Cは、Unicodeサポートの方法ではあまりありません。それは多くのことの方法の多くを持っていません。 1つずつビットを引っ張るのではなく、Gnome Libや欠けている部分をすべて補う他のサードパーティのライブラリを調べることをおすすめします。 – Schwern

関連する問題