Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift:尝试对用户进行编码并传递到UTF8_Swift_Encoding - Fatal编程技术网

Swift:尝试对用户进行编码并传递到UTF8

Swift:尝试对用户进行编码并传递到UTF8,swift,encoding,Swift,Encoding,我使用的API在登录屏幕中不使用头来验证用户凭据。我想对电子邮件进行编码并传递到UTF8,以防电子邮件或传递中有“+”之类的字符。这是我的密码: func logIn() { var email = emailTextField.text var pass = passwordTextField.text var encodedEmail = email.stringByAddingPercentEncodingWithAllowedCharacters(NSCha

我使用的API在登录屏幕中不使用头来验证用户凭据。我想对电子邮件进行编码并传递到UTF8,以防电子邮件或传递中有“+”之类的字符。这是我的密码:

func logIn() {


    var email = emailTextField.text
    var pass = passwordTextField.text

    var encodedEmail = email.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLHostAllowedCharacterSet())
    var encodedPass = pass.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLHostAllowedCharacterSet())

    var url = "https://www.photoshelter.com/psapi/v3/mem/authenticate?api_key=\(api_key)&email=\(encodedEmail!)&password=\(encodedPass!)&mode=token"


    var baseURL:NSURL? = NSURL(string: url)
    var request: NSMutableURLRequest? = NSMutableURLRequest(URL: baseURL!)
    var session = NSURLSession.sharedSession()
    var task = session.dataTaskWithRequest(request!, completionHandler: { (data, response, error) -> Void in
        dispatch_async(dispatch_get_main_queue(), { () -> Void in


            if response == nil {
                UIAlertView(title: "PhotoShelter", message: "No internet connection", delegate: nil, cancelButtonTitle: "Cancel").show()
            } else {
                var responseObject: AnyObject? = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: nil)
                var status: AnyObject? = responseObject?.objectForKey("status")

                if status as String != "ok" {
                    UIAlertView(title: "PhotoShelter", message: "Invalid Credentials", delegate: nil, cancelButtonTitle: "OK").show()
                } else {

                    var tokenString: AnyObject? = responseObject?.objectForKey("data")
                    var token: AnyObject? = tokenString?.objectForKey("token")
                    println(token!)


                }

            }

        })
    })
    task.resume()
}
它运行正常,我得到的令牌打印没有问题,定期登录。当我添加带有“+”的电子邮件时,baseURL不会读取它。它将“@”符号转换为%40,但忽略“+”

我还想指出,当我使用:

var encodedEmail = email.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)
var encodedPass = pass.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)

它也不起作用。有没有办法解决这个问题

代码正在执行您要求的操作。你只是问得不对。您要求它获取一个字符串,并使用百分比编码将给定NSCharacterSet中的所有字符转换为非。(顺便说一句,您并不是试图将用户名和密码编码到UTF-8中,而是试图对其进行百分比编码或URL编码。)

您要传递的字符集包括+,因为URL中允许+

要获得所需的结果,需要提供一个不包含+的字符集。我不知道有什么好的、面向URL的预定义集可以做到这一点,所以您必须自己制作。这是一种方法:

import Foundation

let x: NSString = "some+other@host.xxx"
let modifiedHostCharacterSet: NSMutableCharacterSet = NSCharacterSet.URLHostAllowedCharacterSet().mutableCopy() as NSMutableCharacterSet
modifiedHostCharacterSet.removeCharactersInString("+")

x.stringByAddingPercentEncodingWithAllowedCharacters(modifiedHostCharacterSet)
这个片段是为了在Xcode游戏场或REPL中演示您想要的结果