文字コードの仕組みと文字化けの原因および解消方法のまとめ

文字コードや文字化けについて日頃自分がつまずくポイントを整理してみました。

## 文字コードの仕組み
人間は普段、日常的に使っている、ひらがな、カタカナ、漢字、アルファベット、数字、記号、句読点などを文字として認識できますが、コンピュータの世界では0と1の二進数でしかデータを扱えません。

文字コードとは、ひらがなやカタカナやアルファベットのようなコンピュータが直接扱えない文字に対して、それぞれ固有の番号（コードポイントまたは符号位置）を割り当てるルールのようなものです。

### 文字集合と符号化方式

文字コードを理解する上で重要なのが、文字集合（文字セット、キャラクターセット）と符号化方式（エンコーディング）というの概念です。 

文字集合は使用できる文字の集まりです。
例えば、アルファベット、数字、基本的な記号などを割り当てたASCIIや世界中のより多くの文字を定義しているUnicodeなどがあります。利用可能な文字を定義し、それぞれに一意のコードポイントを割り当てます。
一方、符号化方式は文字集合で定義されたコードポイントを、実際にコンピュータのメモリに保存したり、ネットワークを通じて送信したりするためのバイト列に変換する方法を指します。
Unicodeという文字集合に対しては、UTF-8、UTF-16、UTF-32といった複数の符号化方式が存在します。

同じ文字集合（例：Unicode）でも、異なる符号化方式（例：UTF-8とUTF-16）では同一の文字を異なるバイト列として表現されます。文字集合は利用可能な文字の抽象的な集まりであり、符号化方式はその文字を具体的なバイト列として表現する手段であると言えます。

:::note info
例えば「A」という文字は、UTF-8では「0x41」（1バイト）、UTF-16では「0x00 0x41」（2バイト）で保存され、同じ文字でも保存方法（バイトの並び）が違います。「どんな文字があるかの一覧表（Unicode）」と、「その文字をどうやってパソコンに保存するかのルール（UTF-8やUTF-16）」は別物と理解しましょう。
:::

### 文字コード表による結びつけ

文字コード表（対応表、マッピングテーブル）は、特定の符号化方式において、各文字と対応するコードポイント、バイト表現を結びつけるための参照テーブルです。

テキストエディタやアプリケーションがファイルからバイト列を読み込む際、指定（または自動検出）された文字符号化方式に基づいて、文字コード表を参照し、対応する文字を画面に表示します。

テキストエディタは、ファイルの中身（バイト列）を「どの文字コードで書かれているか？」という情報をもとに、その文字コードのルールに従ってバイト列を文字として表示します。

それぞれの符号化方式は、独自のバイト列と文字のマッピングを定義しています。ただし、UTF-8は最初の128文字に関してASCIIと互換性があるなど、一部の符号化方式はマッピングの一部を共有している場合があります。

テキストエディタなどは、文字コード表を使って「どの文字がどの番号（コードポイント）か？」を把握し、符号化方式（例：UTF-8）に従ってその番号をバイト列に変換して保存します。ファイルを開くときは、同じ符号化方式を使ってバイト列を元の文字に戻し、画面に表示します。

### 主要な文字コード

|文字集合|符号化方式|主な用途|主な特徴|
|---|---|---|---|
|ASCII|-|英語|英数字・記号を0–127の7ビットで表現、制御文字を含む|
|JIS X 0208|Shift_JIS(CP932/MS932)|日本語(Windows)|半角カナ＋全角漢字を2バイトで表現、NEC/IBM独自拡張を含む|
|JIS X 0208|EUC-JP|日本語(UNIX)|UNIX系OSで利用、ISO-2022-JPのスーパーセット|
|Unicode|UTF-8|国際化全般|世界中の文字を統一的に扱う規格、可変長・ASCII互換・最も普及している|

