2016-11-07 6 views
0

パスが別のパスのサブディレクトリであるかどうかを調べるkextがあります。Mac UTF-8で特殊文字とパスを比較する

このすべては、我々はのkextと通信できるヘルパーアプリケーションによってシステムにいくつかの作業パスを養う限り、私たちは私たちのパスに特殊文字を持っていない正常に動作します(のような文字)

私は、このコードに問題を隔離しました:

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char* path = "/Users/user/test/tëst/test"; //Sent by the system 
    char* wp = "/Users/user/test/tëst"; //Some path we claim to be ours 

    size_t wp_len = strlen(wp); 

    if (strncmp (wp,path,wp_len) == 0) //Check is path is a subpath 
    { 
    printf ("matched %s\n", path); 
    }else { 
    printf ("could not match\n"); 

    } 
    return 0; 
} 

私は要旨を作成しましたので、エンコーディングは、ブラウザで失わいかない:https://gist.github.com/fvandepitte/ec28f4321a48061808d0095853af7bd7

誰かが私がチェックすることができる方法を知っていますpathのサブパスがwpの場合、パフォーマンスはあまり低下しません(このコードはカーネルで実行されます)。

+2

https://developer.apple.com/library/content/qa/qa1173/_index.html –

答えて

1

私はブラウザからソース(test.c)に直接コピー&ペーストしました。それは私のためにcould not matchを印刷します。私はodを使用してファイルをダンプした場合

が、これは私が見たものである。

bash-3.2$ od -c test.c              
0000000 # i n c l u d e  < s t d i o . 
0000020 h > \n # i n c l u d e  < s t r 
0000040 i n g . h > \n \n i n t  m a i n 
0000060  ( ) \n { \n   c h a r *  p a 
0000100 t h  =  " / U s e r s / u s e 
0000120 r / t e s t / t ë ** s t / t e s 
0000140 t " ;  // S e n t  b y  t h 
0000160 e  s y s t e m \n   c h a r * 
0000200  w p  =    " / U s e r s / 
0000220 u s e r / t e s t / t e ̈ ** s t 
0000240 " ;  // S o m e  p a t h  w 

お知らせpathのテストはt ë ** s t、 として出てくるが、wpのテストが異なるt e ̈ ** s tとして出てくるということ:したがって、ëeを比較すると、strncmpが失敗します。

私はwpの割り当てに、私はmatched /Users/user/test/tëst/testを得るpathペーストからテストをコピーする場合、そのstrncmpが正常に動作するようです。

私はこれらの2つの文字列がこのように異なることはわかりませんが、私は2つの文字列が何らかの形で異なるエンコーディングを使用していると仮定できます。 strncmp関数は、バイトごとの文字列を比較するので、ëe ̈は異なるとみなされます。 strncmpを使用したい場合、残念ながら、両方の文字列が同じエンコーディングを使用することを保証する以外の方法はありません。私はあなたのgithubのからpathtest.cppをダウンロードした: -

FWIW私は打ち鳴らすバージョンのApple LLVMのバージョン8.0.0(打ち鳴らす-800.0.42.1)

EDITで、MacOSの10.12.1上で実行していますよリンクするだけで、物事を二重にチェックすることができます。私はod -c pathtest.cppを実行して、私は同じ問題を参照してください。

+0

Thxの情報については、@ n.mを参照してください。思い付いた。 – Frederiek

+1

さらに読んで「AHA」の感覚を持っていると、私たちはあらかじめ合成され分解された文字を持っていると言えるでしょう。どういうわけかkextに分解された値を格納しています。私は保存した場所でそれを修正できると思います。 – Frederiek