Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 加载具有非UTF8格式属性的shapefile_Javascript_Character Encoding_Leaflet - Fatal编程技术网

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']);
  }