はじめに
WindowsとLinuxでは、デフォルトで使用される文字コードが異なります。
そのため、ファイルの文字化けや互換性の問題が発生することがあります。
本記事は個人的な備忘録としてまとめたものです。その点をご理解いただければ幸いです。
文字コードの違いに苦戦した経験がある
過去にLinuxで作ったおみくじアプリを、Windowsで再現しようとした際に苦戦した経験があります。
そのとき、全くうまく動作せず、原因を追求した結果、OSごとの文字コードの違いが原因であることがわかりました。
些細な違いに思えますが、それだけでアプリが動かないという問題が発生したため、文字コードの扱いには非常に苦労した記憶があります。
過去に苦労した技術検証
WindowsとLinuxのデフォルト文字コードの違い
Windows
- デフォルトの文字コード: Shift_JIS (CP932)
- 日本語環境: 一般的に Shift_JIS (MS932とも呼ばれる) が使用される。
-
PowerShell や コマンドプロンプト(cmd):
- 既定では Shift_JIS (CP932) が使われる。
- UTF-8 を使うには手動で変更が必要。
Linux
- デフォルトの文字コード: UTF-8
-
特徴:
- ほとんどのLinuxディストリビューションでは、デフォルトで UTF-8 を使用。
- システム全体の文字コードが統一されていることが多い。
文字コードの違いによる影響
ここでは、簡単に自分なりに知識整理として表形式でまとめてみましたので、参考にしてみてください
Windows (Shift_JIS, CP932) と Linux (UTF-8) の比較
項目 | Windows (Shift_JIS, CP932) | Linux (UTF-8) |
---|---|---|
日本語対応 | 一部の記号が異なる (例: ~ , ― , ¢ ) |
広く標準化されており、ほぼすべての記号に対応 |
互換性 | LinuxでShift_JISのファイルを開くと文字化けすることがある | UTF-8は多くのOSで標準対応 |
エンコーディング変更 |
chcp 65001 (UTF-8) に切り替え可能 |
iconv や nkf コマンドでShift_JISに変換可能 |
ここまでの簡単なまとめ
-
Windows は
Shift_JIS (CP932)
、Linux はUTF-8
をデフォルトで使用する。 - LinuxでWindowsのShift_JISファイルを開くと文字化けする可能性がある。
-
iconv
やnkf
、Python を使ってエンコーディングを変換可能。 - クロスプラットフォームでの開発では、UTF-8を統一して使用するのがベスト。
文字コード変換の方法
WindowsでShift_JIS → UTF-8 に変換
PowerShellを使用
Get-Content file_sjis.txt | Set-Content file_utf8.txt -Encoding utf8
-
Get-Content
指定されたファイル (
file_sjis.txt
) の内容を取得します。
内容はテキストデータとして出力されます。 -
パイプ (|)
Get-Content
から出力されたデータを次のコマンドに渡します。 -
Set-Content
Get-Content
から受け取ったデータを新しいファイルに書き込みます。
-Path
オプションで出力先のファイル名 (file_utf8.txt
) を指定します。
-Encoding utf8
オプションで文字コードを UTF-8 に指定します。
Pythonを使用
with open("file_sjis.txt", "r", encoding="cp932") as f:
text = f.read()
with open("file_utf8.txt", "w", encoding="utf-8") as f:
f.write(text)
このスクリプトがやっていること
- Shift_JIS (CP932) のファイル (
file_sjis.txt
) を開いて中身を取得する - 取得したデータを UTF-8 でエンコードし直して、新しいファイル (
file_utf8.txt
) に書き込む
LinuxでUTF-8 → Shift_JIS に変換
iconv
コマンドを使用
iconv -f UTF-8 -t CP932 file_utf8.txt > file_sjis.txt
nkf
コマンドを使用
nkf -s file_utf8.txt > file_sjis.txt # -s は Shift_JIS
まとめ
最後までお読みいただき、ありがとうございました。今回は基本的な内容を簡単にまとめましたが、自分自身の振り返りの良い機会にもなりました。
今後も、こうした基礎的な内容を丁寧にアウトプットしながら、知識を確実に定着させていきたいと考えています。
この内容が、どなたかの技術の支えや学習の参考になれば幸いです。