X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/914955aaa034862c3b9b827463cde26455d06c79..a6140a4c171601c75c8ab91e8c79bc7f28df8266:/src/common/strconv.cpp diff --git a/src/common/strconv.cpp b/src/common/strconv.cpp index 20ff6f49ef..88e49338d7 100644 --- a/src/common/strconv.cpp +++ b/src/common/strconv.cpp @@ -363,36 +363,13 @@ size_t wxMBConvLibc::WC2MB(char *buf, const wchar_t *psz, size_t n) const // wxConvBrokenFileNames // ---------------------------------------------------------------------------- -wxConvBrokenFileNames::wxConvBrokenFileNames() +wxConvBrokenFileNames::wxConvBrokenFileNames(const wxChar *charset) { - // decide which conversion to use for the file names - - // (1) this variable exists for the sole purpose of specifying the encoding - // of the filenames for GTK+ programs, so use it if it is set - wxString encName(wxGetenv(_T("G_FILENAME_ENCODING"))); - encName.MakeUpper(); - if ( !encName.empty() && encName != _T("UTF-8") && encName != _T("UTF8") ) - { - m_conv = new wxCSConv(encName); - } - else // no G_FILENAME_ENCODING - { - if ( encName.empty() ) - encName = wxLocale::GetSystemEncodingName().Upper(); - - // (2) if a non default locale is set, assume that the user wants his - // filenames in this locale too - if ( !encName.empty() && encName != _T("UTF-8") && encName != _T("UTF8") ) - { - wxSetEnv(_T("G_FILENAME_ENCODING"), encName); - m_conv = new wxMBConvLibc; - } - else - { - // (3) finally use UTF-8 by default - m_conv = new wxMBConvUTF8(wxMBConvUTF8::MAP_INVALID_UTF8_TO_OCTAL); - } - } + if ( !charset || wxStricmp(charset, _T("UTF-8")) == 0 + || wxStricmp(charset, _T("UTF8")) == 0 ) + m_conv = new wxMBConvUTF8(wxMBConvUTF8::MAP_INVALID_UTF8_TO_OCTAL); + else + m_conv = new wxCSConv(charset); } size_t @@ -647,6 +624,15 @@ size_t wxMBConvUTF8::MB2WC(wchar_t *buf, const char *psz, size_t n) const if (buf) *buf++ = cc; len++; + + // escape the escape character for octal escapes + if ((m_options & MAP_INVALID_UTF8_TO_OCTAL) + && cc == '\\' && (!buf || len < n)) + { + if (buf) + *buf++ = cc; + len++; + } } else { @@ -784,6 +770,14 @@ size_t wxMBConvUTF8::WC2MB(char *buf, const wchar_t *psz, size_t n) const *buf++ = (char)(cc - wxUnicodePUA); len++; } + else if ( (m_options & MAP_INVALID_UTF8_TO_OCTAL) + && cc == L'\\' && psz[0] == L'\\' ) + { + if (buf) + *buf++ = (char)cc; + psz++; + len++; + } else if ( (m_options & MAP_INVALID_UTF8_TO_OCTAL) && cc == L'\\' && isoctal(psz[0]) && isoctal(psz[1]) && isoctal(psz[2]) )