カテゴリ: Rust 更新日: 2026/03/27

Rustのchar型完全ガイド!Unicode文字の扱い方と注意点を初心者向けに解説

Rustのchar型とは?Unicode文字の扱い方と注意点
Rustのchar型とは?Unicode文字の扱い方と注意点

先生と生徒の会話形式で理解しよう

生徒

「Rustの勉強をしていると『char型』が出てきたんですが、これってC言語とかのcharと同じで1バイト文字のことですか?なんとなくアルファベットを入れるものだと思っているんですが。」

先生

「実はそこが大きな落とし穴なんです!Rustのchar型は、C言語などの従来のcharとは全く別物と考えてください。Rustではアルファベットだけでなく、漢字や平仮名、さらには『絵文字』まで1つのcharとして扱えるんですよ。」

生徒

「えっ、絵文字もですか?ということは、1バイト(8ビット)だけじゃデータが入りきらないですよね?」

先生

「その通りです。Rustのchar型は4バイト(32ビット)のサイズを持っています。これはRustが現代のWeb標準に合わせてUnicode(ユニコード)をネイティブにサポートしているからなんです。文字化けに悩まないためにも、この仕組みをしっかり理解していきましょう!」

1. Rustのchar型とは?基本的な定義と特徴

1. Rustのchar型とは?基本的な定義と特徴
1. Rustのchar型とは?基本的な定義と特徴

Rustにおける変数のデータ型の中でも、文字を扱うための最もプリミティブ(基本的)な型がchar型です。多くのプログラミング言語、特にC言語やC++の古い規格に慣れ親しんだ方にとって、char型といえば「1バイトのASCIIコード」というイメージが強いかもしれません。しかし、Rustのchar型は「Unicodeスカラー値」を表すように設計されており、現代の国際的なアプリケーション開発に最適化されています。

Rustの公式ドキュメントや仕様において、char型は「アルファベット1文字」だけを指すのではなく、世界中のあらゆる言語の文字、記号、そして絵文字を含む概念です。Rustで文字を扱う際、String(文字列)とchar(単一の文字)は明確に区別されますが、char型はそれらの構成要素となる最小単位のデータ型と言えます。

初心者がまず覚えるべき最大の特徴は、Rustのchar型は常に4バイト(32ビット)の固定サイズを持っているという点です。これにより、日本語の「あ」や「漢」、そして「��(カニ)」のような絵文字であっても、等しく1つのcharとして変数に格納することが可能です。

2. Unicodeスカラー値とUTF-8の関係性

2. Unicodeスカラー値とUTF-8の関係性
2. Unicodeスカラー値とUTF-8の関係性

Rustのchar型を深く理解するためには、Unicode(ユニコード)UTF-8の違いについて知っておく必要があります。Rustの文字列(Stringや&str)は、内部的にはUTF-8というエンコーディング形式で保存されています。UTF-8は可変長エンコーディングであり、アルファベットは1バイト、日本語は3バイト、絵文字は4バイトといったように、文字によってバイト数が変化します。

一方で、Rustのchar型は「Unicodeスカラー値」そのものを表現します。Unicodeスカラー値とは、簡単に言えば「その文字に割り当てられた世界共通のID番号」のようなものです。例えば、「A」という文字はU+0041、「あ」という文字はU+3042、「��」はU+1F980という値を持ちます。

Rustのchar型は、この値を直接メモリ上に保持するために4バイトを使用します。つまり、Rustにおいてchar型を使うということは、エンコーディングの複雑さを一時的に離れて、純粋な「文字のID」としてデータを扱うことを意味します。これにより、プログラマは文字コードの複雑なバイト列操作から解放され、より安全に文字処理を行うことができるのです。

3. char型の変数を宣言する方法とシングルクォート

3. char型の変数を宣言する方法とシングルクォート
3. char型の変数を宣言する方法とシングルクォート

