将 UTF-8 PostgreSQL DB 转换为 WIN-1255 Shapefile
-
19-09-2019 - |
题
我有一个 PostgreSQL\PostGIS 空间数据库,其中包含希伯来语文本列。系统运行在 Ubuntu 上,一切都可以完美地使用 UTF-8。
我正在尝试将一些表转储到只能读取 Windows-1255 字符串的 Windows 程序的 shapefile 中。很遗憾, pgsql2shp 虽然没有编码选项 shp2pgsql 有,因此 Widnows 程序读取解析为 Windows-1255 的 UTF-8,给出乱码。
我一直在尝试为表列创建 Windows-1255 视图,但发现没有办法在不损坏数据库的情况下做到这一点。
有什么想法如何转换表格吗?
谢谢,
亚当
更新:
我认为这个问题已经解决了(请参阅我自己的答案),但我仍然遇到随机错误,例如:
ERROR: character 0x9f of encoding "WIN1255" has no equivalent in "UTF8"
我想要的是某种省略功能:喜欢 iconv
的 -c
flag,它只是不复制没有等效 int 目标编码的源字符。
解决方案
如果你真的指的是 ASCII,你不可能拯救希伯来字符。ASCII 仅仅是 7 位字符集 \x7F
.
那么这个Windows程序读取什么样的字符串呢?如果它是 ASCII 或 Latin-1,您将永远无法得到希伯来语。更有可能的是“当前系统代码页”,在 Windows 中也被称为“ANSI”(具有误导性,但通常)。
如果是这种情况,您必须将运行 Windows 程序的每台计算机上的系统代码页设置为希伯来语(代码页 1255)。我相信 shp 文件根本没有字符编码信息,因此 shapefile 只能在具有此代码页集的计算机上正常工作(默认仅在以色列语言环境中)。(显然 .dbf
出口可以有一个伴随的 .cpg
文件来指定编码,但我不知道您使用的程序是否支持该编码。)
然后,您必须将数据导出为代码页 1255,或者您在 Postgres 中获得的最接近的代码页 ISO-8859-8。由于导出脚本除了直接从数据库获取字节之外似乎没有任何选项可以执行任何操作,因此您必须以 ISO-8859-8 编码创建数据库并从 UTF-8 数据库传输所有数据到 8859-8,要么直接通过查询,要么更容易,使用 pgdumpall
将 SQL 加载到记事本中,然后将其重新保存为希伯来语而不是 UTF-8(随时调整 SQL DDL 中列出的任何编码设置)。
我想知道是否可以说服Windows程序的制造者支持UTF-8?在本世纪,被代码页特定的软件困住有点令人难过。
其他提示
从 bash 脚本中:
select ENCODING in UTF8 WIN1252 WIN1255 ISO-8859-8;
do
if [[ -n $ENCODING ]]; then
export PGCLIENTENCODING=$ENCODING;
break
else
echo 'Invalid encoding.'
fi
done
这 export PGCLIENTENCODING=$ENCODING;
声明可以解决问题。
检查希伯来语编码表和页面表,您可以看到 ISO-8859-8 和 Windows-1255 没有映射 0x9f
.
您尝试转换的数据可能基于较旧的数据 代码页 862,在DOS下的希伯来语代码页面。Codepage 862
映射代码 0x9f
对于Unicode字符“拉丁小字母f with Hook”, 0x0192
.
您可以调查类似的“随机”错误,并决定数据中非 windows-1255 代码的映射。