【问题标题】:Accents conversion is wrong when adding text to dictionary and send to server将文本添加到字典并发送到服务器时,重音转换错误
【发布时间】:2015-11-17 04:31:07
【问题描述】:

我有一个字典数组:[[String:String]]。每个字典都有一个法语字符串参数(文本)。

当我将此数组放入字典:[String:AnyObject] 时,字符串文本参数中的重音符号将转换为它们的 unicode。

例如é变成\U00e9

我知道我的字符串没问题,但它在服务器中是错误的。当我向服务器发送此文本时: "Le kit de réparation de portable est toulousain",他收到"Le kit de r\U00e9paration de portable est toulousain"。我知道服务器很好,问题不在于这里。

我相信问题来自我的字典 args 的 AnyObject 类型,但我不知道如何解决。

这是我的代码:

var args: [String:AnyObject] = [
        "action":"share",
        "id": NSNumber(longLong: id)
    ]
    var shareOn = [[String:String]]()
    if let sharers = User.currentUser?.sharers {
        for (index, object) in enumerate(sharers) {
            if object.enabled == true {
                var sharerContent: [String:String] = ["sharerId": object.sharerId, "cnxId": String(object.cnxId)]
                if object.shareAsImageEnable == true {
                    sharerContent["shareAsImage"] = "true"
                }
                if object.mustSpecifyShareText == true {
                    var text : String! = (title != nil) ? title : ""
                    if object.sharerId.lowercaseString.rangeOfString("twitter") != nil {
                        let maxLength = 140 - 27 // Twitter limit - max URL long
                        if text.length > maxLength {
                            let index: String.Index = advance(text.startIndex, maxLength-3)
                            text = text.substringToIndex(index) + "... http://ppo.az/..."
                        } else {
                            text = text + " http://ppo.az/..."
                        }
                    }
                    sharerContent["text"] = text
                }
                shareOn.append(sharerContent)
            }
        }
    }

    println(shareOn)

    args["shareOn"] = shareOn

    println(args)

还有println的结果:

println(shareOn) => 重音OK =>

[[sharerId: facebook, cnxId: 4230821, shareAsImage: true, text: Le kit de réparation deportable est toulousain]]

println(args) => 重音不行 =>

[动作:分享,id:4049850929,shareOn:( { cnxId = 4150811; 共享图像 = 真; sharerId = 脸书; text = "Le kit de r\U00e9paration de 便携式 est toulousain"; } )]

还有我的路由器和我的函数 makeRequest :

import UIKit
import Alamofire
import OAuthSwift

enum Router: URLRequestConvertible {

static let baseURLString: String! = Global.kClientAPIURL
static var oauthClient: OAuthSwiftClient!

case Login([String: AnyObject])
case LoginSocial([String: AnyObject])
case Profil([String: AnyObject])
case GetCompilation([String: AnyObject])
case GetSavedSearch([String: AnyObject])
case sharePost([String: AnyObject])


var URLRequest: NSURLRequest {
    let (method: Alamofire.Method, path: String, parameters : [String: AnyObject]?) = {
        switch self {
        case .Login(let params):
            return (.POST, "api/1/login", params)
        case .LoginSocial(let params):
            return (.POST, "api/1/login-with-social-account", params)
        case .Profil(let params):
            return (.GET, "api/1/profile", params)
        case .GetCompilation(let params):
            return (.GET, "api/1/compilation", params)
        case .GetSavedSearch(let params):
            return (.GET, "api/1/search", params)
        case .sharePost(let params):
            return (.POST, "api/1/post", params)
        }
    }()

    let URL = NSURL(string: Router.baseURLString)!
    let URLWithPath = URL.URLByAppendingPathComponent(path)

    let auth = OAuthSwiftClient.authorizationHeaderForMethod(method.rawValue,
        url: URLWithPath,
        parameters: parameters!,
        credential: Router.oauthClient.credential)
    let URLRequest = makeRequest(URLWithPath, method.rawValue, ["Authorization" : auth], parameters!, NSUTF8StringEncoding)

    return URLRequest
  }
}

func makeRequest(URL: NSURL, method: String, headers: [String : String], parameters: Dictionary<String, AnyObject>, dataEncoding : NSStringEncoding) -> NSMutableURLRequest {
var request = NSMutableURLRequest(URL: URL)
request.HTTPMethod = method

for (key, value) in headers {
    request.setValue(value, forHTTPHeaderField: key)
}

let charset = CFStringConvertEncodingToIANACharSetName(CFStringConvertNSStringEncodingToEncoding(dataEncoding))

var nonOAuthParameters = parameters.filter { key, _ in !key.hasPrefix("oauth_") }

if nonOAuthParameters.count > 0 {
    if request.HTTPMethod == "GET" || request.HTTPMethod == "POST" {
        let queryString = nonOAuthParameters.urlEncodedQueryStringWithEncoding(dataEncoding)
        request.URL = URL.URLByAppendingQueryString(queryString)
        request.setValue("application/x-www-form-urlencoded; charset=\(charset)", forHTTPHeaderField: "Content-Type")
    }
    else {
        var error: NSError?
        if let jsonData: NSData = NSJSONSerialization.dataWithJSONObject(nonOAuthParameters, options: nil, error: &error)  {
            request.setValue("application/json; charset=\(charset)", forHTTPHeaderField: "Content-Type")
            request.HTTPBody = jsonData
        }
        else {
            println(error!.localizedDescription)
        }
    }
}
return request
}

【问题讨论】:

  • 你的服务器数据库是什么,统一支持的级别是什么,并配置了。
  • 我在 Obj-C 中有相同的应用程序,并且服务器可以正常使用它,所以我猜问题不是来自它。

标签: ios string swift non-ascii-characters


【解决方案1】:

é 转换为\U00e9 不是问题,它是JSON spec 的一部分,它表示:

任何字符都可以转义。如果角色在 Basic 多语言平面(U+0000 到 U+FFFF),那么它可能是 表示为六个字符的序列:反向固线,后跟 由小写字母 u 后跟四个十六进制数字 对字符的代码点进行编码。十六进制字母 A 虽然 F 可以是大写或小写。因此,例如,一个字符串包含 只有一个反斜线字符可以表示为 “\u005C”。

如果您的服务器无法理解,则说明您的服务器未遵循规范。

【讨论】:

  • 我在 Obj-C 中有相同的应用程序,并且服务器可以正常使用它,所以我猜问题不是来自它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-11
  • 1970-01-01
  • 2016-12-11
  • 1970-01-01
  • 2013-09-24
  • 1970-01-01
相关资源
最近更新 更多