ASCII（American Standard Code for Information Interchange）は、英語のアルファベットや数字、基本的な記号、制御文字（改行など）を扱うために作られたアメリカ発の標準的な文字コードです。7ビット（128種類）の文字だけを扱うシンプルな仕組みで、コンピュータが主に英語圏で使われていた時代に十分なものでした。ASCIIの制御文字には改行やタブなどが含まれ、これらは今でも様々なシステムで使われています。

Shift_JIS（SJIS）は、日本語をコンピュータで扱うために開発された文字コードです。英数字や一部の記号には ASCIIと同じ番号を使い、ひらがな、カタカナ、漢字などは2バイトで表現できるように拡張されています。
MS-DOS時代にMicrosoftがCP932（のちにMS932）という管理番号で採用した際、NEC独自拡張やIBM独自拡張を含む複数バリエーションが生まれました。1993年のWindows3.1登場時にNECおよびIBMの拡張を統合し、IANA登録名を「Windows-31J」としたものが現在の主流です。したがって今日「Shift_JIS」と呼ぶ場合は、Windows-31J（CP932/MS932）を指しており、これらバリエーション間の違いが互換性問題の原因になることがあります。

EUC-JP（Extended Unix Code for Japanese）は、UNIX系のシステムで日本語を扱うために使われている文字コードです。Shift_JISと同じく日本語を表現できますが、設計や使われる場面が異なります。EUC-JPはUNIXの標準的な日本語文字コードとして普及しました。

Unicodeは、世界中のほぼすべての文字を一つの規格で扱えるようにした国際標準の文字コードで、英語、日本語、中国語、絵文字などを一元管理できます。
UTF-8はこのUnicodeをバイト列に変換する方式で、ASCIIと互換性を保ちつつ、従来のJIS X 0208／ISO-2022-JPといった日本語エンコーディングをすべて包含することで、最も普及しています。UTF-8の登場により、多言語間での文字化けや互換性の問題が大きく減りました。

### Shift_JISとWindows-31J（MS932）の関係性
Windows-31J（MS932）については以下の記事が丁寧にまとめられていました。

https://weblabo.oscasierra.net/shift_jis-windows31j/

### 主要文字コードごとの具体的なマッピング例

アルファベットの「A」は主要な文字コード（ASCII、Shift_JIS、Unicodeなど）で「0x41」や「U+0041」という同じ番号が割り当てられます。

|文字コード|値（16進数）|
|:--|:--|
|ASCII|0x41|
|Shift_JIS|0x41|
|Unicode|U+0041|
|JIS|0x41|

一方、ひらがなの「あ」は、文字コードごとに割り当てられる番号（コードポイント）が異なりますが、ASCIIのように英語専用で128文字しか定義されていない文字コードでは日本語を含む非英語文字を表現することはできません。

|文字コード|値（16進数）|
|:--|:--|
|Unicode|U+3042|
|Shift_JIS|0x82A0|
|EUC-JP|0xA4A2|
|ASCII|表現不可|

なお、Unicodeでは、コードポイント表記（U+3042）とUTF-8バイト列表記（E3 81 82）の2種類の表現がありますが、一般的には、文字そのものを指す場合はコードポイント表記（U+3042）が使われます。  

- コードポイント表記
    - 文字そのものに割り当てられた「国際標準のID番号」を表す
- UTF-8バイト列表記
    - そのID番号を実際のデータ（バイト列）に変換した結果を示す

なお、他の文字コード（ASCII、Shift_JIS、EUC-JPなど）では、コードポイントとバイト列が直接対応するため、このような表記の違いはありません。

## 文字化けの原因と解決策

文字化けは、テキストファイルやデータが本来使われていた文字コードとは異なる方法で読み込まれたときに発生します。

### 文字化けが起こる仕組み

例えば、UTF-8で保存されたファイル（多くの日本語は3バイトで表現）を、Shift_JIS（多くの日本語は2バイトで表現）で開こうとすると、ソフトウェアはバイト列を正しく解釈できず、文字化け（意味不明な文字）や記号が表示されます。ファイルを作成したときの文字コードと開く時の文字コードの不一致が文字化けの主な原因です。

