我正在尝试为我的应用添加表情符号和非拉丁字符集支持。我有一个MySQL数据库,PHP作为来回沟通的桥梁。我已经做了大量的研究,研究了让Emoji等工作的复杂性,但是我遇到了一些奇怪的问题。
如果我只发送一两个表情符号,一切都很顺利。如果我发送更长的消息,可能是15个表情符号,那么就会出现问题,并且PHP脚本收到的数据会以某种方式损坏。我也试过用拉丁字符和日文字符发送大约500个字符的字符串,它们也错了。在一个案例中,没有错误,但我的一些信息被切断了。这些错误都发生在文本甚至到达MySQL数据库之前,但是在控制台中测试它,数据库本身似乎处理所有这些事情就好了。
我已经使用Chrome应用Postman直接从网络浏览器中尝试了所有这些导致问题的字符串,并且它们都没有问题
一些示例字符串:
工作正常:
在表情符号之前被切断:我觉得它有用吗? / ???? ?? //? ? ? ? ? ? ? ? 旁注,它不起作用
PHP脚本中的字符串损坏:大地を踏みしめて君は目覚めていく天使の微笑みで连れ出して!孤独でも一人じゃないさ生まれてきたことに必ず意味がある优しさに満ち溢れてる青い地球(ほし)にありがとう
PHP脚本中损坏的字符串:“Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,totam rem aperiam,eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt。“
同样,所有这些在通过Postman发送时都能正常工作,所以这似乎是我的Swift代码的一个明确问题。有问题的代码:
func sendRequest(completion: (NSData?, NSURLResponse!, NSError?) -> ()) {
let rString = NSString(string: requestString)
let requestData = NSData(bytes: rString.UTF8String, length: rString.length)
request.HTTPMethod = "POST";
request.setValue("application/x-www-form-urlencoded; charset=utf-8", forHTTPHeaderField: "content-type")
request.HTTPBody = requestData
UIApplication.sharedApplication().networkActivityIndicatorVisible = true
func fullCompletion(data: NSData?, response: NSURLResponse!, error: NSError?) {
UIApplication.sharedApplication().networkActivityIndicatorVisible = false;
completion(data, response, error)
}
activeTask = session.dataTaskWithRequest(request, completionHandler: fullCompletion)
activeTask!.resume()
}
汇编requestString
的代码:
func addVariable(name: String, value: String) {
if !requestString.isEmpty {
requestString += "&"
}
requestString += "\(name)=\(value)"
}
session
是具有默认配置的NSURLSession
对象。
我想我已经提供了相关的一切,但如果我忘记了什么,我会乐意添加它。
答案 0 :(得分:0)
结果是多么奇怪的解决方案。由于Zaph的建议,我直接查看数据,发现它被缩短了。做出以下更改解决了我的问题:
//changed this:
let requestData = NSData(bytes: rString.UTF8String, length: rString.length)
//to this:
let requestData = rString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)