| 77 | */ |
| 78 | |
| 79 | char CPL_DLL *CPLRecode(const char *pszSource, const char *pszSrcEncoding, |
| 80 | const char *pszDstEncoding) |
| 81 | |
| 82 | { |
| 83 | /* -------------------------------------------------------------------- */ |
| 84 | /* Handle a few common short cuts. */ |
| 85 | /* -------------------------------------------------------------------- */ |
| 86 | if (EQUAL(pszSrcEncoding, pszDstEncoding)) |
| 87 | return CPLStrdup(pszSource); |
| 88 | |
| 89 | if (EQUAL(pszSrcEncoding, CPL_ENC_ASCII) && |
| 90 | (EQUAL(pszDstEncoding, CPL_ENC_UTF8) || |
| 91 | EQUAL(pszDstEncoding, CPL_ENC_ISO8859_1))) |
| 92 | return CPLStrdup(pszSource); |
| 93 | |
| 94 | // A few hard coded CPxxx/ISO-8859-x to UTF-8 tables |
| 95 | if (EQUAL(pszDstEncoding, CPL_ENC_UTF8) && |
| 96 | CPLGetConversionTableToUTF8(pszSrcEncoding)) |
| 97 | { |
| 98 | return CPLRecodeStub(pszSource, pszSrcEncoding, pszDstEncoding); |
| 99 | } |
| 100 | |
| 101 | #ifdef CPL_RECODE_ICONV |
| 102 | /* -------------------------------------------------------------------- */ |
| 103 | /* CPL_ENC_ISO8859_1 -> CPL_ENC_UTF8 */ |
| 104 | /* and CPL_ENC_UTF8 -> CPL_ENC_ISO8859_1 conversions are handled */ |
| 105 | /* very well by the stub implementation which is faster than the */ |
| 106 | /* iconv() route. Use a stub for these two ones and iconv() */ |
| 107 | /* everything else. */ |
| 108 | /* -------------------------------------------------------------------- */ |
| 109 | if ((EQUAL(pszSrcEncoding, CPL_ENC_ISO8859_1) && |
| 110 | EQUAL(pszDstEncoding, CPL_ENC_UTF8)) || |
| 111 | (EQUAL(pszSrcEncoding, CPL_ENC_UTF8) && |
| 112 | EQUAL(pszDstEncoding, CPL_ENC_ISO8859_1))) |
| 113 | { |
| 114 | return CPLRecodeStub(pszSource, pszSrcEncoding, pszDstEncoding); |
| 115 | } |
| 116 | #ifdef _WIN32 |
| 117 | else if (((EQUAL(pszSrcEncoding, "CP_ACP") || |
| 118 | EQUAL(pszSrcEncoding, "CP_OEMCP")) && |
| 119 | EQUAL(pszDstEncoding, CPL_ENC_UTF8)) || |
| 120 | (EQUAL(pszSrcEncoding, CPL_ENC_UTF8) && |
| 121 | (EQUAL(pszDstEncoding, "CP_ACP") || |
| 122 | EQUAL(pszDstEncoding, "CP_OEMCP")))) |
| 123 | { |
| 124 | return CPLRecodeStub(pszSource, pszSrcEncoding, pszDstEncoding); |
| 125 | } |
| 126 | #endif |
| 127 | else |
| 128 | { |
| 129 | return CPLRecodeIconv(pszSource, pszSrcEncoding, pszDstEncoding); |
| 130 | } |
| 131 | #else // CPL_RECODE_STUB |
| 132 | return CPLRecodeStub(pszSource, pszSrcEncoding, pszDstEncoding); |
| 133 | #endif // CPL_RECODE_ICONV |
| 134 | } |
| 135 | |
| 136 | /************************************************************************/ |