0

我正在尝试编写一个简单的 PHP Web 服务,作为我的 Web 服务器上的 MySQL 数据库和 Objective-C Cocoa 桌面应用程序之间的桥梁。据我所知,链中的每个链接都在 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 转义:

Borussia M\U00f6nchengladbach

Quer\U00e9taro

真正的西班牙\U00f1a

我错过了什么吗?这些逃跑是从哪里来的?

4

1 回答 1

0

呃……没关系。原来这是PEBCAK的案例。

事实上,一切都在 UTF8 中,一直到 NSString。让我感到困惑的是,我在调试器中查看并传递给 NSTextView 的不是 NSString;而是 它是 NSArray 或 NSDictionary 的 -description 方法的输出,其中包含我在获取它后立即分配给它的字符串。

结果显示 NSArray 或 NSDictionary 的 -description 方法总是出于某种原因将标准 ASCII 字符以外的 UTF-8 字符输出为 /u 转义。

当我实际上将字符串从我用来解析和存储它的字典数组中提取出来并将字符串直接插入到 NSTextView 中时,它显示为完美的 UTF8:

门兴格拉德巴赫

克雷塔罗

真正的西班牙

所以……这就是答案。[NSArray description] 和 [NSDictionary description] 不会显示字符串值中的每个字符,因为它将显示为 NSString。我想这是编码人员做出的选择,以便空白字符等不会出现在 plist 描述中。

Although I know I've seen Chinese characters in plist descriptions and debugger output before...so it's still a little mysterious. Still, problem solved. Sorry to waste the hive-mind's time, and I hope the explanation helps someone down the road.

于 2012-10-17T12:55:45.253 回答