PowerShellで日本語が化ける
プログラマのぶち当たる壁の一つに「文字化け」があります。この記事を読んでいらっしゃる日本人の方は、よくわかっていただけると思います。
今回は、PowerShellで日本語を使いたい!という、私の希望を実現するために一番ネックとなった問題を共有いたします。
UTF-8が使いたい
とりあえず、現在の文字コードを確認してみよう
$OutputEncoding.encodingName
# -> US-ASCII
ググるとPowerShellでUTF-8を使用するには下記のコードを書けばいいらしい。
$OutputEncoding='utf-8'
↓結果↓
Cannot convert the "utf-8" value of type "System.String" to type "System.Text.Encoding".
At line:1 char:1
+ $OutputEncoding='utf-8'
+ ~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : MetadataError: (:) [], ArgumentTransformationMetadataException
+ FullyQualifiedErrorId : RuntimeException
怒られた。。。解せぬ。。。
もっと調べた
どうやら、こんな書き方もあるらしい。
$OutputEncoding = [Text.UTF8Encoding]::UTF8
で、文字コードを確認してみる↓
$OutputEncoding.encodingName
# -> Unicode (UTF-8)
おおっ!うまくいったぞ
日本語ファイルを読み込んで見る
適当に、フォルダ内のファイルを取り込んで、名前を出力してみる
$DIR_ = Get-ChildItem
$FILES = ${DIR_}.name
foreach ($f in $FILES) {
Write-Host $f
}
だめです!!できません!!(出力例を示したかったのですが、pcを再起動するのが面倒なので、割愛します)
また調べた
こんなページを発見↓
Windows10 April 2018 Updateで追加されたUTF-8モードを使う
ほうほう。
コントロールパネル -> 時計と地域 -> 地域 -> 管理 -> Unicode対応でないプログラムの言語
を、どうやら変更するらしい。
やってみた
コントロールパネルから時計と地域を選択
地域を選択
新しく出現したウィンドの管理タブを選択
管理タブのシステムロケールの変更を選択
新規ウィンドウのチェックボックスをチェック(現在のシステムロケールは各環境依存なので、気にしない)
以上
再チャレンジ
もう一度フォルダ内のファイル名を列挙数するプログラムを実行
$DIR_ = Get-ChildItem
$FILES = ${DIR_}.name
foreach ($f in $FILES) {
Write-Host $f
}
↓結果↓
はげ # フォルダ
ひげ # フォルダ
ふげ # フォルダ
へげ # フォルダ
ほげ # フォルダ
hoge.txt # テキストファイル
成功!!
まとめ
文字コード嫌いになりそうなので、なるたけイングリッシュ使おうと思いました。
でも、個人ファイルならまだしも、業務とかだと日本語ファイル絶対あるしなー。。。
そもそも、$OutputEncoding='utf-8'
みたいな宣言って、字面的に出力設定っぽいから意味ないのかな?