このページの本文へ

前へ 1 2 次へ

Windows Info 第164回

Windows Subsystem for LinuxとWindows内の文字コード

2019年03月17日 10時00分更新

文● 塩田紳二 編集● ASCII編集部

  • この記事をはてなブックマークに追加
  • 本文印刷

WSLはWin32との文字コードの違いにどう対応しているか?

 Windows Subsystem for Linux(WSL)には、Win32相互運用性と呼ばれる機能があり、WSLのbashから直接Win32プログラムを起動することができる。WSLのLinuxディストリビューションは、標準の文字コードとしてUTF-8を使うのに対して、Win32プログラムの標準の文字コードは、日本語版Windowsの場合ではShift-JISである。

 しかし、WSLやCMD.EXE(コマンドプロンプトウィンドウ)では、お互いをパイプで接続してコマンドを連続して動作させることが可能だ。このときWSLは、コマンドラインを見て、Win32プログラムが適切な文字コードを出力できるように調整をおこなう。具体的には、以下の3つの場合が考えられる。

1. Win32プログラムの標準出力がコンソールに接続しているとき
2. Win32プログラムの標準出力がLinux側のコマンドの標準入力に接続しているとき
3. Win32プログラムが標準出力を利用していないとき(Win32 GUIアプケーションの場合)

 「1」の場合、日本語版Windowsでは、Win32コマンドからはShift-JISコードを含んだ文字列が出力される可能性が高い。このときのWSLは、コンソールに出力される文字コードをUTF-8に変換して表示する。なお、現在のコンソールウィンドウは、内部でUTF-8コードを使っている。

 「2」の場合、WSLはWin32コマンドが動作する環境を変更し、コードページに65001(UTF-8)を指定してWin32コマンドを起動する。これにより、Win32コマンドはUTF-8コード、実際にはメッセージが英語となり、ASCIIコードを出力する。UTF-8は、ASCIIコードの範囲では一致しており、この範囲の文字は正しく表示できる。

 「3」の場合、WSLから標準入出力を使って直接データを渡すことはできず、必ずファイルを介したものになる。このため、WSL側で作られるUTF-8への対応は、アプリごとに違ってくる。たとえば、メモ帳はすでにUTF-8に対応しているため、WSL側のコマンドが出力したUTF-8のファイルをそのまま開くことが可能だ。

MS-DOS時代に作られたコードページって何?

 コードページとは、MS-DOSの時代に作られたコンソールにおいて、複数言語を扱うためのものだ。現在Linuxなどで使う「ロケール」に似た概念だが、そもそも、ハードウェアで文字を表示させていた時代のものなので、文字コードを指定するものになっている。

 コードページは数字で表現され、たとえば日本語のShift-JISを使う環境では932というコードページが使われる。これに対してオリジナルのIBM PCでは、コードページ437が使われている。もともとコードページ437は、IBM PC用のCGA~VGAなどのハードウェアで文字を表示させる環境のための文字コードでASCIIコードが基本。ただしハードウェア的には、0~255までの文字コードに表示可能な文字が対応しており、ビデオメモリに書かれたコードに対応した文字が表示される。当初のコードページは、ハードウェアのフォント(ビデオ回路のキャラクタジェネレーター)を区別するためのものだった。

 その後のWindowsでは、TrueTypeなどのフォントを利用できるようになり、現在のコードページからは、フォントを指定するという意味は失われている。なので、コードページは437でも表示フォントはMSゴシックといった設定が可能である。Windows 10でも、ラスターフォントを指定すると、IBM PCが持っていたフォント(ASCIIコード外の文字を含む)を表示させることができる。

コンソールでコードページ437を指定し、フォントでラスターフォントを選ぶと、IBM PCのCGAなどで使っていたトランプのマークなどのシンボルを表示できるようになる

ただし、日本語版Windowsの場合、ラスターフォントでも半角カナを表示しShift-JISを表示しようとする。英語版Windowsでは、IBM PCのCGAなどと同じく半角カナの領域にアクセント記号付き文字などが割り当てられている

 Windows 10のコンソールでは、個々のWindowsの標準的なコードページ以外も選択可能だが、その動作は実行するアプリケーションに依存する。サポートされているコードページの1つが65001で、この場合はコードエンコード方式にUTF-8が使われる。正しくUTF-8に対応したアプリケーションであれば、文字はUTF-8コードで出力される。しかし多くの場合、アプリケーションはメッセージを英語で出力する。これは、UTF-8とASCIIコードがASCII文字の範囲では一致しているからだ。

 コードページは、日本語や同じ1バイトコードでもアルファベットに違いのあるヨーロッパ系の言語などに対応するために作られた。ただし、ソフトウェアの互換性を保つために、コードページや他国語をまったく考慮していないアプリケーションがあったときに、英語環境にも設定できるようになっていた。

 コンソールのコードページは、chcpコマンド(C:\Windows\System32\chcp.com)で表示させることができる。これをWSLから起動すれば、実行環境のコードページを調べることができるはずだ。ただし、Windows 10 Ver.1809(RS5)の場合、標準出力に何も接続しない場合には、コードページとしてゼロが表示され、パイプ記号でmoreコマンド(Linuxのコマンド)と接続した場合には、65001が表示された。

日本語版Windows 10 RS5のWSLでchcp.comを起動すると標準出力に何も接続されていないときにはコードページが0と報告される。標準出力に何か接続すると、コードページは65001(UTF-8)に切り替わる

 ただし、Windows 10 Ver.1903(19H1)では、標準出力に何も接続しなかった場合には、932(日本語Shift-JIS)が表示されるようになった。このあたり、ちゃんと処理されるようになったようだ。chcpは、おそらくシステムコールでコードページを取得しているだけなので、Windows側の問題だと思われる。

