Ваш код правильно запрашивает в сеансе использование кодировки UTF-8 с этим утверждением:
$PSDefaultParameterValues['*:Encoding'] = 'utf8'
См. Документацию к словарю предустановок параметров , реализованных через переменную предпочтения $PSDefaultParameterValues
.
Следовательно, в вашем случае -Encoding UTF8
неявно в действии в вызовах любых командлетов с параметром -Encoding
, таких как Import-Csv
.
Следовательно:
Ваш Import-Csv
вызов делает прочитайте ваш CSV-файл как UTF-8.
Тем не менее, ваш симптом (значения не печатаются правильно в консоли) предполагает, что ваш входной файл CSV на самом деле не является UTF- 8-кодированный .
Таким образом, решение состоит в том, чтобы определить фактическую кодировку файла CSV [1] и передайте его имя параметру
-Encoding
:
Учитывая, что, как вы уже подтвердили, фактическая кодировка вашего файла была ANSI (фиксированное пение кодирование по байтам, определяемое активной устаревшей кодовой страницей вашей системы), используйте имя кодировки Default
в Windows PowerShell :
$voters = Import-Csv -Encoding Default -Delimiter ',' -Path C:\Users\Nobody\Desktop\mexico.csv
В PowerShell [Core] 6 + вам действительно нужно передать специфицированный c используемый код ANSI e, который в системах US-Engli sh является Windows-1252
, например (список поддерживаемых кодовых страниц см. В документации ; используйте либо значение из столбца «. NET Name», либо число из столбца «Identifier», но без начального 0
).
# Use the Windows-1252 ANSI encoding.
$voters = Import-Csv -Encoding 1252 -Delimiter ',' -Path C:\Users\Nobody\Desktop\mexico.csv
Примечание. Начиная с v7.0, поддержка имени кодировки Default
для ссылки на активную кодовую страницу ANSI по непонятным причинам не реализована - см. эту проблему GitHub ; Сделайте так, чтобы ваш голос был услышан там, если вы хотите, чтобы это изменилось.
Для всестороннего обзора поведения кодирования в PowerShell и его изменения между Windows PowerShell (версии вверх до v5.1) и PowerShell [Core] (версии, начиная с v6), см. этот ответ .
[1] Определение кодировки текстового файла:
Примечание. В PowerShell [Core] 6+ Get-Content
правильная печать текста файла на экране означает, что все командлеты будут правильно его интерпретировать; к сожалению, из-за крайне непоследовательного поведения командлетов в Windows PowerShell (версии до v5.1), что не всегда верно; Import-Csv
является основным примером, потому что по умолчанию используется кодировка ASCII (!) - см. этот ответ для справочной информации.