diff --git a/src/playlistparsers/m3uparser.cpp b/src/playlistparsers/m3uparser.cpp index df85e593d..868f5b5e3 100644 --- a/src/playlistparsers/m3uparser.cpp +++ b/src/playlistparsers/m3uparser.cpp @@ -29,11 +29,11 @@ SongList M3UParser::Load(QIODevice* device, const QDir& dir) const { M3UType type = STANDARD; Metadata current_metadata; - QString line = QString::fromLatin1(device->readLine()).trimmed(); + QString line = QString::fromLocal8Bit(device->readLine()).trimmed(); if (line.startsWith("#EXTM3U")) { // This is in extended M3U format. type = EXTENDED; - line = QString::fromLatin1(device->readLine()).trimmed(); + line = QString::fromLocal8Bit(device->readLine()).trimmed(); } forever { @@ -65,7 +65,7 @@ SongList M3UParser::Load(QIODevice* device, const QDir& dir) const { if (device->atEnd()) { break; } - line = QString::fromLatin1(device->readLine()).trimmed(); + line = QString::fromLocal8Bit(device->readLine()).trimmed(); } return ret; @@ -101,8 +101,8 @@ void M3UParser::Save(const SongList &songs, QIODevice *device, const QDir &dir) continue; } QString meta = QString("#EXTINF:%1,%2 - %3\n").arg(song.length()).arg(song.artist()).arg(song.title()); - device->write(meta.toLatin1()); - device->write(MakeRelativeTo(song.filename(), dir).toLatin1()); + device->write(meta.toLocal8Bit()); + device->write(MakeRelativeTo(song.filename(), dir).toLocal8Bit()); device->write("\n"); } } diff --git a/tests/m3uparser_test.cpp b/tests/m3uparser_test.cpp index 4d57bb4bf..51bd5fef4 100644 --- a/tests/m3uparser_test.cpp +++ b/tests/m3uparser_test.cpp @@ -124,7 +124,7 @@ TEST_F(M3UParserTest, ParsesActualM3U) { ASSERT_EQ(239, songs.size()); EXPECT_EQ("gravity", songs[0].title()); EXPECT_EQ(203, songs[0].length()); - EXPECT_EQ("ほっぴンちょっぴン", songs.back().title()); + EXPECT_EQ(QString::fromUtf8("ほっぴンちょっぴン"), songs.back().title()); EXPECT_EQ(85, songs.back().length()); } @@ -146,3 +146,19 @@ TEST_F(M3UParserTest, SavesSong) { EXPECT_THAT(data.constData(), HasSubstr("#EXTINF:123,bar - foo")); EXPECT_THAT(data.constData(), HasSubstr("http://www.example.com/foo.mp3")); } + +TEST_F(M3UParserTest, ParsesUTF8) { + QByteArray data = "#EXTM3U\n" + "#EXTINF:123,Разные - исполнители\n" + "/foo/Разные/исполнители.mp3\n"; + QBuffer buffer(&data); + buffer.open(QIODevice::ReadOnly); + M3UParser parser; + SongList songs = parser.Load(&buffer); + ASSERT_EQ(1, songs.length()); + EXPECT_EQ(6, songs[0].artist().length()); + EXPECT_EQ(11, songs[0].title().length()); + EXPECT_EQ(QString::fromUtf8("Разные"), songs[0].artist()); + EXPECT_EQ(QString::fromUtf8("исполнители"), songs[0].title()); + EXPECT_EQ(QString::fromUtf8("/foo/Разные/исполнители.mp3"), songs[0].filename()); +}