次期Windows 10の19H1では、chcp.comは正しくコードページ932を報告する

 このように、WSLでは、文字コードで問題が起きないように標準出力の状態を見て、コードページを切り替える。そのためコマンドを単独で実行させると、日本語が出るのに、パイプやリダイレクトでは英語メッセージとなることがある。

前へ 1 2 次へ

カテゴリートップへ

本記事はアフィリエイトプログラムによる収益を得ている場合があります

この連載の記事

ASCII倶楽部

注目ニュース

  • 角川アスキー総合研究所

プレミアム実機レビュー

ピックアップ
1
KIOXIA(キオクシア) 旧東芝メモリ microSD 128GB UHS-I Class10 (最大読出速度100MB/s) Nintendo Switch動作確認済 国内サポート正規品 メーカー保証5年 KLMEA128G
KIOXIA(キオクシア) 旧東芝メモリ microSD 128GB UHS-I Class10 (最大読出速度100MB/s) Nintendo Switch動作確認済 国内サポート正規品 メーカー保証5年 KLMEA128G
¥2,680
2
Anker PowerLine III Flow USB-C & USB-C ケーブル Anker絡まないケーブル 240W 結束バンド付き USB PD対応 シリコン素材採用 iPhone 17 / 16 / 15 / Galaxy iPad Pro MacBook Pro/Air 各種対応 (1.8m ミッドナイトブラック)
Anker PowerLine III Flow USB-C & USB-C ケーブル Anker絡まないケーブル 240W 結束バンド付き USB PD対応 シリコン素材採用 iPhone 17 / 16 / 15 / Galaxy iPad Pro MacBook Pro/Air 各種対応 (1.8m ミッドナイトブラック)
¥1,890
3
Anker USB Type C ケーブル PowerLine USB-C & USB-A 3.0 ケーブル iPhone 17 / 16 / 15 /Xperia/Galaxy/LG/iPad Pro/MacBook その他 Android 等 USB-C機器対応 テレワーク リモート 在宅勤務 0.9m ホワイト
Anker USB Type C ケーブル PowerLine USB-C & USB-A 3.0 ケーブル iPhone 17 / 16 / 15 /Xperia/Galaxy/LG/iPad Pro/MacBook その他 Android 等 USB-C機器対応 テレワーク リモート 在宅勤務 0.9m ホワイト
¥740
4
Anker iPhone充電ケーブル PowerLine II ライトニングケーブル MFi認証 超高耐久 iPhone 14 / 14 Pro Max / 14 Plus / 13 / 13 Pro / 12 / 11 / X/XS/XR / 8 Plus 各種対応 (0.9m ホワイト)
Anker iPhone充電ケーブル PowerLine II ライトニングケーブル MFi認証 超高耐久 iPhone 14 / 14 Pro Max / 14 Plus / 13 / 13 Pro / 12 / 11 / X/XS/XR / 8 Plus 各種対応 (0.9m ホワイト)
¥990
5
エレコム 電源タップ 6個口 3m 雷ガード 個別スイッチ ほこりシャッター付 耐熱 PSE技術基準適合 ブラック T-K6A-2630BK
エレコム 電源タップ 6個口 3m 雷ガード 個別スイッチ ほこりシャッター付 耐熱 PSE技術基準適合 ブラック T-K6A-2630BK
¥1,899
6
KIOXIA(キオクシア)【日本製】USBフラッシュメモリ 32GB USB2.0 国内サポート正規品 KLU202A032GL
KIOXIA(キオクシア)【日本製】USBフラッシュメモリ 32GB USB2.0 国内サポート正規品 KLU202A032GL
¥1,677
7
バッファロー マウス 無線 ワイヤレス 5ボタン 【戻る/進むボタン搭載】 小型 軽量 節電モデル 最大584日使用可能 BlueLED ブラック BSMBW315BK
バッファロー マウス 無線 ワイヤレス 5ボタン 【戻る/進むボタン搭載】 小型 軽量 節電モデル 最大584日使用可能 BlueLED ブラック BSMBW315BK
¥1,040
8
NIMASO ガラスフィルム iPad 第11世代(A16) 2025用/iPad 10.9インチ 第10世代 2022用 衝撃吸収 強化 ガラス 保護フィルム 指紋防止 ガイド枠付き NTB22I574
NIMASO ガラスフィルム iPad 第11世代(A16) 2025用/iPad 10.9インチ 第10世代 2022用 衝撃吸収 強化 ガラス 保護フィルム 指紋防止 ガイド枠付き NTB22I574
¥1,519
9
UGREEN USB Type Cケーブル PD対応 100W/5A 超急速充電 USB C ナイロン編み 断線防止 iphone17/16/15シリーズ/iPad/MacBook Pro/Galaxy S24/Matebook/iPad/Xperia等USB-C各種対応(1m, ブラック)
UGREEN USB Type Cケーブル PD対応 100W/5A 超急速充電 USB C ナイロン編み 断線防止 iphone17/16/15シリーズ/iPad/MacBook Pro/Galaxy S24/Matebook/iPad/Xperia等USB-C各種対応(1m, ブラック)
¥844
10
KIOXIA(キオクシア)【日本製】SDカード 128GB SDXC UHS-I Class10 読出速度100MB/s 国内正規品 メーカー保証5年 KLNEA128G
KIOXIA(キオクシア)【日本製】SDカード 128GB SDXC UHS-I Class10 読出速度100MB/s 国内正規品 メーカー保証5年 KLNEA128G
¥3,147

Amazonのアソシエイトとして、ASCII.jpは適格販売により収入を得ています。

デジタル用語辞典

ASCII.jpメール デジタルMac/iPodマガジン