Open jborean93 opened 3 years ago
This likely won't do anything, but, what if you set the environment's encoding to non-BOM UTF8?
$global:OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = [System.Text.UTF8Encoding]::new()
Thanks @jborean93, we were able to successful reproduce this issue and identify the bug. We appreciate you taking the time to reproduce this bug, we are unsure when we will be able to fix this issue.
Because -Fix
reads the content of the file into a string, modifies it and then writes back to the string, the issue could either be in
This is a very tricky and time consuming one. Bear in mind that there is no standard for encoding and both .NET and editors apply heuristics to figure out the encoding of a file and therefore can get it wrong. My recommendation is to check the encoding in the diff editor before commiting files after using -Fix
as this parameter is usually just used for one off fixes of a whole codebase.
I personally don't think the onus should be on the user to detect the BOM that was added. If the file doesn't have a BOM then the formatter shouldn't be adding one. I'm unsure what the level of support PSSA has for WinPS but considering the default of PowerShell since v6 is to read BOM-less files as UTF-8 then I personally believe PSSA should output as UTF-8 if the input didn't have a BOM.
Putting aside the issues with detecting the encoding, scripts that only contain ASCII characters won't be affected by reading the script as 1 encoding and writing it as UTF-8 as the bytes will be all the same. Having a mismatch set of encoding values only affects non-ASCII characters. Even if WinPS was still a concern I honestly think having a default of UTF-8 as the output when no BOM was detected on the input will help encourage users to have a UTF-8 + BOM file in the first place. Relying on the default locale encoding is very brittle, especially when it comes to sharing scripts as the default could differ across hosts.
Steps to reproduce
Create a file with a fixable violation
Run
Invoke-ScriptAnalyzer -Path ./file.ps1 -Fix
to fix the violationExpected behavior
The violation is fixed but the BOM isn't added to the file. It should preserve whatever is there already.
Actual behavior
The violation is fixed but there is a UTF-8 BOM character added to the file
Note the
ef bb bf
(UTF-8 BOM) present. I tried explicitly ignoring the ruleUseBOMForUnicodeEncodedFile
as well but the BOM is still added.Environment data