テキストファイルは、原則として全体を通して一貫した文字コードで保存されるべきですが、データ破損や異なる文字コードの混在などによりファイルの一部だけが文字化けする可能性もあります。

プレーンテキストでは稀ですが、CSVやログファイルなどでは一部だけ異なるケースもあります。一部のテキストエディタ（例：サクラエディタなど）では選択範囲のみを異なる文字コードで再解釈できますが、根本的な解決策にはなりません。

### 文字コードはいつ確定するか

テキストエディタで文章を入力している段階（未保存状態）では、ファイルの文字コードは未定で内部的にUnicode（主にUTF-16）で文字を保持しています。

入力内容に応じて画面上には「A」や「あ」のような文字の見た目（グリフ）が表示されますが、これはエディタが内部で持っている文字情報をもとに、フォントを使って見た目として描画しているだけです。保存されるタイミングで文字コードが選択され、その設定に従いバイト列が作られます。

:::note info
ファイルの文字コードはファイルが最初に保存されるタイミングで確定します。選択可能な文字コードはテキストエディタごとに異なります。例えばWindowsのメモ帳では保存時に「ANSI（CP932）/UTF-8/UTF-16」などが選択可能です。
:::

### 文字コードの不一致を特定し、正しく変換する方法

「正しい文字コード」とは、テキストが最初に作成されたときや、本来そのシステムで使うべき文字コードを指します。文字コードを特定するには、以下の方法があります。

- メタデータを確認
    - ファイルやデータのヘッダー情報（例：HTTPヘッダー、XML宣言、メールヘッダー）から推測する
- BOM（Byte Order Mark）を確認
    - UTF-16などでは、ファイル先頭にエンコーディングを示す特殊なバイト列が含まれる
- 自動検出機能を使う
    - 一部のテキストエディタでは、バイトパターンの統計分析でエンコーディングを推測する
- 手動で指定する
    - 自動検出でうまくいかない場合、テキストエディタやツールでエンコーディングを手動で切り替えて正しく表示されるものを探す
- コマンドラインツールを使う（主にLinux系やmacOS）
    - fileコマンド
        - ファイルタイプと MIME タイプ（文字エンコーディング情報含む）を調べる
    - nkfコマンド
        - 日本語環境でよく使われるツール、エンコーディングの検出や変換が可能
    - iconvコマンド
        - 多くのUNIX系システムで利用でき、さまざまなエンコーディング間の変換が可能

文字コードの自動検出は、バイトパターンや言語の特徴からエンコーディングを推測します。

UTF-8の検出は比較的正確ですが、8ビット系文字コードや短いテキストでは誤判定も起こりやすいです。自動検出は便利ですが、信頼性が必要な場面では文字コードの明示的な指定が重要です。

#### BOM(Byte Order Mark)の特徴
BOM（Byte Order Mark）は、UTF-8などのUnicode系文字コードで保存されたファイルの先頭に付与されることがあります。
ブラウザはこれを読み取って文字コード判別の手がかりとする場合があります。ただし、BOMは内部的なバイト列（非表示文字）であり、人間の目には直接見えません。
一方で、BOMは一部の環境やアプリケーションで互換性の問題や文字化けを引き起こすことがあります。そのため、一般的にはBOMなしのUTF-8（UTF-8N）が推奨されています。
特にWindowsのメモ帳は過去のバージョンでUTF-8保存時に自動的にBOMを付加していたため、他のソフトウェアやシステムでファイルを開いた際に文字化けが発生することがありました。現在はBOMなしUTF-8が推奨されていますが、レガシー環境ではBOMの有無に注意が必要です。

:::note info
- 「あいう」をUTF-8（BOMなし）で保存するとファイル容量は9バイトになる
    - （各3バイト×3文字）
- 「あいう」をUTF-8（BOM付き）で保存するとファイル容量は12バイトになる
    - （BOM3バイト＋各3バイト×3文字）
