【问题标题】:Accents conversion is wrong when adding text to dictionary向字典添加文本时重音转换错误
【发布时间】:2015-08-21 12:22:09
【问题描述】:

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

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

例如é变成\U00e9

这是我的代码:

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
}

【问题讨论】:

    标签: ios string swift non-ascii-characters


    【解决方案1】:

    字符串\U00e9 不是ASCII 字符,而只是字母é 的Unicode 格式。换句话说,没有任何改变,只是以不同的方式打印。

    当值打印为String时,它被“正确”打印。

    另一方面,打印 AnyObject 类型值的库函数尝试更通用,并使用其 Unicode 代码点呈现非英语字符。

    【讨论】:

      【解决方案2】:

      你的字典和文字没问题,“问题”来自println

      将其粘贴到 Playground 中进行演示:

      var args = [String:AnyObject]()
      var shareOn = [[String:String]]()
      shareOn.append(["key":"clé"])
      println(shareOn)
      args["shareOn"] = shareOn
      println(args)
      
      args["shareOn"]
      

      println 的输出看起来不对但是在 Playground 中你看到字典的实际内容是正确的,重音字母还在。

      如果对象类型不是Stringprintln 不知道如何处理重音字符。

      如果您为值声明 String 类型,则 println 可以正常工作:

      var args = [String:[[String:String]]]()
      var shareOn = [[String:String]]()
      shareOn.append(["key":"clé"])
      println(shareOn)
      args["shareOn"] = shareOn
      println(args)
      

      【讨论】:

      • 谢谢,但是服务器也收到了这个字符串“Le kit de rU00e9paration de portable est toulousain”,我使用 NSUTF8StringEncoding... 我已经编辑了我的问题以添加我的路由器和我的函数 makeRequest()跨度>
      • Gautier,您说“println(shareOn)”有效,但“println(args)”无效。我已经回答过了。现在你说你的字符串无论如何都不好。但是,如果在“println(shareOn)”中没问题,并且如我所展示的那样,在“println(args)”中也没问题,那又怎么会不好呢?你的路由器和其他东西是无关紧要的。 不要相信 println 的输出,仅此而已。 如果您有疑问,请通过将字符串与参考进行比较,以编程方式自行检查。
      • 这是我的问题。当我在 UITextView 中打印文本时,我有正确的文本,但是当我将字典发送到服务器时,服务器的文本与 \U00e9 错误。我在 Obj-C 中完成了这个应用程序的另一个版本,它就像一个魅力..
      • 你应该在你的问题中从这个开始......“我知道我的字符串是好的,但它在服务器中是错误的”是一个与你的问题完全不同的问题问。我觉得在这里浪费时间。
      • 我强烈建议您根据您刚刚在评论中告诉我的内容,提出一个 问题,并以 clear 陈述您的问题,并且不是您在此处发布的问题中的无关内容。
      猜你喜欢
      • 2015-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-31
      • 2021-11-24
      • 2018-04-21
      • 2019-11-08
      • 1970-01-01
      相关资源
      最近更新 更多