diff options
-rw-r--r-- | sw/qa/extras/rtfimport/data/fdo72031.rtf | 1 | ||||
-rw-r--r-- | sw/qa/extras/rtfimport/rtfimport.cxx | 9 | ||||
-rw-r--r-- | writerfilter/source/rtftok/rtfdocumentimpl.cxx | 26 |
3 files changed, 24 insertions, 12 deletions
diff --git a/sw/qa/extras/rtfimport/data/fdo72031.rtf b/sw/qa/extras/rtfimport/data/fdo72031.rtf new file mode 100644 index 000000000000..ee589dab7d6b --- /dev/null +++ b/sw/qa/extras/rtfimport/data/fdo72031.rtf @@ -0,0 +1 @@ +{\rtf1\ansi\ansicpg1250\deff0\deflang1038{\fonttbl{\f0\fnil\fcharset2 Symbol;}{\f1\fnil\fcharset238 MS Shell Dlg 2;}}\viewkind4\uc1\pard\f0\fs23\'c5\f1\fs17\par} diff --git a/sw/qa/extras/rtfimport/rtfimport.cxx b/sw/qa/extras/rtfimport/rtfimport.cxx index bf4b176f51ca..e3fddac5dd99 100644 --- a/sw/qa/extras/rtfimport/rtfimport.cxx +++ b/sw/qa/extras/rtfimport/rtfimport.cxx @@ -64,7 +64,7 @@ public: virtual void preTest(const char* filename) SAL_OVERRIDE { m_aSavedSettings = Application::GetSettings(); - if (OString(filename) == "fdo48023.rtf") + if (OString(filename) == "fdo48023.rtf" || OString(filename) == "fdo72031.rtf") { AllSettings aSettings(m_aSavedSettings); aSettings.SetLanguageTag(LanguageTag("ru")); @@ -80,7 +80,7 @@ public: virtual void postTest(const char* filename) SAL_OVERRIDE { - if (OString(filename) == "fdo48023.rtf" || OString(filename) == "fdo44211.rtf") + if (OString(filename) == "fdo48023.rtf" || OString(filename) == "fdo72031.rtf" || OString(filename) == "fdo44211.rtf") Application::SetSettings(m_aSavedSettings); } @@ -2048,6 +2048,11 @@ DECLARE_RTFIMPORT_TEST(testFdo85889mac, "fdo85889-mac.rtf") CPPUNIT_ASSERT_EQUAL(aExpected, xTextRange->getString()); } +DECLARE_RTFIMPORT_TEST(testFdo72031, "fdo72031.rtf") +{ + OUString aExpected("\xc3\x85", 2, RTL_TEXTENCODING_UTF8); + CPPUNIT_ASSERT_EQUAL(aExpected, getRun(getParagraph(1), 1)->getString()); +} CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx index 27e0ab227452..b61f5a764074 100644 --- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx +++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx @@ -276,7 +276,7 @@ RTFDocumentImpl::RTFDocumentImpl(uno::Reference<uno::XComponentContext> const& x m_bObject(false), m_aFontTableEntries(), m_nCurrentFontIndex(0), - m_nCurrentEncoding(0), + m_nCurrentEncoding(-1), m_nDefaultFontIndex(-1), m_aStyleTableEntries(), m_nCurrentStyleIndex(0), @@ -639,8 +639,14 @@ rtl_TextEncoding RTFDocumentImpl::getEncoding(int nFontIndex) { std::map<int, rtl_TextEncoding>::iterator it = m_aFontEncodings.find(nFontIndex); if (it != m_aFontEncodings.end()) + // We have a font encoding associated to this font. return it->second; - return msfilter::util::getBestTextEncodingFromLocale(Application::GetSettings().GetLanguageTag().getLocale()); + else if (m_aDefaultState.nCurrentEncoding != rtl_getTextEncodingFromWindowsCharset(0)) + // We have a default encoding. + return m_aDefaultState.nCurrentEncoding; + else + // Guess based on locale. + return msfilter::util::getBestTextEncodingFromLocale(Application::GetSettings().GetLanguageTag().getLocale()); } else return m_pSuperstream->getEncoding(nFontIndex); @@ -1154,10 +1160,10 @@ void RTFDocumentImpl::text(OUString& rString) case DESTINATION_FONTENTRY: { m_aFontNames[m_nCurrentFontIndex] = aName; - if (m_nCurrentEncoding > 0) + if (m_nCurrentEncoding >= 0) { m_aFontEncodings[m_nCurrentFontIndex] = m_nCurrentEncoding; - m_nCurrentEncoding = 0; + m_nCurrentEncoding = -1; } m_aStates.top().aTableAttributes.set(NS_ooxml::LN_CT_Font_name, RTFValue::Pointer_t(new RTFValue(aName))); @@ -2831,16 +2837,16 @@ int RTFDocumentImpl::dispatchFlag(RTFKeyword nKeyword) m_aStates.top().nCurrentEncoding = RTL_TEXTENCODING_MS_1252; break; case RTF_MAC: - m_nCurrentEncoding = RTL_TEXTENCODING_APPLE_ROMAN; - m_aStates.top().nCurrentEncoding = m_nCurrentEncoding; + m_aDefaultState.nCurrentEncoding = RTL_TEXTENCODING_APPLE_ROMAN; + m_aStates.top().nCurrentEncoding = m_aDefaultState.nCurrentEncoding; break; case RTF_PC: - m_nCurrentEncoding = RTL_TEXTENCODING_IBM_437; - m_aStates.top().nCurrentEncoding = m_nCurrentEncoding; + m_aDefaultState.nCurrentEncoding = RTL_TEXTENCODING_IBM_437; + m_aStates.top().nCurrentEncoding = m_aDefaultState.nCurrentEncoding; break; case RTF_PCA: - m_nCurrentEncoding = RTL_TEXTENCODING_IBM_850; - m_aStates.top().nCurrentEncoding = m_nCurrentEncoding; + m_aDefaultState.nCurrentEncoding = RTL_TEXTENCODING_IBM_850; + m_aStates.top().nCurrentEncoding = m_aDefaultState.nCurrentEncoding; break; case RTF_PLAIN: { |