develop
iOS에서 srt, smi 파일 한글 깨지는 문제 본문
반응형
srt파일이나 smi파일안에 한글이 있다면 아래와 같이 한글이 깨져서 나오게 된다.
let urlPath = "https://pikachu987.github.io/ProjectData/Playground/exampleSrt1.srt"
guard let url = URL(string: urlPath) else { return }
guard let data = try? Data(contentsOf: url) else { return }
guard let attributed = try? NSAttributedString(data: data, options: [.documentType: NSAttributedString.DocumentType.html], documentAttributes: nil) else { return }
print(attributed.string)
try? String(contentsOf: url, encoding: .utf8)
contentOf를 사용하게 되면 nil을 출력하게 된다.
srt파일 뿐만 아니라 smi파일도 동일하게 깨지고 contentOf를 사용하게 되면 nil이 나온다.
물론 한글이 들어가있지 않으면
위와 같이 출력이 잘 된다.
한글이 들어간 srt, smi파일의 내용을 WKWebView를 사용하여 가져올 수 있다.
먼저 srt, smi파일을 다운로드 받은 후 WKWebView에 URL을 load를 한다.
그리고 WKWebView가 로드 되면 innerHTML으로 안에있는 html을 가져온다.
guard let url = URL(string: urlPath) else { return }
URLSession(configuration: URLSessionConfiguration.default, delegate: nil, delegateQueue: nil).downloadTask(with: url) { (downloadURL, response, error) in
guard let downloadURL = downloadURL else { return }
var tempURLPath = FileManager.default.temporaryDirectory
tempURLPath.appendPathComponent(url.lastPathComponent, isDirectory: false)
try? FileManager.default.moveItem(at: downloadURL, to: tempURLPath)
DispatchQueue.main.async {
let webView = WKWebView(frame: .zero, configuration: WKWebViewConfiguration())
self.view.addSubview(webView)
webView.navigationDelegate = self
webView.loadFileURL(tempURLPath, allowingReadAccessTo: tempURLPath)
}
}.resume()
// MARK: WKNavigationDelegate
extension ViewController: WKNavigationDelegate {
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
decisionHandler(.allow)
}
func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
webView.evaluateJavaScript("document.body.innerHTML") { (html, error) in
guard let html = html as? String else { return }
print(html)
}
}
decisionHandler(.allow)
}
func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
completionHandler(.performDefaultHandling, nil)
}
}
한글을 깨짐 없이 잘 가져왔다.
시뮬레이터에서 사용한다면 Scheme (⌘+<) - Run - Options 에서 App Language를 Korean으로 바꿔주면 된다.
반응형
'iOS' 카테고리의 다른 글
Hashable에 대해 (0) | 2021.06.23 |
---|---|
==과 ===의 차이, closure의 === (0) | 2021.06.22 |
UITableView UICollectionView Reorder (0) | 2021.02.07 |
GCD (0) | 2021.02.06 |
OperationQueue (0) | 2021.02.05 |
Comments