1

Objective-c / cocoaアプリでは、c関数を使用してテキストファイルを開き、1行ずつ読み取り、サードパーティの関数でいくつかの行を使用しています。疑似コード:

char *line = fgets(aFile);
library_function(line);  // This function calls for a utf-8 encoded char * string

これは、入力ファイルに特殊文字(アクセントやUTF-8 BOMなど)が含まれ、ライブラリ関数がマングル文字を出力するまでは正常に機能します。


ただし、これを行うと:

char *line = fgets(aFile);
NSString *stringObj = [NSString stringWithUTF8String:line];
library_function([stringObj UTF8String]);

その後、すべて正常に動作し、文字列が正しく出力されます。


私がし[NSString...ていないことをしているその行は何ですか?行が最初にフェッチされる方法に何か問題がありますか?それともまったく別のものですか?

4

1 に答える 1

2

UTF-8はマルチバイト文字セット(ウィキペディアを参照)です。つまり、一部の文字には複数バイト(遭遇したアクセント付き文字)が必要です。Cのcharタイプは1バイトであるため、Cの「文字」の定義はUnicodeの定義と一致しません。

標準のCRTLでUnicodeを読み取りたい場合は、libiconvなどのUnicode変換ライブラリも使用する必要があります。

(wchar_tを使用することも機能する可能性があります。私はそれを調査したことがありません。)

または、すでにUnicodeをサポートしているNSStringを使用することもできます。

于 2010-01-22T14:50:39.970 に答える