Javascript 加载具有非UTF8格式属性的shapefile
我可以在传单中成功加载和显示形状文件。但是,当我尝试访问功能属性时,字符都被损坏了。为了调查,我定义了以下函数:Javascript 加载具有非UTF8格式属性的shapefile,javascript,character-encoding,leaflet,Javascript,Character Encoding,Leaflet,我可以在传单中成功加载和显示形状文件。但是,当我尝试访问功能属性时,字符都被损坏了。为了调查,我定义了以下函数: function unpack(str) { var codePoints = []; for(var i = 0; i < str.length; i++) codePoints.push( str.charCodeAt(i) ); return codePoints; }; 加载应用程序时,我在控制台阵列上看到如下所示: const
function unpack(str) {
var codePoints = [];
for(var i = 0; i < str.length; i++)
codePoints.push( str.charCodeAt(i) );
return codePoints;
};
加载应用程序时,我在控制台阵列上看到如下所示:
const options = {
onEachFeature: (feature, layer) => {
console.log(unpack(feature.properties.NAME));
}
};
L.shapefile(url, options);
[65533,65533,65533,65533,65533,65533,65533,65533,65533,65533,65533,65533,65533,65533]
。。。对应于
值得一提的是,我使用二进制编辑器检查了*.dbf文件,并确定
feature.properties.NAME
是在ISO 8859-7(ISO拉丁/希腊字母表)中给出的。让我们深入了解一下如何从特性属性处理字符串
首先,如果您了解一点,您将熟悉以下事实:.shp
文件保存几何图形,.dbf
文件保存属性。每个要素的数据在这些文件之间分割
因此,shapefile.shapefile依赖于执行解析,而shapefilejs依赖于读取.dbf
文件的内容。阅读a表明通过以下方式支持多字符编码:
因此,可以使用缓冲区
调用parseDBF
模块以获取DBF文件的内容,并传递一个带有iconv兼容编码的字符串
现在,shapefilejs是否使用此功能?让我们再次:
这意味着“如果存在.dbf
文件,请使用.dbf
文件的内容和.cpg
文件的内容调用parseDBF
”。等等,为什么它在读.cpg
文件?这是什么意思?答案在任何shapefile侧车文件列表中,例如:
.cpg
-用于指定用于标识要使用的字符编码的代码页(仅适用于.dbf)
这应该表明传单shapefile正在按预期处理字符编码-它从右侧car文件读取编码信息,并通过iconv-lite
对.dbf
文件中的字符串进行解码。您应该检查该侧车文件是否存在,以及该文件的内容是否为所需的字符编码
请注意(和)远未完成(与)。也许您的
.cpg
文件还可以,但不支持该文本编码。没有*.cpg文件,所以我创建了一个,并添加了一行“UTF-8859-7”(也尝试了“1253”)。没有运气,我想这是有道理的,因为这种编码不在iconv-lite
支持的编码中。我接受这个答案,尽管我显然无法确认解决方案。我认为iconv lite
仅支持ISO-8859-1和ISO-8859-16,而iconv
支持所有ISO-8859-*编码。我会尝试破解node\u modules/parseDBF/decoder.js
,将其切换到iconv
(加上npm安装iconv
),然后重新捆绑所有内容。
module.exports = function(buffer, encoding) {
var decoder = createDecoder(encoding);
// ...etc...
if (zip[name + '.dbf']) {
dbf = parseDbf(zip[name + '.dbf'], zip[name + '.cpg']);
}