使用gasparesganga/php-shapefile读取Shapefile时DBF编码转换错误求助
问题:php-shapefile库读取Shapefile时DBF字符集转换错误
我的代码实现如下:
public static function getShapefile(string $url): ?ShapefileReader { $shapefile = null; $tmp = Utils::tempdir(prefix: 'icmbio_'); $fileName = ZIP::getFrom($url, $tmp); ZIP::extractTo($fileName, $tmp); $content = Utils::readDir($tmp); if (!empty($content)) { $basename = pathinfo(reset($content), PATHINFO_FILENAME); $path = "$tmp/$basename"; $shapefile = new ShapefileReader($path); } Utils::closeDir($tmp); return $shapefile; }
解压包含shp、shx、dbf、qmd、prj、cpg文件的压缩包后读取,出现以下错误:
#message: "Error during conversion from provided DBF input charset to UTF-8" #code: 0 #file: "/var/www/vendor/gasparesganga/php-shapefile/src/Shapefile/ShapefileReader.php" #line: 335 -error_type: "ERR_DBF_CHARSET_CONVERSION"
传入Shapefile::OPTION_IGNORE_FILE_DBF => true后不再报错,但会丢失DBF数据,请问有哪些DBF相关配置选项可以解决这个问题?
解决方案:可用的DBF相关配置选项
1. 手动指定DBF输入编码
库默认会读取CPG文件获取编码,但如果CPG文件内容无效或编码识别失败,可通过Shapefile::OPTION_DBF_INPUT_ENCODING强制指定DBF文件的实际字符编码(比如ISO-8859-1、Windows-1252、GBK等)。
修改实例化代码:
$shapefile = new ShapefileReader($path, [ Shapefile::OPTION_DBF_INPUT_ENCODING => 'ISO-8859-1' // 替换为你的DBF实际编码 ]);
2. 自定义编码转换回调
如果内置的编码转换函数失败,可通过Shapefile::OPTION_DBF_ENCODING_CONVERTER传入自定义回调函数,自己处理DBF字段内容的编码转换:
$shapefile = new ShapefileReader($path, [ Shapefile::OPTION_DBF_ENCODING_CONVERTER => function ($inputString, $inputCharset) { // 这里用你自己的转换逻辑,比如mb_convert_encoding或iconv return mb_convert_encoding($inputString, 'UTF-8', $inputCharset); } ]);
3. 验证CPG文件内容
检查解压后的CPG文件,确保里面的编码名称是PHP支持的字符集(比如UTF-8、ISO-8859-1),如果CPG文件内容是错误的编码名(比如拼写错误),会导致库无法正确识别编码,进而触发转换错误。
内容的提问来源于stack exchange,提问作者Vowkaz
相关产品推荐
相关产品推荐