:::

#### 文字化けしたファイルは保存しない

文字化けが発生した際の注意点に「文字化けした状態でファイルを保存しない」ことが挙げられます。
文字化けは、文字データをコンピュータが扱える形式に変換するプロセスである「エンコード」が失敗している状態です。この失敗した状態のままファイルを保存してしまうと、元の正しいデータが上書きされてしまい、正常な状態に戻せなくなる可能性があります。
多くの文字化けしたファイルが復元不能になるのは、エンコードに失敗した状態で保存されるためです。

#### オンラインツールを活用した文字化けの解読・復元

原因究明や手動での対処が難しい場合、インターネット上には無料の文字化け解読ツールや復元ツールが多数存在します。

これらのツールは、文字化けした文字列をテキストエリアに貼り付けるだけで、何の文字コードであるかを教えてくれたり、複数の文字コードを試して復元を試みたりする分析機能を持つものもあります。

ただし、文字化けの種類や程度によっては完全に元の文章に戻せない場合がある点に注意が必要です。特に「？」や「□」などの記号に置き換わってしまった文字は、元の情報が失われているため、復元が困難になります。

https://lab.kiki-verb.com/mojibakeratta/

## ファイル名の文字化けの仕組みと対策

ファイル名の文字化けは日常的に発生しやすいトラブルのひとつです。特に異なるOS間でファイルをやり取りする際や、圧縮ファイルの解凍時などに発生しやすいです。

- Windows（日本語版）はShift_JISが標準でしたが、Windows10以降はUTF-8対応が進んでいます。基本的には異なるOS間での互換性の問題はありませんが、一部、UTF-8環境（Mac、Linux、クラウド等）とのやりとりで文字化けしてしまうこともあります。
- macOSやLinuxは標準でUTF-8を使用しています。Windowsから送られてきたShift_JISのファイル名や、逆にUTF-8のファイル名をWindowsで開く場合に注意が必要です。
- iPhoneやAndroidも基本的にUTF-8を採用していますが、クラウドサービス経由やメール添付ファイルの受信時に、PC側（送信側）の文字コードと合わないと文字化けが発生します。
- USBメモリや外付けストレージなどのリムーバブルメディアも、ファイルシステム（FAT32、NTFS、exFATなど）によって対応する文字コードが異なるため、文字化けのリスクがあります。
- ZIPファイルなどで圧縮してファイルをやり取りする場合、圧縮元と解凍先で文字コードが異なると、解凍時にファイル名が文字化けすることがあります。特にMacやLinuxでUTF-8で圧縮したZIPをWindows（Shift_JIS）で解凍すると発生しやすいです。7-ZIPのようなUTF-8対応の解凍ソフトを使ったり、ファイル名を半角英数字にしておくことで防止できます。

OSやデバイスごとの文字コードの違いを把握し、やり取りする相手の環境も考慮することが重要です。

https://7-zip.opensource.jp/download.html

## 主要なコマンドラインツールによる文字コードの確認と変換

文字コードを確認や変換のための便利なコマンドがあります。（主にLinuxやmacOS向けのものが多いですが、Windowsでも利用可能なものもあります。）

### ファイルタイプとエンコーディングの確認

```shell:ファイル形式とMIMEタイプ（文字コード情報含む）を表示する
file -i input.txt
```
ファイル形式とMIMEタイプ（例：text/plain; charset=utf-8）を表示します。ファイルの中身がどんな文字コードで書かれているかを知りたいときに使います 。

:::note info
MIME（Multipurpose Internet Mail Extensions）タイプは、もともと電子メールで日本語や添付ファイルなど多様なデータを扱うために考案されたデータ識別方式ですが、現在ではWebなどメール以外の分野でも広く使われています。これにより、ファイルの「種類」や「文字コード情報」などを指定し、Webブラウザが受け取ったデータを正しく表示できるようになっています。
:::

### エンコーディングの推測

