2

Context : I am using pg_dump.exe to automate a backup of my PostgreSQL base. I started writing a batch file to be executed in Command Line, but I was struggling to format the current date and time for it to be passed to the name of the backup file. For this reason, I decided to move to PowerShell.

Problem : When I executed pg_dump from command line, the output was correctly printed : my locale is French and you can see on the screenshot below that the output is correctly formatted, more specifically the accented characters such as é, è, etc. are properly printed.

enter image description here

But when doing the same in PowerShell, the accented characters are messed up:

enter image description here

I already switched the PowerShell output encoding to UTF-8 (see my code below), but it doesn't solve the issue.

My code :

#--------------------------------#
# script pour réaliser des sauvegardes automatiques de la base SQL
# Robin Bourgeon octobre 2018
#--------------------------------#
$OutputEncoding = New-Object -typename System.Text.UTF8Encoding

$app = 'C:\Program Files\PostgreSQL\9.5\bin\pg_dump.exe'
$args = @('--file=C:\Users\rbourgeon\Desktop\test_backup_psql\backup_test.backup','--format=c','--no-owner','--verbose','--no-privileges','--dbname=base_test_sauvegarde','--host=localhost','--port=5432',
'--username=postgres','--no-password','--role=postgres','--clean','--if-exists')
& $app $args 2>&1 | %{ "$_" }
2
  • You are not actually using the $OutputEncoding variable in which you stored the encoding itself. Commented Oct 19, 2018 at 11:11
  • This isn't UTF8. UTF8 uses two or more bytes for any character outside the ANSI region. Commented Oct 19, 2018 at 12:16

1 Answer 1

3

Resources

According to the first thread, the console output is acting a bit strange but here is how to change its encoding:

[Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding("ISO-8859-1")

That being said, it does not necessarily work as expected in the classic PowerShell console as can be seen below.

I would then suggest piping the output to a file and managing the encoding at that point.

[System.IO.File]::WriteAllText("\\path\to\file", $_, [System.Text.Encoding]::GetEncoding("ISO-8859-1"))

This is obviously sub-optimal...

MWE

$Latin1 = [System.Text.Encoding]::GetEncoding("ISO-8859-1")
[Console]::OutputEncoding = $Latin1

$Output = @"
Les Représentants du Peuple Français, constitués en Assemblée Nationale, considérant que l'ignorance, l'oubli ou le mépris des droits de l'Homme sont les seules causes des malheurs publics et de la corruption des Gouvernements, ont résolu d'exposer, dans une Déclaration solennelle, les droits naturels, inaliénables et sacrés de l'Homme, afin que cette Déclaration, constamment présente à tous les Membres du corps social, leur rappelle sans cesse leurs droits et leurs devoirs ; afin que les actes du pouvoir législatif, et ceux du pouvoir exécutif, pouvant être à chaque instant comparés avec le but de toute institution politique, en soient plus respectés ; afin que les réclamations des citoyens, fondées désormais sur des principes simples et incontestables, tournent toujours au maintien de la Constitution et au bonheur de tous.
"@

Write-Host $Output

[System.IO.File]::WriteAllText("test.txt", $Output, $Latin1)

Output

PowerShell v5

Les Représentants du Peuple Français, constitués en Assemblée Nationale, considérant que l'ignorance, l'oubli ou le mépris des droits de l'Homme sont les seules causes des malheurs publics et de la corruption des Gouvernements, ont résolu d'exposer, dans une Déclaration solennelle, les droits naturels, inaliénables et sacrés de l'Homme, afin que cette Déclaration, constamment présente à tous les Membres du corps social, leur rappelle sans cesse leurs droits et leurs devoirs ; afin que les actes du pouvoir législatif, et ceux du pouvoir exécutif, pouvant être à chaque instant comparés avec le but de toute institution politique, en soient plus respectés ; afin que les réclamations des citoyens, fondées désormais sur des principes simples et inconOutputables, tournent toujours au maintien de la Constitution et au bonheur de tous.

PowerShell Core v6

Les Représentants du Peuple Français, constitués en Assemblée Nationale, considérant que l'ignorance, l'oubli ou le mépris des droits de l'Homme sont les seules causes des malheurs publics et de la corruption des Gouvernements, ont résolu d'exposer, dans une Déclaration solennelle, les droits naturels, inaliénables et sacrés de l'Homme, afin que cette Déclaration, constamment présente à tous les Membres du corps social, leur rappelle sans cesse leurs droits et leurs devoirs ; afin que les actes du pouvoir législatif, et ceux du pouvoir exécutif, pouvant être à chaque instant comparés avec le but de toute institution politique, en soient plus respectés ; afin que les réclamations des citoyens, fondées désormais sur des principes simples et incontestables, tournent toujours au maintien de la Constitution et au bonheur de tous.

Output file

Les Représentants du Peuple Français, constitués en Assemblée Nationale, considérant que l'ignorance, l'oubli ou le mépris des droits de l'Homme sont les seules causes des malheurs publics et de la corruption des Gouvernements, ont résolu d'exposer, dans une Déclaration solennelle, les droits naturels, inaliénables et sacrés de l'Homme, afin que cette Déclaration, constamment présente à tous les Membres du corps social, leur rappelle sans cesse leurs droits et leurs devoirs ; afin que les actes du pouvoir législatif, et ceux du pouvoir exécutif, pouvant être à chaque instant comparés avec le but de toute institution politique, en soient plus respectés ; afin que les réclamations des citoyens, fondées désormais sur des principes simples et incontestables, tournent toujours au maintien de la Constitution et au bonheur de tous.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.