fdo#48023 fix RTF import of Russian characters without an encoding specified

lcl_GetDefaultTextEncodingForRTF() in editeng did the same.
This commit is contained in:
Miklos Vajna
2012-04-21 11:25:18 +02:00
parent 2abba84aa7
commit f8bda240a0
3 changed files with 47 additions and 1 deletions

View File

@@ -0,0 +1,8 @@
{\rtf
{\fonttbl
{\f1 Arial;}
}
\pard
\f1 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
\par
}

View File

@@ -82,6 +82,7 @@ public:
void testFdo44176(); void testFdo44176();
void testFdo39053(); void testFdo39053();
void testFdo48356(); void testFdo48356();
void testFdo48023();
CPPUNIT_TEST_SUITE(RtfModelTest); CPPUNIT_TEST_SUITE(RtfModelTest);
#if !defined(MACOSX) && !defined(WNT) #if !defined(MACOSX) && !defined(WNT)
@@ -106,6 +107,7 @@ public:
CPPUNIT_TEST(testFdo44176); CPPUNIT_TEST(testFdo44176);
CPPUNIT_TEST(testFdo39053); CPPUNIT_TEST(testFdo39053);
CPPUNIT_TEST(testFdo48356); CPPUNIT_TEST(testFdo48356);
CPPUNIT_TEST(testFdo48023);
#endif #endif
CPPUNIT_TEST_SUITE_END(); CPPUNIT_TEST_SUITE_END();
@@ -574,6 +576,29 @@ void RtfModelTest::testFdo48356()
CPPUNIT_ASSERT_EQUAL(1, i); CPPUNIT_ASSERT_EQUAL(1, i);
} }
void RtfModelTest::testFdo48023()
{
lang::Locale aLocale;
aLocale.Language = "ru";
AllSettings aSettings(Application::GetSettings());
AllSettings aSavedSettings(aSettings);
aSettings.SetLocale(aLocale);
Application::SetSettings(aSettings);
load("fdo48023.rtf");
Application::SetSettings(aSavedSettings);
uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY);
uno::Reference<container::XEnumerationAccess> xParaEnumAccess(xTextDocument->getText(), uno::UNO_QUERY);
uno::Reference<container::XEnumeration> xParaEnum = xParaEnumAccess->createEnumeration();
uno::Reference<container::XEnumerationAccess> xRangeEnumAccess(xParaEnum->nextElement(), uno::UNO_QUERY);
uno::Reference<container::XEnumeration> xRangeEnum = xRangeEnumAccess->createEnumeration();
uno::Reference<text::XTextRange> xTextRange(xRangeEnum->nextElement(), uno::UNO_QUERY);
// Implicit encoding detection based on locale was missing
OUString aExpected("Программист", 22, RTL_TEXTENCODING_UTF8);
CPPUNIT_ASSERT_EQUAL(aExpected, xTextRange->getString());
}
CPPUNIT_TEST_SUITE_REGISTRATION(RtfModelTest); CPPUNIT_TEST_SUITE_REGISTRATION(RtfModelTest);
CPPUNIT_PLUGIN_IMPLEMENT(); CPPUNIT_PLUGIN_IMPLEMENT();

View File

@@ -513,13 +513,26 @@ sal_uInt32 RTFDocumentImpl::getColorTable(sal_uInt32 nIndex)
return 0; return 0;
} }
rtl_TextEncoding lcl_getDefaultTextEncoding()
{
const OUString& rLanguage = Application::GetSettings().GetLocale().Language;
if (rLanguage == "ru" || rLanguage == "uk")
return RTL_TEXTENCODING_MS_1251;
if (rLanguage == "tr")
return RTL_TEXTENCODING_MS_1254;
else
return RTL_TEXTENCODING_MS_1252;
}
rtl_TextEncoding RTFDocumentImpl::getEncoding(sal_uInt32 nFontIndex) rtl_TextEncoding RTFDocumentImpl::getEncoding(sal_uInt32 nFontIndex)
{ {
if (!m_pSuperstream) if (!m_pSuperstream)
{ {
if (nFontIndex < m_aFontEncodings.size()) if (nFontIndex < m_aFontEncodings.size())
return m_aFontEncodings[nFontIndex]; return m_aFontEncodings[nFontIndex];
return 0; return lcl_getDefaultTextEncoding();
} }
else else
return m_pSuperstream->getEncoding(nFontIndex); return m_pSuperstream->getEncoding(nFontIndex);