develop

iOS에서 srt, smi 파일 한글 깨지는 문제 본문

iOS

iOS에서 srt, smi 파일 한글 깨지는 문제

pikachu987 2021. 3. 1. 21:09
반응형

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