快速未转义的控制字符

Posted

技术标签:

【中文标题】快速未转义的控制字符【英文标题】:swift Unescaped control character 【发布时间】:2016-11-06 23:08:19 【问题描述】:

我正在尝试从服务器获取 json 并对其进行反序列化,但我尝试使用非转义控制字符的探针。 我的代码如下...

let urlFinal = "http://000.0000.000.000:8080"
        let jsonUrl = urlFinal
        let session = NSURLSession.sharedSession()
        let shotsUrl = NSURL(string: jsonUrl)

        let task = session.dataTaskWithURL(shotsUrl!) data, response, error in
            guard data != nil else 
                falha()
                return
            

            //let json = JSON(data: data!)
            //print(json["ServicoCliente"][0]["id"])

            do 
                let jsonData = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers )
                let J = jsonData as! NSDictionary
                print(jsonData)
                let us = J["ServicoCliente"]
                print(us)
                dispatch_async(dispatch_get_main_queue(),
                    sucesso()
                );
             catch _ 
                falha()
            
        
        task.resume()

我也尝试过使用 Alamofire 3.0:

Alamofire.request(.GET, "http://000.000.000.000/", parameters: nil)
    .responseJSON  response in
        debugPrint(response)     // prints detailed description of all response properties

        print(response.request)  // original URL request
        print(response.response) // URL response
        print(response.data)     // server data
        print(response.result)   // result of response serialization

        if let JSON = response.result.value 
            print("JSON: \(JSON)")
        

并得到这个错误:

字符 263 周围未转义的控制字符

如何在不转义的情况下删除字符?

我使用 X-Code 7.3.1 和 Swift 2.3

更新: json

"ServicoCliente":["id":"195","cliente":"247","enderecoFavoritos":"48","servicoProfissional":"194","ind_estado_cliente":"A","ind_estado_profissional":"","profissional_id":"240","profissional_nome":"PetMax","servicotipo_nome":"Petshop","servicosubtipo_nome":"Tosa ","dta_inc_alt":"2016-11-05 22:56:19.333","ind_finalizado":"N"]

【问题讨论】:

我认为您的 JSON 无效,请尝试将此 objc 代码转换为 Swift ***.com/a/11192483/6366256 请在此处粘贴您的 JSON 字符串,这将有助于我们调查您的问题。 我用 json 进行了更新,但在我的一个测试中,我将 json 复制并粘贴到了 textField 中,这样就可以了。我认为该字符在副本中丢失或自动转换为文本字段@Enix 您的 JSON 是否包含任何特殊的空格?错误似乎来自字符串中的空格:Tosa 【参考方案1】:

要解决这个问题,您必须将数据转换为字符串,删除字符,然后转换为 dataonly 然后反序列化

let urlFinal = "http://000.0000.000.000:8080"
let jsonUrl = urlFinal
let session = NSURLSession.sharedSession()
let shotsUrl = NSURL(string: jsonUrl)

let task = session.dataTaskWithURL(shotsUrl!) data, response, error in
guard data != nil else 
    falha()
    return


var dataToString = String(data: data!, encoding: NSUTF8StringEncoding)
dataToString = stringByRemovingControlCharacters2(dataToString!)
let ndata = dataToString!.dataUsingEncoding(NSUTF8StringEncoding)

do 
    let jsonData = try NSJSONSerialization.JSONObjectWithData(ndata!, options: NSJSONReadingOptions.MutableContainers )
    let J = jsonData as! NSDictionary
    print(jsonData)
    let us = J["ServicoCliente"]
    print(us)
    dispatch_async(dispatch_get_main_queue(),
        sucesso()
    );
 catch _ 
    falha()


task.resume()

并添加功能

func stringByRemovingControlCharacters2(string: String) -> String 
let controlChars = NSCharacterSet.controlCharacterSet()
var range = string.rangeOfCharacterFromSet(controlChars)
var mutable = string
while let removeRange = range 
    mutable.removeRange(removeRange)
    range = mutable.rangeOfCharacterFromSet(controlChars)


return mutable

【讨论】:

【参考方案2】:

斯威夫特 5

func string(byRemovingControlCharacters inputString: String) -> String 
    let controlChars = CharacterSet.controlCharacters
    var range = (inputString as NSString).rangeOfCharacter(from: controlChars)
    if range.location != NSNotFound 
        var mutable = inputString
        while range.location != NSNotFound 
            if let subRange = Range<String.Index>(range, in: mutable)  mutable.removeSubrange(subRange) 
            range = (mutable as NSString).rangeOfCharacter(from: controlChars)
        
        return mutable
    
    return inputString

【讨论】:

这个函数的无限循环。 @Sergio 你能告诉我你试过的字符串吗?

以上是关于快速未转义的控制字符的主要内容,如果未能解决你的问题,请参考以下文章

jsonSerializationFailed(错误:错误域 = NSCocoaErrorDomain 代码 = 3840 “字符 11660 周围未转义的控制字符

转义字符和控制字符的理解

python2模块中unicode中的转义控制字符

转义字符

java的转义字符

C#转义字符总结