Преобразование базы данных PostgreSQL UTF-8 в шейп-файл WIN-1255
-
19-09-2019 - |
Вопрос
У меня есть пространственная база данных PostgreSQL\PostGIS, содержащая текстовые столбцы на иврите.Система работает на Ubuntu, и с UTF-8 все работает безупречно.
Я пытаюсь записать некоторые таблицы в шейп-файл для программы Windows, которая может читать только строки Windows-1255.К сожалению, pgsql2shp не имеет опции кодирования, хотя shp2pgsql есть, поэтому программа Widnows читает UTF-8, анализируемую как Windows-1255, что дает тарабарщину.
Я пытался создать представление Windows-1255 для столбцов таблицы, но не нашел способа сделать это без повреждения базы данных.
Есть идеи, как конвертировать таблицы?
Спасибо,
Адам
ОБНОВЛЯТЬ:
Я думал, что эта проблема решена (см. Мой собственный ответ), но я все еще получаю случайные ошибки, такие как:
ERROR: character 0x9f of encoding "WIN1255" has no equivalent in "UTF8"
Мне нужна какая-то функция пропуска:нравиться iconv
's -c
флаг, который просто не копирует исходные символы, не имеющие эквивалентной целевой кодировки int.
Решение
Если вы действительно имеете в виду ASCII, вы не сможете спасти символы иврита.ASCII — это всего лишь 7-битный символ, настроенный для \x7F
.
Итак, какие строки читает эта программа для Windows?Если это ASCII или Latin-1, вы никогда не получите иврит.Скорее всего, это «текущая системная кодовая страница», также (ошибочно, но широко известная) в Windows как «ANSI».
В этом случае вам придется установить системную кодовую страницу на каждом компьютере, на котором запущена программа Windows, на иврит (кодовая страница 1255).Я считаю, что файлы shp вообще не содержат информации о кодировке символов, поэтому шейп-файлы будут корректно работать только на компьютерах с этой установленной кодовой страницей (по умолчанию только в языковом стандарте Израиля).(Видимо .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;
заявление делает свое дело.
Проверка таблиц и еврейских таблиц и таблицы страниц, вы можете увидеть, что ИСО-8859-8 и Windows-1255 не иметь карт для 0x9f
.
Данные, которые вы пытаетесь преобразовать, могут быть основаны на более старых Кодовая страница 862, кодовая страница для иврита под DOS.Codepage 862
отображает код 0x9f
к символу Unicode "Латинская маленькая буква f с крючком", 0x0192
.
Вы можете исследовать подобные «случайные» ошибки и принять решение о сопоставлении кодов, отличных от Windows 1255, в данных.