```shell:入力ファイルの文字エンコーディングを推測する
$ nkf --guess input.txt
```
バイトパターンや日本語文字の出現頻度などをもとに、ファイルのエンコーディングを推測します。UTF-8、Shift_JIS、EUC-JPなどの判定が可能ですが、短いテキストでは誤判定もあるため、あくまで補助的に使います 。

### 文字コードの変換

```shell:Shift_JISからUTF-8（BOMなし）へ変換してから出力する
$ nkf -w input.txt > output.txt
```

Shift_JISやEUC-JPなどをUTF-8（-w）に変換し、ファイルに保存します。BOMなしUTF-8での出力がデフォルトです。

```shell:エンコーディング変換を直接標準出力する
$ iconv -f ISO-8859-1 -t UTF-8 input.txt
```
-fで元のエンコーディング（例：ISO-8859-1）、-tで変換先（例：UTF-8）を指定し、標準出力します。


```shell:Shift_JIS (SJIS) 形式のファイルを UTF-8 に変換し別ファイルに書き出す
$ iconv -f SJIS -t UTF-8 input.txt > output.txt
```

-f で元のエンコーディング（例：SJIS）、-t で変換先（例：UTF-8）を指定し、別ファイルに書き出します 。

### 改行も含めた変換と検証（改行コードの詳細は後述）

```shell:文字コードだけでなく、改行コードをCRLFからLFに変換し別のファイルに書き出す
$ iconv -f SJIS -t UTF-8 input.txt | dos2unix > output.txt
```
SJIS→UTF-8に変換し、さらにdos2unixでCRLFをLFに統一してから保存します。

```shell:変換前後のバイト列(バイナリ)を比較する
$ xxd input.txt  # 変換前のバイト列
$ iconv -f SJIS -t UTF-8 input.txt | xxd  # 変換後のバイト列
```
xxdで変換前後のバイト列を16進数ダンプ表示し、実際にバイトがどのように変わったかを目で確かめます 。

### 主要OSにおけるコマンド導入およびパッケージ管理ツールの違い

OSごとにコマンドやツールをインストールする方法には違いがあります。
Linux系OSは最初から多くのコマンドや開発ツールが揃っていることが多く、追加のセットアップが比較的簡単です。一方で、Windowsは標準状態だとUNIX系のコマンドがほとんど入っていないため、開発や作業環境を整えるには専用のパッケージ管理ツールや追加ソフトの導入が必要です。
macOSもLinuxに近い環境ですが、Homebrewなどのパッケージ管理ツールを使うことで、さらに多くのコマンドやツールを簡単に追加できます。
以下の表は、各OSで代表的なコマンドやパッケージ管理ツール、その特徴をまとめたものです。

|OS|ツール|特徴|
|---|---|---|
|Linux|yum|Red Hat系ディストリビューションで使われるパッケージ管理システム。依存関係を自動で解決し、リポジトリからソフトウェアをインストール・更新・削除できる。コマンド例：`yum install パッケージ名`。現在は後継のdnfが主流になりつつある。|
|Linux|apt|Debian系ディストリビューション（Ubuntuなど）で使われるパッケージ管理システム。依存関係を自動で解決し、リポジトリからソフトウェアをインストール・更新・削除できる。コマンド例：`apt install パッケージ名`。|
|macOS|Homebrew|macOSで最も広く使われているパッケージ管理システム。コマンド一つで多くのUNIX系ツールやアプリを簡単にインストール・管理できる。コマンド例：`brew install パッケージ名`。|
|macOS|MacPorts|Homebrewと同様にmacOS用のパッケージ管理システム。より細かい依存関係管理やバージョン管理が可能で、Homebrewと使い分けるユーザーもいる。コマンド例：`port install パッケージ名`。|
|Windows|Chocolatey|Windows用のパッケージ管理システム。コマンドで各種ソフトやツールをインストール・アップデート・アンインストールできる。Windows全体にアプリやコマンドを追加するイメージ。コマンド例：`choco install パッケージ名`。|
|Windows|MSYS2|Windows上でLinux風のターミナルや開発環境を構築できるソフトウェア。`pacman`コマンドでUNIX系コマンドや開発ツールをMSYS2環境内にインストールできる。コマンド例：`pacman -S パッケージ名`。|
|Windows|GnuWin32|UNIX系コマンドをWindows用バイナリとして個別に配布するプロジェクト。必要なコマンドだけをダウンロード・インストールして使う。パス設定など手動作業が必要な場合もある。コマンド例：zipやexe形式で配布されているものを個別に導入。|
|Windows|Git Bash|Git for Windowsに同梱されるbash環境。UNIX系コマンドが最初から一式使える環境を提供し、個別に追加インストールせずにlsやgrepなどがすぐに使える。コマンド例：Git Bashターミナルを起動し、UNIX系コマンドをそのまま利用。|

