diff --git a/src/metaImage.cxx b/src/metaImage.cxx index 306869f..1bfd3e1 100644 --- a/src/metaImage.cxx +++ b/src/metaImage.cxx @@ -334,7 +334,7 @@ MetaImage::PrintInfo() const std::cout << "ElementData = " << ((m_ElementData == nullptr) ? "NULL" : "Valid") << std::endl; - std::cout << "ElementDataFileName = " << m_ElementDataFileName << std::endl; + std::cout << "ElementDataFileName = " << MET_FromUtf8ToLocalEncoding(m_ElementDataFileName) << std::endl; } void @@ -859,7 +859,7 @@ MetaImage::ElementDataFileName() const void MetaImage::ElementDataFileName(const char * _elementDataFileName) { - m_ElementDataFileName = _elementDataFileName; + m_ElementDataFileName = MET_FromLocalToUtf8Encoding(_elementDataFileName); } void * @@ -1172,7 +1172,6 @@ MetaImage::CanReadStream(std::ifstream * _stream) return false; } - bool MetaImage::ReadStream(int _nDims, std::ifstream * _stream, bool _readElements, void * _buffer) { @@ -1372,11 +1371,11 @@ MetaImage::ReadStream(int _nDims, std::ifstream * _stream, bool _readElements, v { if (usePath && !FileIsFullPath(m_ElementDataFileName.c_str())) { - fName = pathName + m_ElementDataFileName; + fName = pathName + MET_FromUtf8ToLocalEncoding(m_ElementDataFileName); } else { - fName = m_ElementDataFileName; + fName = MET_FromUtf8ToLocalEncoding(m_ElementDataFileName); } auto * readStreamTemp = new std::ifstream; @@ -1485,7 +1484,7 @@ MetaImage::Write(const char * _headName, if (pathName == elementPathName) { elementPathName = m_ElementDataFileName.substr(pathName.length()); - m_ElementDataFileName = elementPathName; + m_ElementDataFileName = MET_FromLocalToUtf8Encoding(elementPathName); } } diff --git a/src/metaUtils.cxx b/src/metaUtils.cxx index 5e84d33..fb88427 100644 --- a/src/metaUtils.cxx +++ b/src/metaUtils.cxx @@ -1800,6 +1800,75 @@ MET_SwapByteIfSystemMSB(void * val, MET_ValueEnumType _type) } } +#if defined(_WIN32) + +namespace +{ + +std::wstring +ToWide(const std::string & str, UINT encoding) +{ + std::wstring wstr; + const int wlength = MultiByteToWideChar(encoding, 0, str.data(), int(str.size()), nullptr, 0); + if (wlength > 0) + { + wchar_t * wdata = new wchar_t[wlength]; + int r = MultiByteToWideChar(encoding, 0, str.data(), int(str.size()), wdata, wlength); + if (r > 0) + { + wstr = std::wstring(wdata, wlength); + } + delete[] wdata; + } + return wstr; +} + +std::string +ToNarrow(const std::wstring & str, int encoding) +{ + std::string nstr; + int length = WideCharToMultiByte(encoding, 0, str.c_str(), int(str.size()), nullptr, 0, nullptr, nullptr); + if (length > 0) + { + char * data = new char[length]; + int r = WideCharToMultiByte(encoding, 0, str.c_str(), int(str.size()), data, length, nullptr, nullptr); + if (r > 0) + { + nstr = std::string(data, length); + } + delete[] data; + } + return nstr; +} + +} // namespace + +std::string +MET_FromUtf8ToLocalEncoding(const std::string & str) +{ + return ToNarrow(ToWide(str, CP_UTF8), CP_ACP); +} + +std::string +MET_FromLocalToUtf8Encoding(const std::string & str) +{ + return ToNarrow(ToWide(str, CP_ACP), CP_UTF8); +} +#else +// other operating systems use UTF-8 encoding by default (?) +std::string +MET_FromUtf8ToLocalEncoding(const std::string & str) +{ + return str; +} + +std::string +MET_FromLocalToUtf8Encoding(const std::string & str) +{ + return str; +} +#endif + #if (METAIO_USE_NAMESPACE) }; #endif diff --git a/src/metaUtils.h b/src/metaUtils.h index e96fdce..cab3ed3 100644 --- a/src/metaUtils.h +++ b/src/metaUtils.h @@ -435,6 +435,14 @@ METAIO_EXPORT char * MET_ReadSubType(std::istream & _fp); +METAIO_EXPORT +std::string +MET_FromUtf8ToLocalEncoding(const std::string& str); + +METAIO_EXPORT +std::string +MET_FromLocalToUtf8Encoding(const std::string& str); + # if (METAIO_USE_NAMESPACE) }; # endif