それでは実際にRustのコードでchar型を使ってみましょう。Rustの文法において、文字列リテラルはダブルクォート(")で囲みますが、char型リテラルは必ずシングルクォート('で囲むという厳格なルールがあります。

初心者がよくやってしまうコンパイルエラーの一つに、char型を意図してダブルクォートを使ってしまうミスがあります。"a"と書くと、それはchar型ではなく、文字列スライス(&str)として扱われます。たった1文字であっても、ダブルクォートなら文字列、シングルクォートならchar型です。この区別はRustの型システムにおいて非常に重要です。

以下のサンプルコードでは、アルファベット、数字、日本語、絵文字をそれぞれchar型の変数として定義しています。型推論が優秀なRustでは型注釈を省略できますが、明示的に書く場合は: charと記述します。


fn main() {
    // アルファベットのchar型
    let c1: char = 'z';
    
    // 数字もシングルクォートで囲めばchar型
    let c2: char = '9';
    
    // 日本語(漢字)も1つのcharとして扱える
    let c3 = '漢';
    
    // 4バイト必要な絵文字もchar型に格納可能
    let c4 = '��';

    println!("文字: {}, {}, {}, {}", c1, c2, c3, c4);
}

文字: z, 9, 漢, ��

4. メモリサイズの確認と数値へのキャスト

4. メモリサイズの確認と数値へのキャスト
4. メモリサイズの確認と数値へのキャスト

先ほど「Rustのchar型は4バイトである」と説明しましたが、実際にプログラムを動かして確認してみましょう。C言語などの経験がある方は、「ASCIIコードの 'A' は65番だから1バイトで収まるはずだ」と考えるかもしれません。しかし、Rustのchar型はメモリ上では常に32ビット(4バイト)の領域を確保します。

また、char型は内部的には数値(Unicodeのコードポイント)であるため、整数型(u32など)にキャスト(型変換)することで、その文字が持つUnicode番号を確認することができます。これは文字コードを扱う処理や、暗号化、ハッシュ化などの処理を行う際に非常に役立つ知識です。

以下のコードでは、std::mem::size_of関数を使用してchar型のメモリサイズを出力し、さらに文字を数値に変換して表示しています。


use std::mem;

fn main() {
    // char型のサイズを確認
    // サイズはバイト単位で返される
    let size = mem::size_of::<char>();
    println!("char型のメモリサイズ: {} バイト", size);

    let letter = 'A';
    let kana = 'あ';
    let emoji = '��';

    // char型をu32(符号なし32ビット整数)にキャストしてコードポイントを表示
    println!("'{}' のUnicode番号: {}", letter, letter as u32);
    println!("'{}' のUnicode番号: {}", kana, kana as u32);
    println!("'{}' のUnicode番号: {:x}", emoji, emoji as u32); // 16進数表記
}

char型のメモリサイズ: 4 バイト
'A' のUnicode番号: 65
'あ' のUnicode番号: 12354
'��' のUnicode番号: 1f60a

5. エスケープシーケンスとUnicode入力

5. エスケープシーケンスとUnicode入力
5. エスケープシーケンスとUnicode入力

プログラミングをしていると、キーボードから直接入力できない文字や、制御文字を扱いたい場面に遭遇します。Rustのchar型では、バックスラッシュ(\)を使用したエスケープシーケンスが利用可能です。

よく使われるものには、改行を表す\n、タブを表す\t、キャリッジリターンを表す\r、バックスラッシュそのものを表す\\、シングルクォートを表す\'などがあります。これらは見た目は2文字ですが、実際には1つの文字(char)として扱われます。

さらに強力な機能として、Unicodeのコードポイントを直接指定して文字を作成する\u{...}という構文があります。これを使えば、ソースコード上に直接絵文字や特殊記号を書かなくても、そのコードポイントを指定するだけであらゆる文字を表現できます。これはソースファイルのエンコーディングに依存しない堅牢なコードを書く際に推奨されるテクニックです。


fn main() {
    // 一般的なエスケープシーケンス
    let newline = '\n';
    let tab = '\t';
    let quote = '\'';

    // Unicodeエスケープシーケンス
    // \u{コードポイント} の形式で記述
    let heart = '\u{2764}';       // ❤
    let cat_face = '\u{1F431}';   // ��

    println!("I{}Love{}Rust{}", tab, heart, newline);
    println!("Cat: {}", cat_face);
    println!("Quote: {}", quote);
}

I	Love	Rust
Cat: ��
Quote: '

6. 文字列からchar型を取り出す方法と反復処理

6. 文字列からchar型を取り出す方法と反復処理
6. 文字列からchar型を取り出す方法と反復処理

実用的なアプリケーション開発では、char型を単独で宣言するよりも、入力された文字列(String)から1文字ずつ取り出して処理を行うケースの方が圧倒的に多いでしょう。しかし、Rustの文字列はUTF-8バイト列であるため、配列のようにインデックス(text[0]など)で直接アクセスして文字を取り出すことはできません。

なぜなら、UTF-8では文字によってバイト数が異なるため、単純に「何番目のバイト」が「何文字目」に相当するかが計算できないからです。そこで、Rustでは文字列に対して.chars()というメソッドを使用します。

この.chars()メソッドは、文字列のUTF-8バイト列を解析し、正しいUnicodeスカラー値(つまりchar型)の連続として取り出すためのイテレータ(反復子)を生成します。これを使うことで、日本語などのマルチバイト文字が含まれていても、文字化けすることなく安全に1文字ずつの処理が可能になります。


fn main() {
    let sentence = "Rustは楽しい";

    // .chars()メソッドを使って文字列をcharの並びに変換してループ
    // i はインデックス、c は取り出されたchar
    for (i, c) in sentence.chars().enumerate() {
        println!("{}文字目: {} (サイズ: {} バイト)", i + 1, c, c.len_utf8());
    }
}

1文字目: R (サイズ: 1 バイト)
2文字目: u (サイズ: 1 バイト)
3文字目: s (サイズ: 1 バイト)
4文字目: t (サイズ: 1 バイト)
5文字目: は (サイズ: 3 バイト)
6文字目: 楽 (サイズ: 3 バイト)
7文字目: し (サイズ: 3 バイト)
8文字目: い (サイズ: 3 バイト)

7. 注意点:char型で表現できない「文字」がある?

7. 注意点:char型で表現できない「文字」がある?
7. 注意点:char型で表現できない「文字」がある?

ここまでRustのchar型がいかに万能かを解説してきましたが、最後に重要な注意点をお伝えします。Unicodeの世界には「結合文字」や「書記素クラスタ」と呼ばれる概念があります。これは、複数のchar型を組み合わせて、見た目上の「1文字」を構成するものです。

例えば、国旗の絵文字などは、内部的には2つのchar型(地域指示記号)の組み合わせで表現されることがあります。また、濁点付きの文字(「か」+「゛」=「が」)なども、2つのchar型で構成される場合があります。このような場合、Rustのchar型変数1つには収まりきらず、2つのchar型変数が必要になります。

したがって、「1つのchar型変数には、人間が見た時の1文字が必ず入る」とは限らないことを覚えておいてください。特に文字数をカウントしたり、文字列を反転させたりする処理を実装する際には、単純なchar型のカウントだけでは不正確になる可能性があります。より高度な文字処理が必要な場合は、追加のライブラリ(unicode-segmentationなど)の使用を検討することになりますが、まずは基本として「char型はUnicodeスカラー値である」という点をしっかり押さえておきましょう。

カテゴリの一覧へ
新着記事
New1
C++
C++の関数の作り方を完全ガイド!初心者でもわかる基本構文と定義方法
New2
Rust
Rustのビット演算子とビット操作を徹底解説!低レイヤ開発への第一歩
New3
C言語
C言語の配列名はポインタ?暗黙の変換を初心者向けにわかりやすく解説
New4
C++
C++が今でも現役で使われる理由を徹底解説!長年愛されるプログラミング言語の魅力
人気記事
No.1
Java&Spring記事人気No1
C言語
C言語を学ぶ初心者におすすめの環境構築手順【2025年版】
No.2
Java&Spring記事人気No2
C言語
C言語のソースコードとヘッダファイルの役割とは?初心者向けにわかりやすく解説!
No.3
Java&Spring記事人気No3
C++
MinGWとMSYS2でWindowsにC++環境を構築する方法を徹底解説!初心者でもできるセットアップガイド
No.4
Java&Spring記事人気No4
C言語
Visual Studio CodeでC言語を実行する方法【拡張機能の設定と実行手順】
No.5
Java&Spring記事人気No5
C言語
LinuxでC言語開発環境を構築する方法【GCCとMakefileの基本】
No.6
Java&Spring記事人気No6
C言語
C言語開発でよく使われるエディタとIDEランキング【初心者向け完全ガイド】
No.7
Java&Spring記事人気No7
C++
CMakeの基本構文とCMakeLists.txtを初心者向けに解説
No.8
Java&Spring記事人気No8
C言語
C言語をオンラインで実行できる便利なコンパイラサービスまとめ【初心者向け】