0

Web サーバー上の MySQL データベースと Objective-C Cocoa デスクトップ アプリとの間のブリッジとして、単純な PHP Web サービスを作成しようとしています。私が知る限り、チェーン内のすべてのリンクは UTF-8 で動作していますが、非標準の文字を Cocoa で表示することはできないようです。代わりに、私のインターフェイス要素はエスケープのみを表示します。

どの段階でもこの問題を解決できる解決策を受け入れます。PHPとObj-C側を書いているので、サーバー側の問題でもクライアント側の問題でも対応できるはずです。この時点で、どのモグラを叩くべきかわかりません。

データベース

情報は MySQL データベースのテーブルから取得されます。データベース照合と各フィールドは utf_general_ci に設定されます。

PDO

私の PHP Web サービスは、PDO を使用してデータをフェッチします。

    $pdo = new PDO('mysql:host=mysql.hostname.com;dbname=tst_data_model', 'user', 'password', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
if ($pdo) {} else {die();}

$stmt = $pdo->prepare("SELECT * FROM team");
$stmt->execute();

PHP

次に、データをエコーし​​ます。

header('Content-Type: text/html; charset=utf-8'); 
echo("<TEAM>\r");
echo("<team_id>{$row['team_id']}</team_id>\r");
echo("<name_full_native>{$row['name_full_native']}</name_full_native>\r");
echo("<name_short_native>{$row['name_short_native']}</name_short_native>\r");
echo("<name_full_english>{$row['name_full_english']}</name_full_english>\r");
echo("<name_short_english>{$row['name_short_english']}</name_short_english>\r");
echo("</TEAM>\r\r");

NSDATA

デスクトップ アプリは、NSURLConnection を使用してこのデータをフェッチします。

NSData* returnValue = [NSURLConnection sendSynchronousRequest:teamArrayRequest returningResponse:NULL error:NULL];

NSString

最後に、UTF8 文字列エンコーディングを指定して、データから文字列を取り出します。

NSString* rVString = [[NSString alloc] initWithData:returnValue encoding:NSUTF8StringEncoding];

この文字列をデバッガーで表示するか、NSTextView に送信すると、表示されるのは \u エスケープだけです。

ボルシア M\U00f6nchengladbach

Quer\U00e9taro

レアル エスパ\U00f1a

何か不足していますか?これらの脱出はどこから来るのですか?

4

1 に答える 1

0

ええと...気にしないでください。これはPEBCAKのケースであることが判明しました。

実際、NSString に至るまで、結局すべてが UTF8 でした。私を混乱させたのは、デバッガーで表示し、NSTextView に渡していたものが NSString ではなかったことです。それは、フェッチした直後に割り当てていた文字列を含む NSArray または NSDictionary の -description メソッドの出力でした。

何らかの理由で、NSArray または NSDictionary のいずれかの -description メソッドは常に、標準の ASCII 文字以外の UTF-8 文字を /u エスケープとして出力します。

解析して保存するために使用していた辞書の配列から実際に文字列を取り出し、その文字列を直接 NSTextView に挿入すると、完全な UTF8 として表示されました。

ボルシア・メンヒェングラートバッハ

ケレタロ

レアル・エスパーニャ

それが答えです。[NSArray の説明] と [NSDictionary の説明] は、NSString として表示されるため、文字列値のすべての文字を表示するわけではありません。これは、plist の説明に空白文字などが表示されないようにコーダーが行った選択だと思います。

以前に plist の説明とデバッガーの出力で漢字を見たことがあることは知っていますが、まだ少し不思議です。それでも、問題は解決しました。ハイブマインドの時間を無駄にして申し訳ありません。説明が誰かの助けになることを願っています。

于 2012-10-17T12:55:45.253 に答える