```shell:Homebrewによるnkfコマンドのインストール（macOS）
# Homebrewを最新化
brew update

# nkf を通常インストール
brew install nkf

# （必要に応じて）開発版を入手したい場合は HEAD オプション付きで
brew install nkf --HEAD
```

```shell:Chocolateyによるnkfコマンドのインストール（Windows）
> choco install nkf
```

```shell:MSYS2によるnkfコマンドのインストール（Windows）
> pacman -S nkf
```

## Linux環境におけるロケール設定と文字コード

Linux/UNIX系では、環境変数によるロケール設定（LANGやLC_CTYPEなど）が文字コードや言語設定に影響します。主要なロケール環境変数は以下のとおりです。

|環境変数|意味|
|---|---|
|LANG|特定のLC_*変数が未設定の場合に適用される、全体のデフォルトロケール|
|LC_CTYPE|文字の分類や入出力時のエンコーディング（文字コード）|
|LC_COLLATE|照合順序や正規表現の定義|
|LC_TIME|日付や時刻の書式|
|LC_NUMERIC|数値の表記方法|
|LC_MONETARY|通貨の表記方法|
|LC_MESSAGES|システムメッセージの言語|
|LC_ALL|すべてのロケール設定を一括で上書きする特別な変数|

:::note info
ロケール設定ではシステムが使う言語、文字エンコーディング、日時、数値フォーマットなどを指定します。
:::

### ロケール設定の確認・変更
現在のロケール設定を確認するには、localeコマンドを使用します。

```shell:現在のロケール設定の確認する
$ locale
```

LinuxやmacOSのターミナルでは、LANGやLC_ALLなどの環境変数を設定することで、システム全体やアプリケーションが扱う言語や文字コードを指定できます。

一時的にロケールを設定する場合は環境変数を直接変更し、永続的に設定する場合は、~/.bash_profileや~/.bashrcなどに追記することで、ログイン時に自動的に設定されます。

```shell:一時的にロケールを設定する（このコマンドを実行したシェル内のみ有効）
$ export LANG=ja_JP.UTF-8
$ export LC_ALL=ja_JP.UTF-8
```

```shell:永続的にロケールを設定する
$ echo 'export LANG=ja_JP.UTF-8' >> ~/.bash_profile
$ echo 'export LC_ALL=ja_JP.UTF-8' >> ~/.bash_profile
$ source ~/.bash_profile
```

システム全体のロケールを設定するには、/etc/locale.confを編集するか、localectl set-locale LANG=ja_JP.UTF-8コマンドを利用します。

### 端末のロケール・文字コードの確認
端末の現在のロケールや文字コードは、次のコマンドで確認できます。

```shell:****
$ echo $LC_CTYPE  # 文字分類・入出力エンコーディング
$ echo $LANG      # デフォルトロケール
```

### 端末制御の補足
端末の制御設定が乱れてしまった場合は、stty saneコマンドを実行することで、制御文字や端末モードを初期状態にリセットし、予期しない動作を正常に戻すことができます。
```shell:****
$ stty sane
```

