1

データベースから名前を取得し、その名前と姓をNSMutableDictionaryに保存し、それらをNSMutableArrayに保存します。データベースには、「ñ」、「Ç」などの特殊文字を含む名前があり、その名前を変数に格納すると、プログラムがクラッシュします。

ユーザー入力を制限したくないので、これらの文字を保持する必要があります。しかし、出力を取得せずにそのような文字でこれらの名前を取得するための回避策はありますか?

ConDAO *con = [[ConDAO alloc] init];

NSMutableArray *resultSet = [con executeMySqlCommand:[NSString stringWithFormat:(Long query here)]];

NSMutableDictionary * endList = [[NSMutableDictionary alloc] init]; [endList setObject: @"" forKey:@"surname"]; [endList setObject: @"" forKey:@"name"];

resultSet =(NSMutableArray *)[resultSet arrayByAddingObject:endList];

for (int i =0; i< [resultSet  count]-1; ++i)
    {
        NSMutableDictionary *temp = (NSMutableDictionary *) [resultSet objectAtIndex:i];

...
}

-(NSMutableArray *) executeMySqlCommand: (NSString *) mysqlCommand{
    LoginData* loginData=[self dataObject]; 
    NSString *post =[NSString stringWithFormat:@"username=%@&password=%@&mysqlCommand=%@",
                     loginData.loginName, loginData.loginPassword, mysqlCommand ];
   NSString *hostStr = @myIP;

    hostStr = [hostStr stringByAppendingString:post];
    NSString *encodeURL =[hostStr stringByAddingPercentEscapesUsingEncoding: NSASCIIStringEncoding];

    NSData *dataURL =  [NSData dataWithContentsOfURL: [ NSURL URLWithString: encodeURL ]];    

    NSString *serverOutput = [[NSString alloc] initWithData:dataURL encoding: NSASCIIStringEncoding];

    if ([serverOutput length]<=0) return nil;
    NSError * error;
    NSMutableArray *data = [NSJSONSerialization JSONObjectWithData:dataURL options:0 error:&error];
    return data;
}
4

2 に答える 2

1

クエリがWebサーバーを介してデータベースに送信される奇妙なサーバーアーキテクチャを使用しているようです。次に示すように、返される文字列はASCIIとしてエンコードされていると想定しています。

NSString *serverOutput = [[NSString alloc] initWithData:dataURL
                                               encoding:NSASCIIStringEncoding];

そして、正しいエンコーディングがどうあるべきかわからないことは明らかです。Webサーバーとデータベース自体の間にエンコーディングの問題がある可能性があるため、奇妙なサーバーアーキテクチャは問題をさらに複雑にします。

この問題の正しい解決策は、MySQLクライアントライブラリを使用してクエリを実行することです。これは、さまざまなストレージとプレゼンテーションのテキストエンコーディング間の変換は、どのデータベースにとっても大変なことです。

iOSとOSXのどちらで作業しているかはわかりません。

OSXの場合は、おそらくmacportsから何かをインストールできます。

  • MySQL 5.5次に、libmysqlclientの公式CAPIにアクセスします。
  • mysql55-connector-cppこれはMySQLをインストールする必要のないC++ラッパーのように見えます(ただし、ブーストに依存するため、ビルドが速くない場合があります)。

iOSの場合、このSOの答えはおそらくそれをカバーしています。

于 2012-11-28T14:47:52.443 に答える
0

実際には、.phpの使用に関する問題でした。使用されたエンコーディングは特殊文字をカバーしていなかったため、DB呼び出しを行うときに.php内でUTF8エンコーディングを使用する必要がありました。

于 2012-12-03T13:50:42.873 に答える