网友给出的解决 gdal 中文字符乱码问题的方法,我尝试过一遍,均不管用,以下是我自己实践通过的方案,以供大家参考。
中文字符乱码,比如 std::string str = "中文";, 本质上 str 的编码是 gbk , 尽管代码文件编码是 utf-8,因此写入 shape 后显示为乱码。
以下是我的解决方案:
1. 注册时,按照如下设置,指定 utf-8 编码
// 支持中文路径
CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");
// 支持属相表中文字符
CPLSetConfigOption("SHAPE_ENCODING", "UTF-8");
GDALAllRegister();
2. 创建图层时,指定 utf-8 编码
char** papszOptions = nullptr;
papszOptions = CSLSetNameValue(papszOptions, "ENCODING", "UTF-8");
poLayer = poDS->CreateLayer("0", &spatialRef, GType, papszOptions);
3. 写入中文字段时,将字符转为 utf-8 编码的字符串
poFeature->SetField(i, GbkToUtf8(str).c_str());
// 将 中文 字符串转换为 utf-8
string GbkToUtf8(const char* src_str)
{
int len = MultiByteToWideChar(CP_ACP, 0, src_str, -1, NULL, 0);
wchar_t* wstr = new wchar_t[len + 1];
memset(wstr, 0, len + 1);
MultiByteToWideChar(CP_ACP, 0, src_str, -1, wstr, len);
len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
char* str = new char[len + 1];
memset(str, 0, len + 1);
WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);
string strTemp = str;
if (wstr) delete[] wstr;
if (str) delete[] str;
return strTemp;
}
我自己的工程,这样设置后,即解决了中文乱码问题,希望对大家有所帮助。