ロケール設定が不適切な場合、主に次のような問題が発生します。
- catやlessなどで日本語（UTF-8など）のファイルを正しく表示できず、文字化けが起こる
- grepや他のコマンドで「illegal byte sequence」などのエラーが発生する
- 文字化けや、正しく検索できない（検索漏れ）など、日本語処理全般でトラブルが発生する

:::note info
LANGは基本的なロケールを、LC_ALLは全てのロケール設定を上書きします。優先順位はLC_ALL > LC_MESSAGES > LANGの順番です。
:::

### 端末の文字コード設定と注意点

文字列検索などで正しく日本語を扱うには、下記2点の文字コードが一致している必要があります。
- ファイル自体の文字コード（例：UTF-8、Shift_JIS）
- ターミナルが扱う文字コード（ロケール設定。環境変数LANGやLC_ALLなどで指定）

ほとんどのターミナル（端末エミュレータ）は、システムのロケール（LC_CTYPEやLANG）で指定された文字コードを使って入出力を行います。

ファイルがShift_JISで保存されている場合、ターミナル側の文字コード設定がUTF-8など異なる場合は、文字化けや検索漏れが発生します。このようなときは、環境変数で一時的にロケールをShift_JISに切り替えてコマンドを実行することで、正しく検索できます

```shell:現在のロケール設定の確認する
$ LANG=ja_JP.sjis grep "あ" file.txt
```

## 文字コードと改行コードの関係

改行（または行末、end of line - EOL）は、テキストの行の終わりと新しい行の始まりを示す特別な制御文字（シーケンス）です。環境によって異なる改行コードが使われるため、異なるOS間でファイルを扱う際に注意が必要です。

::: note info
制御文字は１文字だけで改行やタブなど特定の機能を持つ文字（例：\n）を指します。一方で制御シーケンスは複数の制御文字やエスケープ文字を組み合わせて１つの動作を指示（例：\r\n）するもので、２文字以上で構成されます。
:::

### 改行コードごとの特徴

改行コードは文字コード体系とは別に、行末を示す制御文字です。

主に以下の3種類がありますが、現在ではCR（Carriage Return）はほぼ使用されていないため、最低限、LF（Line Feed）とCRLF（Carriage Return + Line Feed）の2種類が理解できれば問題ないでしょう。

- CR (Carriage Return)
    - \r（ASCIIコード13、0x0D）として表現されます。
    - Mac OS（OS X以前）で使用されていました。
- LF (Line Feed)
    - \n（ASCIIコード10、0x0A）として表現されます。
    - UNIX、Linux、macOS（OS X以降）で使用されています。
- CRLF (Carriage Return + Line Feed)
    - \r\n（ASCIIコード13と10）のシーケンスです。
    - WindowsおよびDOSで使用されています。

これらは一部のテキストエディタが「不可視文字を表示」を有効にしたときに改行文字を表示するために使用する視覚的な表現です。

- LF
    - 基本的に「↓」のようなアイコンで表示される（Unix/macOS）
- CRLF
    - 基本的に「↵」のようなアイコンで表示される（Windows）

### 改行コードが原因で起こる問題と対策

異なる環境間（主にOSの違いなど）で改行コードが不一致の場合、以前は改行コードが正しく認識されず、以下のような問題が発生することがありました。

- 改行コードが正しく認識されず一続きの長い行として表示されてしまう
- 改行コードを二重で解釈し余分な空行が入ってしまう

ですが、現在のテキストエディタでは、各改行コードを自動判別して正しく表示できるようになっており、以前発生していたような互換性の問題はほぼ解消されています。

もしこのようなトラブルが発生する場合の対策としては、以下のようなものがあります。

- テキストエディタの設定
    - 多くの最新のテキストエディタ（VS Code、サクラエディタ、メモ帳）は、異なる改行コードを処理でき、ファイルを保存する際に改行形式を選択できることがよくあります。
