2012-01-07 38 views
1

)ASCIIを扱う場合はstrlen、strcatなどがあります。 UTF16(つまりUCS2)ではwcscatwcslenの関数があります。CのUTF8文字列関数の内容(

UTF8とUCS4を扱う場合、Cで使用できる関数は何ですか? Linux/gccと仮定してください

+1

POSIX OSでは、 'wchar_t'は通常4バイト幅であるため、UCS4を表します。そして:UTF16はUCS2より/ more /です。あなたが望むふるまいは何ですか?グリフの数またはコードポイントの数? – filmor

+0

私はUnicodeのさまざまなエンコーディングを理解しようとしています。 whcar_tは、WindowsではUSC2を表し、LinuxではUSC4を表します(whchar_tはWindowsでは2バイト、linuxでは4バイト)。 UFT8/UTF16ではwchar_cannotを使用できません - そうですか? –

+0

もちろん、それは/ /使用することができます(少なくともWindowsのUTF16では)。しかし、あなたは 'wcslen'などから合理的なデータを得ることはできません。 IMHOあなたは移植可能でなければならないすべてのものに対して 'wchar_t'を離れ、UTF8ヘルパ関数を内部的に使って' std :: string'を使うのがよいでしょう。しかし、これはあなたのユースケースに大きく依存します。 – filmor

答えて

3

標準のCライブラリにはUTF-8の機能はありません。確かにそれのための図書館があります。

しかし、多くの場合、通常のstr関数をUTF-8で使用できます。
strlenが正常に機能し、バイト数(文字ではない)が返されます。 strcatが動作します(バッファを簡単にオーバーランしますが、strcatではこれが正常です)。

なぜなら、マルチバイトUTF-8データでは0文字を使用できないからです。したがって、UTF-8文字列で表示されている場合は、ASCIIのように終わりです。

3

標準では、ワイド文字関数に使用されるエンコーディングやサイズが指定されていないため、UCS2、UCS4などとすると移植性がありません。 C11では標準化されたUnicodeサポートが提供されていますが、まだ実装されていることに頼るのは早いと思います。あなたの最善の策は、UTF8/UCS4との変換、またはあなたが必要とする他のエンコーディングとの変換を扱うライブラリを見つけることです。

GNU Cライブラリマニュアルのiconvまたはcharacter handlingの章をご覧ください。