pg_dump и pg_restore не могут работать с именем файла, содержащим арабские шрифты

#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 в любую кодировку не вносит никаких изменений.