Gdal 在 shape 文件中写入 中文 字符显示乱码的解决方案

网友给出的解决 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;
	}

我自己的工程,这样设置后,即解决了中文乱码问题,希望对大家有所帮助。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值