2017-11-12 1 views
1

웹 서비스를 사용하여 아랍어를 영어로 번역하려고합니다. URL을 생성 할 때 오류가 발생합니다. 나는 이러한 경우 정의했습니다 :아랍어 텍스트 URL 구문 분석 오류

enum MyErrors: Error { 
    case urlParsingError(String) 
    case nonDictonaryObjectReturned(Any) 
} 

을 그리고 내 코드는 다음과 같습니다

func translateWord (text: String, ToLan:String) { 

    // the text is "مرحبا" and ToLan is "en" 

    do { 
     let jsonString = "https://translate.yandex.net/api/v1.5/tr.json/translate?key=apikey&text=\(text)&lang=\(ToLan)" 

     guard let url = URL(string: jsonString) else { 
      throw MyErrors.urlParsingError(jsonString) 
     } 

     let data = try Data(contentsOf: url, options: Data.ReadingOptions()) 

     let jsonObject = try JSONSerialization.jsonObject(with: data,options: .allowFragments) 
     guard let dictionary = jsonObject as? [AnyHashable: Any] else { 
      throw MyErrors.nonDictonaryObjectReturned(jsonObject) 
     } 
     let result = dictionary["text"] as? [Any] 
     let translattedSTR = result?.first as? String 
     let encodedData = translattedSTR?.data(using: String.Encoding.utf8)! 
     print(encodedData!) 
     self.textresult.text = translattedSTR 


    } catch { 
     print("caught error \(error)") 
    } 

하지만 불행히도, 그것은 인쇄

잡은 오류 urlParsingError (출력 URL)

또한, 내 구조는 [이]처럼 보입니다 (https://translate.yandex.net/api/v1.5/tr.json/translate?key= apikey & 텍스트 = مرحبا & lang = en)

+1

임 유창하지,하지만 당신은 확인되고있는' "مرحبا"'점이다 utf8로 제대로 번역 되었습니까? 아마 그 일이 일어난 것 같아요. 그러나 아랍어 문자/단어가 http 형식에서 시각적 양식 (' "مرحبا"')으로 바뀌는 방법을 모르겠습니다./ – murphguy

+0

가드 문 앞에 URL을 인쇄 해보십시오. – murphguy

+0

@murphguy, 나는 아랍도 아닙니다. , 나는 아랍어를 말하지 않지만, 이것은 프로젝트를위한 것입니다. "مرحباا"때문에 브라우저에 잘 작동하지만 xcode에는 맞지 않습니다. –

답변

5

쿼리 매개 변수의 값을 올바르게 인코딩해야합니다. 좋은 해결책 중 하나는 URLComponents을 사용하여 쿼리를 작성하는 것입니다. 그런 다음

이 라인 :

let baseString = "https://translate.yandex.net/api/v1.5/tr.json/translate" 
var comps = URLComponents(string: baseString)! 
let keyQuery = URLQueryItem(name: "key", value: "myAPIKey") 
let textQuery = URLQueryItem(name: "text", value: text) 
let langQuery = URLQueryItem(name: "lang", value: ToLan) 
comps.queryItems = [ keyQuery, textQuery, langQuery ] 
guard let url = comps.url else { 
    throw MyErrors.urlParsingError("\(comps)") 
} 

결과 URL 지금 :

https://translate.yandex.net/api/v1.5/tr.json/translate?key=myAPIkey&text=%D9%85%D8%B1%D8%AD%D8%A8%D8%A7&lang=en

+0

URL의 다른 부분이 다른 인코딩 요구 사항을 갖고 있기 때문에이 솔루션을 'addingPercentEncoding'솔루션보다 선호합니다. –

+0

감사합니다. @rmaddy, 신의 축복으로 수십 시간을 절약 할 수 있습니다. –

+0

마지막 편집에서 일부 오류가 발생하여 더 이상 컴파일되지 않는 것 같습니다. -'comps.url'이 nil이면'comps.string'도 nil이 될 수 있으므로 오류 메시지에'comps.string! '을 사용할 수 없습니다. –

2

let jsonString = "https://translate.yandex.net/api/v1.5/tr.json/translate?key=myAPIkey&text=\(text)&lang=\(ToLan)" 

guard let url = URL(string: jsonString) else { 
    throw MyErrors.urlParsingError(jsonString) 
} 

필요로 대체합니다 유효한 URL을 얻으려면 String을 인코딩해야합니다. String.addingPercentEncoding(withAllowedCharacters:)을 사용하여이 작업을 수행 할 수 있습니다.

let jsonString = "https://translate.yandex.net/api/v1.5/tr.json/translate?key=trnsl.1.1.20170517T154730Z.927d87b76de60242.7a92e4612778a4838d40ab192df5297d2a1af4ed&text=\(text)&lang=\(ToLan)" 

guard let encodedJsonString = jsonString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed), let url = URL(string: encodedJsonString) else { 
    throw MyErrors.urlParsingError(jsonString) 
} 

인코딩 된 URL이된다 : 아랍어 방법이나 웹에서 사용하는 방법에

https://translate.yandex.net/api/v1.5/tr.json/translate?key=trnsl.1.1.20170517T154730Z.927d87b76de60242.7a92e4612778a4838d40ab192df5297d2a1af4ed&text=%D9%85%D8%B1%D8%AD%D8%A8%D8%A7&lang=en

+1

고마워요, 답안 모두 작동합니다, 나는 내 upvote 줄 테니 –