Fix corruption of UTF16 subtitle files.
authorCarl Hetherington <cth@carlh.net>
Thu, 21 Jun 2018 22:02:39 +0000 (23:02 +0100)
committerCarl Hetherington <cth@carlh.net>
Thu, 21 Jun 2018 22:02:39 +0000 (23:02 +0100)
src/lib/text_subtitle.cc

index a3c3975e4aba8a80aed05de87c744b150a36db20..972e74b66417ae974bd98e1f94dacdf7593606a9 100644 (file)
@@ -43,13 +43,6 @@ TextSubtitle::TextSubtitle (shared_ptr<const TextSubtitleContent> content)
 {
        Data in (content->path (0));
 
-       /* Fix OS X line endings */
-       for (int i = 0; i < in.size(); ++i) {
-               if (in.data()[i] == '\r' && ((i == in.size() - 1) || in.data()[i + 1] != '\n')) {
-                       in.data()[i] = '\n';
-               }
-       }
-
        UErrorCode status = U_ZERO_ERROR;
        UCharsetDetector* detector = ucsdet_open (&status);
        ucsdet_setText (detector, reinterpret_cast<const char *> (in.data().get()), in.size(), &status);
@@ -71,6 +64,14 @@ TextSubtitle::TextSubtitle (shared_ptr<const TextSubtitleContent> content)
        scoped_array<char> utf8 (new char[utf16_len * 2]);
        ucnv_fromUChars (to_utf8, utf8.get(), utf16_len * 2, reinterpret_cast<UChar*>(utf16.get()), utf16_len, &status);
 
+       /* Fix OS X line endings */
+       size_t utf8_len = strlen (utf8.get ());
+       for (size_t i = 0; i < utf8_len; ++i) {
+               if (utf8[i] == '\r' && ((i == utf8_len - 1) || utf8[i + 1] != '\n')) {
+                       utf8[i] = '\n';
+               }
+       }
+
        ucsdet_close (detector);
        ucnv_close (to_utf16);
        ucnv_close (to_utf8);