YanoRyuichi.com/
Wiki
Blog
GitHub
Sandbox
開始行:
* コマンドプロンプトなコマンドの入出力が文字化けする [#h2...
** 前提 [#yc27212a]
- PowerShellやWindowsの内部エンコーディングはUTF16
- 日本語WindowsだとコンソールのエンコーディングはSJISが既...
- SJISとUTF16の変換は自動で行われ、PowerShellなコマンドだ...
- しかし、コマンドプロンプトなコマンドは入出力が通常はSJI...
- Linux由来のコマンドは入出力は通常はUTF8(またはUS-ASCII...
- そのためコマンドレットと非PowerShellなコマンドを混ぜて...
- これを解決するには、(1)非PowerShellなコマンドのエンコー...
- 非PowerShellなコマンドはエンコーディングが固定になって...
- なお、エンコーディングは入力と出力それぞれ考慮する必要...
** PowerShellの出力エンコーディングをSJISへ変更する [#m7a...
PS> Get-Date (1)
2020年5月6日 17:42:00
PS> Get-Date | clip.exe (2)
- (1)は化けずにそのままコンソールに出力される
- (2)はclip.exeがUTF16に対応してないので、クリップボード...
- (ちなみにclip.exeは文字列をクリップボードにペーストす...
- これを解決するには以下のようにする
PS> $OutputEncoding = [Text.Encoding]::Default (1)
PS> Get-Date | clip.exe
- (1)のように$outputEncodingをSJISに指定するとPowerShell...
*** 補足 [#v4540451]
- なお、'''[Text.Encoding]::Default''' はSJISを表すが、以...
- その他のエンコーディング https://dobon.net/vb/dotnet/st...
PS> [Text.Encoding]::GetEncoding('sjis')
BodyName : iso-2022-jp
EncodingName : 日本語 (シフト JIS)
HeaderName : iso-2022-jp
WebName : shift_jis
WindowsCodePage : 932
IsBrowserDisplay : True
IsBrowserSave : True
IsMailNewsDisplay : True
IsMailNewsSave : True
IsSingleByte : False
EncoderFallback : System.Text.InternalEncoderBestFitFa...
DecoderFallback : System.Text.InternalDecoderBestFitFa...
IsReadOnly : True
CodePage : 932
#br
** PowerShellの入力エンコーディングを変更する [#o7f8e493]
PS> $OutputEncoding = [Text.Encoding]::GetEncoding('utf-...
PS> gc .\1.json -Encoding utf8 | jq.exe ...
{ ...
"a": "日本語",
"b": "英語"
}
- (1)でPowerShellの出力をUTF8にしたので、(3)で|からUTF8が...
- なお、1.jsonファイルがBOMなしのUTF8の場合はgc(Get-Conte...
- ここまではOK
PS> gc .\1.json | jq.exe | Select-String "日本語" ...
(2)
PS> [Console]::OutputEncoding = [Text.Encoding]::UTF8 (3)
PS> gc .\1.json | jq.exe | Select-String "日本語" ...
"a": "日本語", ...
- しかし、(1)のようにjq.exeの出力をPowerShellのSelect-Str...
- (jq.exeがBOMなしのUTF8を出力していて、|がそれを認識で...
- これを解決するには(3)のようにPowerShellの入力をUTF8にし...
** 補足:なんでこんな問題が起きるのか [#s4f29bde]
- Linuxのコマンドはパイプでつなげて使うが、パイプからは文...
- 一方で、PowerShellのコマンドはパイプからオブジェクトが...
- したがって、PowerShellをPowerShellらしく使いたいなら、...
- 今回の場合なら下のようにWSLのBashを呼び出すとかした方が...
*** Bash呼び出し [#rd515770]
PS> bash.exe -c 'cat 1.json | jq "." | grep "日本語"'
"a": "日本語",
*** CMD呼び出し [#t49a0f46]
PS> cmd /c 'type 1.json | jq "." | jvgrep "日本語"'
"a": "日本語",
#br
fzfを使うならこんな感じ、
PS> bash -c "find . | fzf"
** 参考 [#c7e34602]
https://ladybug.hatenadiary.org/entry/20111203/p1
終了行:
* コマンドプロンプトなコマンドの入出力が文字化けする [#h2...
** 前提 [#yc27212a]
- PowerShellやWindowsの内部エンコーディングはUTF16
- 日本語WindowsだとコンソールのエンコーディングはSJISが既...
- SJISとUTF16の変換は自動で行われ、PowerShellなコマンドだ...
- しかし、コマンドプロンプトなコマンドは入出力が通常はSJI...
- Linux由来のコマンドは入出力は通常はUTF8(またはUS-ASCII...
- そのためコマンドレットと非PowerShellなコマンドを混ぜて...
- これを解決するには、(1)非PowerShellなコマンドのエンコー...
- 非PowerShellなコマンドはエンコーディングが固定になって...
- なお、エンコーディングは入力と出力それぞれ考慮する必要...
** PowerShellの出力エンコーディングをSJISへ変更する [#m7a...
PS> Get-Date (1)
2020年5月6日 17:42:00
PS> Get-Date | clip.exe (2)
- (1)は化けずにそのままコンソールに出力される
- (2)はclip.exeがUTF16に対応してないので、クリップボード...
- (ちなみにclip.exeは文字列をクリップボードにペーストす...
- これを解決するには以下のようにする
PS> $OutputEncoding = [Text.Encoding]::Default (1)
PS> Get-Date | clip.exe
- (1)のように$outputEncodingをSJISに指定するとPowerShell...
*** 補足 [#v4540451]
- なお、'''[Text.Encoding]::Default''' はSJISを表すが、以...
- その他のエンコーディング https://dobon.net/vb/dotnet/st...
PS> [Text.Encoding]::GetEncoding('sjis')
BodyName : iso-2022-jp
EncodingName : 日本語 (シフト JIS)
HeaderName : iso-2022-jp
WebName : shift_jis
WindowsCodePage : 932
IsBrowserDisplay : True
IsBrowserSave : True
IsMailNewsDisplay : True
IsMailNewsSave : True
IsSingleByte : False
EncoderFallback : System.Text.InternalEncoderBestFitFa...
DecoderFallback : System.Text.InternalDecoderBestFitFa...
IsReadOnly : True
CodePage : 932
#br
** PowerShellの入力エンコーディングを変更する [#o7f8e493]
PS> $OutputEncoding = [Text.Encoding]::GetEncoding('utf-...
PS> gc .\1.json -Encoding utf8 | jq.exe ...
{ ...
"a": "日本語",
"b": "英語"
}
- (1)でPowerShellの出力をUTF8にしたので、(3)で|からUTF8が...
- なお、1.jsonファイルがBOMなしのUTF8の場合はgc(Get-Conte...
- ここまではOK
PS> gc .\1.json | jq.exe | Select-String "日本語" ...
(2)
PS> [Console]::OutputEncoding = [Text.Encoding]::UTF8 (3)
PS> gc .\1.json | jq.exe | Select-String "日本語" ...
"a": "日本語", ...
- しかし、(1)のようにjq.exeの出力をPowerShellのSelect-Str...
- (jq.exeがBOMなしのUTF8を出力していて、|がそれを認識で...
- これを解決するには(3)のようにPowerShellの入力をUTF8にし...
** 補足:なんでこんな問題が起きるのか [#s4f29bde]
- Linuxのコマンドはパイプでつなげて使うが、パイプからは文...
- 一方で、PowerShellのコマンドはパイプからオブジェクトが...
- したがって、PowerShellをPowerShellらしく使いたいなら、...
- 今回の場合なら下のようにWSLのBashを呼び出すとかした方が...
*** Bash呼び出し [#rd515770]
PS> bash.exe -c 'cat 1.json | jq "." | grep "日本語"'
"a": "日本語",
*** CMD呼び出し [#t49a0f46]
PS> cmd /c 'type 1.json | jq "." | jvgrep "日本語"'
"a": "日本語",
#br
fzfを使うならこんな感じ、
PS> bash -c "find . | fzf"
** 参考 [#c7e34602]
https://ladybug.hatenadiary.org/entry/20111203/p1
ページ名: