2013-09-26 17 views
5

ちょうど私はCプログラムでlibunistringを使用しようとしています。 私はUTF-8文字列を処理しましたが、libunistringライブラリのu8_strlen()関数を使用しました。
コード例:libunistring u8_strlen()はstrlen()と同じですか?

void print_length(uint8_t *msg) { 
    printf("Default strlen: %d\n", strlen((char *)msg)); 
    printf("U8 strlen: %d\n", u8_strlen(msg)); 
} 

ただ、我々は(キリル文字、UTF-8エンコーディング)msg = "привет"print_length()を呼び出すことを想像してみてください。 は12(6文字* 1文字あたり2バイト)を返し、 u8_strlen()は6(ちょうど6文字)を返すはずです。

しかし、私は好奇心旺盛な結果受け取った:、

size_t 
u8_strlen (const uint8_t *s) 
{ 
    return strlen ((const char *) s); 
} 

私は思ったんだけど、それはバグですか:私はu8_strlen実現を検索しようとしたが、このコードを見つけたんだ。この後

Default strlen: 12 
U8 strlen: 12 

をそれは正解ですか?それが正しければ、なぜですか?

答えて

7

これは意図した動作だと思います。 s内のユニットの数を返します

size_tのu8_strlen(のconst uint8_tの*秒)

The libunistring manualは、と言っています。

UTF-8文字列、型「uint8_tの*」を介して:

はまた、マニュアルでは、この "単位" は何であるかを定義します。単位はバイト(uint8_t)です。

私は、彼らはそれが標準strlenライブラリもいるだろう(それぞれ、UTF-16とUTF-32文字列のu16_strlenと操作のためのu32_strlenを有していることであるよりも、より多くの何もしないにもかかわらず、機能u8_strlenにラベルを付けた理由を信じて0x0000までの2バイト単位の数をカウントし、0x00000000までの4バイト単位をカウントします)、完全性のためにはu8_strlenが含まれていました。

GNU gnulibは、しかし、おそらく何をしたいんどのmbslenを含まない:

mbslen機能:文字列のマルチバイト文字の数を決定します。

0

ベリーの答えに加えて、私はC標準がcharに8ビット以上あることを認めています。次にstrlen()は、8ビットブロックではなく、charの長さを返すので、u8_strlen()が返す値の分数になります(または返さなければなりません - 明らかに示した実装はうまく動作せず、strlen()と同じ答えを返します) 。