- 変換ツール
    - dos2unixやunix2dosなどのコマンドラインツールを使用して、Windows（CRLF）とUnix/macOS（LF）の改行コードを変換できます。
- バージョン管理システム
    - 例えばGitは、core.autocrlf設定を使用して、異なるオペレーティングシステムでコードをチェックアウトする際に、改行の変換を自動的に処理するように構成できます。

文字コードと改行コードはどちらもASCIIやUnicodeなどの文字エンコーディング規格において、特定の数値コード（コードポイント）で表現される点で共通しています。両者はテキストの正確な表示と解釈に不可欠です。

主な違いは、文字コードが文字や記号などの意味のある表示単位を表すのに対し、改行コードはテキストの行構造を示す制御文字である点です。改行コードはテキスト内容ではなく、レイアウトに影響を与えます。

多くの高度なテキストエディタでは、ファイル保存時に改行形式（Windows、Unix、macOSなど）を選択できる機能があり、異なるプラットフォーム間の互換性を確保するために重要です。

### 改行コードとワープロソフトの編集記号の関係

Microsoft WordやApple Pagesなどのワープロソフトで表示される「¶」（段落記号）や「↵」（改行記号）は、文書内の段落の区切りや行内改行を示す編集記号です。これらは内部的に Word の <w:p>／<w:br>（Pages の invisibles）といった文書構造要素として管理されており、テキスト形式（.txt）へ保存する際に改行コード（CRLF／LF など）へと変換されます。

- 「¶」（段落記号）
    - Enterキーを押すことで挿入され、段落の終了を示します。Wordでは「段落記号」と呼ばれ、内部的には段落の終わりを示す特殊な制御文字として扱われています。テキストファイルとして保存する際には、使用するシステムやソフトウェアの設定に応じて改行コード（CR、LF、またはCRLF）に変換されます。
- 「↵」（改行記号）
    - Shift + Enterキーを押すことで挿入され、「行区切り」または「ソフト改行」と呼ばれます。同じ段落内で行を改めることを示し、内部的には別の種類の制御文字として扱われます。

ワープロソフトはリッチテキスト形式で情報を保持しており、表示上の編集記号と実際のテキストファイル内の改行コードは異なる概念です。ワープロソフトで作成した文書をテキストファイルに変換する際、これらの編集記号は適切な改行コードに置き換えられます。

文書の編集やフォーマット、異なるプラットフォーム間でのファイル共有を行う際には、これらの記号の機能と変換方法を理解しておくと便利です。

## まとめ

改めてこの記事の内容をまとめます。

- 文字コードはデータをどのように符号化・解釈するかを決めるための重要な仕組みである
- 文字集合は「使う文字と番号」、符号化方式は「番号をバイト列に変換する方法」を定義する
- Unicodeのような同じ文字集合でも、符号化方式が異なればバイト表現は変わる
- 有名な文字コードにはASCII、Shift_JIS、EUC-JPなどがあるが現在の主流はUTF-8
- 文字化けは、送信側と受信側で文字コードやエンコーディングの設定が一致しないと発生する
- 文字コードの確認・変換にはnkfやiconvなどのコマンドラインツールが役立つ
- Webやメールの文字化け対策には、MIMEの仕組みの理解も必要である
- オンラインツールを活用することで文字化けの解読や復元ができる
- OSやファイルシステムなどによって利用される文字コードが異なり文字化けの原因になる
- ロケール設定の文字コードとファイルの文字コードが一致しないと文字化けの原因になる
- 改行コードが異なると、一続きの長い行になり表示されたり、余分な空行が挿入されたりする

最低限の内容を理解できていれば問題解決までの時間を短縮できます。文字コードやエンコーディングの基礎知識はトラブル対応やシステム運用に不可欠だと感じます。

## 参考文献
https://7-zip.opensource.jp/download.html

https://lab.kiki-verb.com/mojibakeratta

https://weblabo.oscasierra.net/shift_jis-windows31j