最近要用到qgis开发,运用到gdal库(一个操作各种栅格地理数据格式的库),在输出shp文件时,中文出现乱码,借鉴网上很多办法都没有解决(例:CPLSetConfigOption("SHAPE_ENCODING", ""); 修改cpg/bdf文件;修改电脑终端命令属性;修改文件编码格式等)。
开发环境:visual studio2013 (windows)
乱码如下:
原因分析:
shp文件读取时,图层的属性字段编码是utf-8的,windows下的string编码是gbk的,从shp读出来的utf-8的字符用gbk解码自然就乱码了。(如果在linux的环境下测试,就不会出现乱码)
网址: http://www.mytju.com/classcode/tools/messyCodeRecover.asp(乱码恢复)
从上面可以看出乱码的是GBK,正常输出应该是UTF-8。
方法1:将字符进行转换一下
// UTF8转std:string
// 转换过程:先将utf8转双字节Unicode编码,再通过WideCharToMultiByte将宽字符转换为多字节。
std::string UTF8_To_string(const std::string& str)
{
int nwLen = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, NULL, 0);
wchar_t* pwBuf = new wchar_t[nwLen + 1]; //一定要加1,不然会出现尾巴
memset(pwBuf, 0, nwLen * 2 + 2);
MultiByteToWideChar(CP_UTF8, 0, str.c_str(), str.length(), pwBuf, nwLen);
int nLen = WideCharToMultiByte(CP_ACP, 0, pwBuf, -1, NULL, NULL, NULL, NULL);
char* pBuf = new char[nLen + 1];
memset(pBuf, 0, nLen + 1);
WideCharToMultiByte(CP_ACP, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL);
std::string strRet = pBuf;
delete []pBuf;
delete []pwBuf;
pBuf = NULL;
pwBuf = NULL;
return strRet;
}
// std:string转UTF8
std::string string_To_UTF8(const std::string& str)
{
int nwLen = ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0);
wchar_t* pwBuf = new wchar_t[nwLen + 1]; //一定要加1,不然会出现尾巴
ZeroMemory(pwBuf, nwLen * 2 + 2);
::MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.length(), pwBuf, nwLen);
int nLen = ::WideCharToMultiByte(CP_UTF8, 0, pwBuf, -1, NULL, NULL, NULL, NULL);
char* pBuf = new char[nLen + 1];
ZeroMemory(pBuf, nLen + 1);
::WideCharToMultiByte(CP_UTF8, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL);
std::string strRet(pBuf);
delete []pwBuf;
delete []pBuf;
pwBuf = NULL;
pBuf = NULL;
return strRet;
}
输出如下:(进行对比)
方法2:修改 GDALOpenEx()的参数
GDALDatasetH CPL_DLL CPL_STDCALL GDALOpenEx( const char* pszFilename,
unsigned int nOpenFlags,
const char* const* papszAllowedDrivers,
const char* const* papszOpenOptions,
const char* const* papszSiblingFiles ) CPL_WARN_UNUSED_RESULT;
传入papszOpenOptions参数进行转换,调用CSLAddNameValue()进行变量赋值。
但是我进行操作时,还是未成功,问题不知道处在哪。
方法3:通过qgis软件进行shp文件的编码格式转换
修改过后,发现点击图层要素,显示的都是乱码,发现bdf文件更改编码,但是其他文件并未更改,经过测试还是乱码。(发现行不通,留在后面再去尝试)有些东西没有更改过来,感兴趣的可以去验证一下。
才开始学习这个,还有很多东西都不清楚,不明白,还得多花时间,一步一步来。