【问题标题】:NSJSONSerialization and non-latin (cyrillic) characters in SwiftSwift 中的 NSJSONSerialization 和非拉丁(西里尔文)字符
【发布时间】:2014-07-16 12:45:56
【问题描述】:

这是我解析 JSON 的函数:

func jsonParsingWeather(urlPath:String) -> NSDictionary {
    var utf8URLPath = urlPath.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)
    println("URL path for JSON: \(utf8URLPath)")
    var streamData:NSData = NSData(contentsOfURL: NSURL(string: utf8URLPath))
    var error: NSError?
    var fullWeatherDictionary: NSDictionary = NSJSONSerialization.JSONObjectWithData(streamData, options: NSJSONReadingOptions.MutableContainers, error: &error) as NSDictionary
    println("Full parsing array: \(fullWeatherDictionary)")
    return fullWeatherDictionary
}

在处理西里尔字符时发现问题

urlPath = http://autocomplete.wunderground.com/aq?query=Самара

utf8URLPath = http://autocomplete.wunderground.com/aq?query=%D0%A1%D0%B0%D0%BC%D0%B0%D1%80%D0%B0

在 Safari 浏览器中,两行给出相同的结果: { "RESULTS": [ { "name": "Самара, Россия", "type": "city", "c": "RU", "zmw": "00000.1.28807", "tz": "Europe/Samara", "tzs": "SAMT", "l": "/q/zmw:00000.1.28807", "ll": "53.250000 50.450001", "lat": "53.250000", "lon": "50.450001" } ] }

但是!数组fullWeatherDictionary 为空!

{
    RESULTS =     (
    );
}

为了比较,取一个拉丁字符串:

urlPath = http://autocomplete.wunderground.com/aq?query=Samara

utf8URLPath = http://autocomplete.wunderground.com/aq?query=Samara

在 Safari 浏览器中,两行给出相同的结果: { "RESULTS": [ { "name": "Samara, Russia", "type": "city", "c": "RU", "zmw": "00000.1.28807", "tz": "Europe/Samara", "tzs": "SAMT", "l": "/q/zmw:00000.1.28807", "ll": "53.250000 50.450001", "lat": "53.250000", "lon": "50.450001" }, { "name": "Samarate, Italy", "type": "city", "c": "IT", "zmw": "00000.101.16066", "tz": "Europe/Rome", "tzs": "CEST", "l": "/q/zmw:00000.101.16066", "ll": "45.625370 8.783435", "lat": "45.625370", "lon": "8.783435" } ...........

因此,数组fullWeatherDictionary为:

{
    RESULTS =     (
                {
            c = RU;
            l = "/q/zmw:00000.1.28807";
            lat = "53.250000";
            ll = "53.250000 50.450001";
            lon = "50.450001";
            name = "Samara, Russia";
            type = city;
            tz = "Europe/Samara";
            tzs = SAMT;
            zmw = "00000.1.28807";
        },
.......................

怎么了?为什么在非拉丁字符的情况下数组fullWeatherDictionary的内容不同?

【问题讨论】:

  • JSON解析的error是什么意思?
  • 带有非转义西里尔字符的 URL 是什么? (我懒得全部查了)
  • 带有 UTF8 的 URL http://autocomplete.wunderground.com/aq?query=%D0%A1%D0%B0%D0%BC%D0%B0%D1%80%D0%B0 等于带有非转义西里尔字符的 URL http://autocomplete.wunderground.com/aq?query=СамараСамара - 是带有西里尔字符的俄语单词)

标签: utf-8 swift ios8 nsjsonserialization


【解决方案1】:

URL http://autocomplete.wunderground.com/aq?query=%D0%A1%D0%B0%D0%BC%D0%B0%D1%80%D0%B0 在 Safari 中也会给出空结果。

这是服务器问题。

【讨论】:

  • 这是我的 Safari 的截图,http://autocomplete.wunderground.com/aq?query=%D0%A1%D0%B0%D0%BC%D0%B0%D1%80%D0%B0 URL:prntscr.com/438gnd
  • JSON 响应为空。
【解决方案2】:

该死!抱歉,问题解决了:

我在俄罗斯语言和地区配置了 iOS 模拟器,一切都很好 - 数组中的值出现在任何语言中

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多