GDAL库中WFS服务中含有中文不能获取数据的问题
2014-01-18 11:43
676 查看
GDAL库中目前提供了对WFS服务发布的数据进行获取,目前发现对于中文的服务名称或者图层名为中文,GDAL不能正确识别。通过调试发现,其原因有下面两点:
1、输入的URL路径没有使用UTF8编码而从网页获取的内容全部都是由UTF8编码组成,造成图层名使用EQUAL进行比较的时候出现错误。
2、输入的URL路径使用%开始的UTF8编码,而GDAL没有对%的转义编码进行转义导致,GDAL直接认为%XX是一个字符串,而不认为是一个UTF8编码导致。
首先对获取的图层名不支持中文的问题进行修改,主要内容就是要求输入的URL中如果含有中文,必须全部使用%开始的UTF8转义编码输入,然后编写一个编码函数,对%开头的UTF8转义字符串转换为真正的UTF8编码,这样可以解决图层名是中文的问题,具体修改的代码如下。
在ogr_wfs.h文件中添加一个函数定义,用来将%开始的UTF8转义编码转为UTF8编码,函数定义和实现如下,定义放到ogr_wfs.h文件中,实现放到ogrwfsdatasource.cpp文件中。
line 754原始代码为:
经过测试发现还有一个问题,就是服务名称如果是中文的话,只能支持偶数个汉字的服务名称,奇数个汉字的服务名称还是不能正确获取到,具体的原因还是汉字UTF8的编码导致的,和之前写的那个C#版本支持中文的问题一样,具体解决方法和C#的那个一样,需要将从网页获取的WFS中的XML全部转码得到汉字,然后再进行处理,但是这样的话,整个驱动里面所有的都需要修改,所以暂时没有改动,我会将这个bug提交到GDAL库中。目前使用的话,建议发布的WFS服务名称最好不要有中文,实在有中文的话,那么也搞成偶数个汉字,图层名有没有中文以及中文个数是多少个,通过的上面的修改可以进行避免。不过上面的修改没有经过大量的测试,也可能会存在问题。
1、输入的URL路径没有使用UTF8编码而从网页获取的内容全部都是由UTF8编码组成,造成图层名使用EQUAL进行比较的时候出现错误。
2、输入的URL路径使用%开始的UTF8编码,而GDAL没有对%的转义编码进行转义导致,GDAL直接认为%XX是一个字符串,而不认为是一个UTF8编码导致。
首先对获取的图层名不支持中文的问题进行修改,主要内容就是要求输入的URL中如果含有中文,必须全部使用%开始的UTF8转义编码输入,然后编写一个编码函数,对%开头的UTF8转义字符串转换为真正的UTF8编码,这样可以解决图层名是中文的问题,具体修改的代码如下。
在ogr_wfs.h文件中添加一个函数定义,用来将%开始的UTF8转义编码转为UTF8编码,函数定义和实现如下,定义放到ogr_wfs.h文件中,实现放到ogrwfsdatasource.cpp文件中。
/************************************************************************/ /* WFS_DecodeURL() */ /************************************************************************/ CPLString WFS_DecodeURL(CPLString &osSrc) { CPLString ret; char ch; int ii; for (size_t i=0; i<osSrc.length(); i++) { if (int(osSrc[i])==37) { sscanf(osSrc.substr(i+1,2).c_str(), "%x", &ii); ch=static_cast<char>(ii); ret+=ch; i=i+2; } else { ret+=osSrc[i]; } } return (ret); }接下来修改Open函数中的相关位置,将图层名的编码进行转换。需要修改的地方有三个,都在Open函数里面,可能还有些地方没有找到。具体位置如下:
line 754原始代码为:
CPLHTTPResult* psResult = SendGetCapabilities(pszBaseURL, osTypeName);修改为,也就是将原来返回的osTypeName,使用上面写的函数转义一次,将转义的结果给osTypeName。
CPLString strOriginalTypeName = ""; CPLHTTPResult* psResult = SendGetCapabilities(pszBaseURL, strOriginalTypeName); osTypeName = WFS_DecodeURL(strOriginalTypeName);line 858:
osTypeName = CPLURLGetValue(pszBaseURL, "TYPENAME"); if( osTypeName.size() == 0 ) osTypeName = CPLURLGetValue(pszBaseURL, "TYPENAMES");修改为:
CPLString strOriginalTypeName = CPLURLGetValue(pszBaseURL, "TYPENAME"); if( strOriginalTypeName.size() == 0 ) strOriginalTypeName = CPLURLGetValue(pszBaseURL, "TYPENAMES"); osTypeName = WFS_DecodeURL(strOriginalTypeName);line 865:
CPLHTTPResult* psResult = SendGetCapabilities(pszBaseURL, osTypeName);修改为:
CPLHTTPResult* psResult = SendGetCapabilities(pszBaseURL, strOriginalTypeName); osTypeName = WFS_DecodeURL(strOriginalTypeName);修改完上面的三处,然后重新编译GDAL库,应该就可以支持中文的图层名称了,但是需要注意的是,传入的URL中的中文必须使用%转义的方式,不能直接使用中文,要不然还是会报错,获取不到图层信息。
经过测试发现还有一个问题,就是服务名称如果是中文的话,只能支持偶数个汉字的服务名称,奇数个汉字的服务名称还是不能正确获取到,具体的原因还是汉字UTF8的编码导致的,和之前写的那个C#版本支持中文的问题一样,具体解决方法和C#的那个一样,需要将从网页获取的WFS中的XML全部转码得到汉字,然后再进行处理,但是这样的话,整个驱动里面所有的都需要修改,所以暂时没有改动,我会将这个bug提交到GDAL库中。目前使用的话,建议发布的WFS服务名称最好不要有中文,实在有中文的话,那么也搞成偶数个汉字,图层名有没有中文以及中文个数是多少个,通过的上面的修改可以进行避免。不过上面的修改没有经过大量的测试,也可能会存在问题。
相关文章推荐
- GDAL库中WFS服务中含有中文不能获取数据的问题
- GDAL读取S-57海图数据中文属性值乱码问题解决
- getJSON获取JSON数据中文乱码问题
- 解答”打包成功后的apk不能和后台服务进行数据交互“的问题
- GDAL读取S-57海图数据中文属性值乱码问题解决
- 解决使用FusionCharts以后从后台获取数据中文乱码的问题
- volley获取json数据及中文乱码问题的解决
- 解决从JSP页面获取后台数据中文乱码问题?
- volley获取json数据及中文乱码问题的解决
- 客户端获取服务器数据中文乱码问题
- 【java web】解决流读完一次就不能再次获取body数据的问题
- javascript不能传递含有中文汉字的url问题
- 【已解决】本地测试时,MUI的AJAX方法不能获取数据的问题。
- WCF+Restfull服务 提交或获取数据时数据大小限制问题解决方案
- QNetworkAccessManager 实现FTP上传功能,解决 文件名是中文,QUrl含有中文路径 不能上传的问题
- 手机端调用接口获取图片路径带有中文名称不能获取的问题。
- 解决图片路径中含有中文在jsp下不能正常显示问题
- 关于64位系统上运行32位IIS,而不能调用的ODBC获取数据的问题。
- WML表单中文提交时,后台不能正确的获取中文的问题。
- 关于mysql数据库插入数据,不能插入中文和出现中文乱码问题