在做我的demo的时候,我选择利用XAMPP搭建本地服务器, 编写PHP代码实现iOS端注册登录功能,具体实现参考[iOS+PHP]利用XAMPP搭建本地服务器, 编写PHP代码实现iOS端注册登录功能一文,同时感谢简书作者M_Lee先生对我提出的一些疑问的简答。
废话不多说,我们来看实际上会遇到的一些问题:
1、数据库的UserInfo表中的中文字段传入客户端无法被识别,显示??
这个问题困扰了我很久,在网上找到的方案也是五花八门,最后在M_Lee先生的指导下才解决这个问题。
主要解决方案是在Mysql数据库的配置文件my.cnf中设置默认字符集utf8
首先找到my.cnf的路径
修改my.cnf
[client]
default-character-set=utf8 [mysql] default-character-set=utf8 [mysqld] init_connect='SET collation_connection = utf8_unicode_ci' init_connect='SET NAMES utf8' character-set-server=utf8 collation-server=utf8_unicode_ci skip-character-set-client-handshake
注意:
在 mysqld 中使用 default-character-set 设置, mysql 启动会报错而无法启动。
说明
关于utf8字符集,我们国内默认选择:utf8_general_ci而不是utf8_unicode_ci,
区别在于字符对比上
请看mysql上面的例子:
对与general来说 ß = s 是为true的
但是对于unicode来说 ß = ss 才是为true的,
其实他们的差别主要在德语和法语上,所以对于我们中国人来说,一般使用general,因为general更快
如果你对德语和法语的对比有更高的要求,才使用unicode,它比general更准确一些(按照德语和法语的标准来说,在对比或者排序上更准确)
写loginGet.php
数据库中表数据:
注意$row[ ]指的是表中对应字段,因为 $row[3]指的是Password密码字段,所以不能将该字段传入客户端。
在客户端中打印responseObject(ps:关于客户端如何写登录,如何与php服务器端交互可见[[iOS+PHP]利用XAMPP搭建本地服务器, 编写PHP代码实现iOS端注册登录功能]
可见cname中文字段打印出来的不再是??即已解决该问题。
2、在问题1中,我们可以看到中文传进来变为了一串不知道是什么的字符串:cname = "\\U6e7e\\U91cc\\U6700";,这是什么呢?
这是Unicode编码,从本质来说UTF-8也是一种Unicode编码。现在我们需要将这个Unicode编码进行解码,得到我们需要的中文字段。
在SCStringUtil中写一个方法:
+ (NSString*) replaceUnicode:(NSString*)aUnicodeString
{
NSString *tempStr1 = [aUnicodeString stringByReplacingOccurrencesOfString:@"\\u"withString:@"\\U"];
NSString *tempStr2 = [tempStr1 stringByReplacingOccurrencesOfString:@"\""withString:@"\\\""];
NSString *tempStr3 = [[@"\"" stringByAppendingString:tempStr2] stringByAppendingString:@"\""];
NSData *tempData = [tempStr3 dataUsingEncoding:NSUTF8StringEncoding];
NSString* returnStr = [NSPropertyListSerialization propertyListFromData:tempData
mutabilityOption:NSPropertyListImmutable
format:NULL
errorDescription:NULL];
return [returnStr stringByReplacingOccurrencesOfString:@"\\r\\n"withString:@"\n"];
}
通过调用这个方法进行解码
NSLog(@"%@",[SCStringUtil replaceUnicode:responseObject[@"cname"]]);
打印结果为:
解决该问题。