2016-06-25 5 views
1

私はisspace()がASCIIで動作することを意図していますが、私はUTF-8テキストを持っています。 isspace()がUTF-8とASCIIが重複する下位7ビットのみを検索する場合は、安全に使用する必要があります。UTF-8テキストのfalse positivesをisspace()に与えることはできますか?

安全に使うと、空白文字ではない空白文字であるUnicode文字は検出されません。私はそれが検出されない特別なUnicode空白があるかもしれないことを知っていますが、それは私には問題ではありません。

I.e.私は肯定的なものがない限り、偽陰性でOKです。それを仮定するのは正しいですか?

+1

は 'space'はASCIIが最も一般的ですが、何によってのみ例がないことを意味しているのいずれかの固定幅のシングルバイト文字セット、のために働くことを意図しているです。 ASCIIではない文字セットを使用するシステムでは、ASCIIではなく、その文字セットに対して適切な回答が得られます。 –

+0

@PeteBecker最近の非ASCIIシステムはありますか?私はEBCDICについて聞いたことがあるが、私が理解する限り、これらは非常に古くからものが標準化されていない時代からのものである。 – sashoalm

+0

間違った質問。すべての世界がASCIIであるという視点に基づいて設計とコーディングの決定を下すのであれば、それを正当化する方が良いでしょう。それ以外は工学的なものではありません。 –

答えて

1

isspace()は、実行時に空白文字のロケール定義の対象となります。

Cでは、空白文字は、setlocale(LC_ALL)またはsetlocale(LC_CTYPE)の呼び出しで指定されたロケールによって定義されます。 <cctype>ヘッダからstd::isspace()のバージョンを使用する場合、

  1. std::setlocale(LC_ALL)又はstd::setlocale(LC_CTYPE)への呼び出しを:C++で

    は、空白文字がいずれかによって指定されたロケールによって定義されます。

  2. 入力localeパラメータ、std::isspace()のバージョンを<locale>ヘッダーから使用する場合。

使用デフォルトロケールは、UTF-8およびASCIIで同じである次の空白文字を定義"C"ロケール、であり、ASCII互換であることができるが、最もロケール他のロケールで異なる:

 
' ' (0x20) space (SPC) 
'\t' (0x09) horizontal tab (TAB) 
'\n' (0x0a) newline (LF) 
'\v' (0x0b) vertical tab (VT) 
'\f' (0x0c) feed (FF) 
'\r' (0x0d) carriage return (CR) 
2

0127の間のコードポイントについては、ASCIIutf-8の間に全く違いがないので、おそらく安全かもしれません。

+2

EBCDICとutf-8の間には大きな違いがあり、EBCDICをネイティブエンコーディングとして使用するシステム上の 'isspace'は、ASCIIまたはutf-8のいずれかの意味を持つ回答を与えません。 –

+0

isspace()は127以上のものをチェックしていますか?それは私が確信していなかった部分でした。 – sashoalm

+0

[こちら](https://www.cs.tut.fi/~jkorpela/chars/spaces.html)を確認してください。 'U + FEFF'以外のすべてに対して' True'を返します。 – shiva

関連する問題