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 中的官方 C API。
  • mysql55-connector-cpp看起来像一个不需要安装 MySQL 的 C++ 包装器(它确实依赖于 boost,但是构建起来可能不会更快)。

如果是 iOS,那么这个SO 答案可能涵盖了它。

于 2012-11-28T14:47:52.443 回答
0

这实际上是使用 .php 的问题。使用的编码没有覆盖特殊字符,所以当它进行数据库调用时,我必须在 .php 中使用 UTF8 编码。

于 2012-12-03T13:50:42.873 回答