#postgresql #filenames
#postgresql #имена файлов
Вопрос:
Я использую Postgres 10 и pg_dump pg_restore, которые поставляются с ним. теперь pg_dump и pg_restore выдают мне ошибку при попытке дампа восстановления файла или пути, содержащего арабские шрифты (не тестировал никаких шрифтов, кроме английского и арабского)
Вот исключение для попытки восстановить имя файла, в котором нет английских (например, арабских) символов.
.pg_dump.exe --file "C:אTOC.DUMP" --host "localhost" --port "1111" --username "MyUserName" --verbose --format=c --blobs --compress "1" --schema "MySchema" "MyDBName"
Система.Исключение: pg_restore: [пользовательский архиватор] не удалось открыть ввод
файл «C:?TOC.DUMP «:
Недопустимый аргумент
И то же исключение, когда путь к файлу содержит арабские шрифты.
Все работает нормально при использовании английских шрифтов для FileName FilePath.
Итак, я искал здесь и в документации Google и PostgreSQL и не смог найти соответствующую тему, за исключением того факта, что у pg_dump pg_restore нет проблем со сценариями, которые содержат арабскую и ивритскую кодировку, но ничего не было упомянуто о кодировке самого имени файла.
как я это решил? Я этого не сделал. Я не мог прекратить отправку своих проектов из-за этой проблемы.
итак, в качестве временного решения я запрещаю пользователю использовать арабские шрифты с помощью этого кода здесь, это не очень хороший способ делать то, что вы знаете.
// C#
BackUpPath = fileDialog.FileName;
var westernLatin = Encoding.GetEncoding(1252);
var arabic = Encoding.GetEncoding(1256);
var bytes = arabic.GetBytes(BackUpPath);
var result = westernLatin.GetString(bytes);
if (result != BackUpPath)
{
// Inform user to use English fonts for the file name and file path.
}
Ценю любую помощь, спасибо.
Комментарии:
1. Проблема может заключаться в том, что
cmd
используется кодировка, отличная от остальной части Windows. При решении проблем с кодировкой попробуйте найти фактические значения байтов, которые составляют символы. Либо это несоответствие, либоclient_encoding
установлено неправильно.2. laurenz-albe Вы были абсолютно правы, это дело консоли, в то время как для code_page консоли установлено значение 437 (Соединенные Штаты), эта кодовая страница была проблемой здесь, установка ее на консоли в UTF-8 сбрасывается после закрытия и повторного открытия консоли, установка ее из local, как вы подразумевали, прошла успешно, теперь я пытаюсь выяснить, как это сделать в коде, собираюсь попробовать установить кодовую страницу в Процесс, который я создал для работы с pg_dump pg_restore, и смотрите. Вы были слишком полезны, большое спасибо.
3. @LaurenzAlbe Я попытался предоставить аргументу процесса много разных аргументов кодирования = Encoding. По умолчанию. getString(кодировка.UTF8. getBytes (аргументы)); по-прежнему безуспешно. возможно, pg_dump и pg_restore используют строгую внутреннюю кодировку для аргументов, idk.
4. Возможно, это помогает установить переменную среды
PGCLIENTENCODING
в кодировку, используемую в вашейcmd
, не уверен.5. LaurenzAlbe: Как вы и ожидали, установка PGCLIENTENCODING в любую кодировку не вносит никаких изменений.