結論

繁体字(はんたいじ)は、台湾・香港・マカオなどで使われている、画数を減らす前の伝統的な字形の漢字です。簡体字は、中国大陸などで使われる画数を減らした字形で、「愛」と「爱」のように形が違う字は、Unicode でも別の文字(別の符号位置)として扱われます。

この記事でわかること

  • 繁体字と簡体字の違い(字形・画数・1対多の対応)と、日本の漢字との関係
  • Python で確かめた符号位置・文字コード(Big5・GB2312・UTF-8)と文字化けの原文
  • OpenCC で変換を誤る例と、lang 属性でフォントの字形が変わる様子を Chromium で実測した結果

2026年10月29日更新|Python 3.13・OpenCC 1.4.2・Chrome for Testing 153(Chromium)で実行確認

この記事で実際に動かしたもの:Python の unicodedata と文字コード変換、OpenCC 1.4.2(Python 版と opencc コマンド)、fontTools でのフォントの中身の読み取り、Playwright で動かした Chromium での表示と使われたフォントの記録、SQLite での検索。

繁体字は「中国語の昔の字」と思われがちですが、今も毎日使われている現役の文字です。Web サイトやアプリで中国語を扱うときは、文字そのもの(符号位置)と、表示の形(フォント)と、言語の指定(lang 属性)の3つを分けて考えると、つまずきが減ります。

flowchart TD
    A[中国語の文章] --> B{読む人の字形}
    B -- 繁体字 --> C[lang=zh-Hant<br>繁体字のフォント]
    B -- 簡体字 --> D[lang=zh-Hans<br>簡体字のフォント]
    C --> E[変換は OpenCC<br>語は人が確認]
    D --> E

よく調べられることの答えを先にまとめます。

知りたいこと 答え 詳しい節
繁体字とは 画数を減らす前の伝統的な字形の漢字。台湾・香港・マカオなどで使われる 繁体字とは
繁体字と簡体字の違い 簡体字は画数を減らした字形。「電→电」「門→门」のように部品ごと簡単になる 繁体字と簡体字の違い
繁体字と簡体字は別の言語か 別の言語ではなく、書き方(字形)の違い。話し言葉の違いとは別の話 繁体字とは
Unicode では同じ文字か 形が違う字は別の符号位置(愛 U+611B・爱 U+7231)。形の差が小さい字は同じ符号位置 Unicode での繁体字と簡体字
繁体字と簡体字を変換したい OpenCC が定番。s2t・t2s のほか、台湾の言い回しにする s2twp がある 繁体字と簡体字の変換(OpenCC)
機械的に変換して問題ないか 1つの簡体字に繁体字が複数対応する字があり、誤ることがある。往復で戻らない字もある 変換を誤る例
日本の漢字は繁体字か どちらでもない。日本の新字体は独自に簡略化された字形 日本の漢字(新字体)との関係
Web ページでの言語の指定 lang="zh-Hant"(繁体字)・lang="zh-Hans"(簡体字)。フォントの字形の選択にも効く Web ページでの指定
繁体字の入力方法 Windows は繁体字中国語 IME(注音・倉頡・速成)、Mac は「中国語(繁体字)」の入力ソース 繁体字の入力方法

確認環境:Ubuntu 24.04.5 LTS・Python 3.13.18(unicodedata は Unicode 15.1.0)。文字コードの確認は Python 標準の codecs(gb2312・gbk・big5・cp950・cp932 など)で行いました。変換は pip の OpenCC 1.4.2(Python 版。設定ファイルと辞書は同梱)を作業用のフォルダーの venv に入れ、Python の API と opencc コマンドの両方で動かしています。フォントは Ubuntu の fonts-noto-cjk(1:20230817、Noto Sans CJK 2.004)と fonts-wqy-zenhei(0.9.45)、Google Fonts と同じ分け方の npm パッケージ @fontsource-variable/noto-sans-tc・noto-sans-sc 5.3.1 を使い、fontTools 4.66.1 で中身を読みました。表示は Playwright 1.63.0 で Chrome for Testing 153.0.8010.12(Chromium)をヘッドレスで起動し、127.0.0.1 の自分のページだけを開いて、Chrome DevTools Protocol の CSS.getPlatformFontsForNode で「実際に使われたフォント」を記録し、画面を画素単位で比べています。検索の実験は SQLite 3.45.1 です。Windows・Mac の入力方法は Microsoft サポート・Apple サポート、言語タグは W3C と Google 検索セントラル、変換の設定は OpenCC の README で確かめた範囲だけを書いています。Windows・Mac の実機では動かしていません。図は mermaid で描画を確かめました(確認日 2026年10月29日)。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「繁体字とは?簡体字との違いをUnicode・変換・フォントで実測」

繁体字とは(意味と使われる地域)

この節では、繁体字という言葉の意味と、どこで使われているか、場面によって何を指すかが分かります。

繁体字は、漢字を簡略化する前の、画数の多い伝統的な字形のことです。中国語の文字には、大きく分けて繁体字と簡体字の2つの書き方があります。中国大陸では1950年代から漢字の簡略化が進められ、画数を減らした簡体字が標準になりました。一方、台湾・香港・マカオなどでは、簡略化する前の字形が使われ続けています。台湾では「正體字」と呼ぶこともあります。

大事なのは、繁体字と簡体字は「言語の違い」ではなく「書き方の違い」だということです。同じ中国語の文を、繁体字でも簡体字でも書けます。話し言葉の違い(たとえば標準中国語と広東語)は、字形の違いとは別の話です。

繁体字が主に使われる地域

台湾・香港・マカオ

簡略化より前から続く海外の華人社会の一部

古典や書道、歴史資料

簡体字が主に使われる地域

中国大陸

シンガポール・マレーシア

中国語の学習教材の多く

場面別に見る「繁体字」の意味

IT の場面では、「繁体字」という言葉が少しずつ違うものを指します。会話や仕様書で混ざりやすいので、先に整理します。

場面 「繁体字」が指すもの 例
ふだんの会話・語学 画数の多い伝統的な字形と、それで書かれた中国語 「台湾旅行の前に繁体字を少し覚える」
文字コード 繁体字の符号位置の集まり。以前は Big5 という文字コードがよく使われた 愛 U+611B、Big5 の文字は約1万3千字
フォント 同じ符号位置の字を、台湾・香港の字形で描くフォント Noto Sans TC(台湾)・Noto Sans HK(香港)
Web・アプリの言語設定 言語タグの用字(スクリプト)Hant zh-Hant・zh-TW・zh-HK
翻訳・ローカライズ 字形に加えて、台湾や香港の言い回し(語彙)まで含めた中国語 「软件」→「軟體」(台湾)

特に最後の行が要注意です。「繁体字に変換する」と「台湾向けに翻訳する」は別の作業で、後の節で、字だけを置き換えたときと言い回しまで変えたときの違いを実物で見せます。

繁体字と簡体字の違い(字形・画数・対応表)

この節では、繁体字と簡体字が具体的にどう違うのか、よく使う字の対応表と、簡略化の決まりが分かります。

簡体字は、繁体字の画数を減らすために、字全体や部品(偏・つくり)を簡単な形に置き換えたものです。よく例に出る字を、符号位置(Unicode の番号)と一緒に並べました。符号位置は、手元の Python で調べた値です。

繁体字 簡体字 画数(繁→簡) 符号位置(繁/簡) 意味
愛爱13→10U+611B/U+7231愛
電电13→5U+96FB/U+7535電気
開开12→4U+958B/U+5F00開く
書书10→4U+66F8/U+4E66本・書く
門门8→3U+9580/U+95E8門
東东8→5U+6771/U+4E1C東
國国11→8U+570B/U+56FD国
體体23→7U+9AD4/U+4F53体
漢汉14→5U+6F22/U+6C49漢
龍龙16→5U+9F8D/U+9F99竜

画数は一般的な数え方です。「龍→龙」「體→体」のように、半分以下になる字も多くあります。

部品ごとの簡略化

簡略化には決まった型があり、同じ部品を持つ字はまとめて簡単になります。OpenCC の t2s(繁体字→簡体字)で変換して確かめた結果です。

語 → 语   (言 → 讠)
銀 → 银   (金 → 钅)
飯 → 饭   (食 → 饣)
紅 → 红   (糸 → 纟)
問 → 问   (門 → 门)
軌 → 轨   (車 → 车)
財 → 财   (貝 → 贝)
媽 → 妈   (馬 → 马)
鳴 → 鸣   (鳥 → 鸟)

部品の対応を覚えると、簡体字を初めて見ても元の字を推測しやすくなります。逆に、「人・大・山・中」のように簡略化されず、繁体字と簡体字で同じ字もたくさんあります。

1つの簡体字に、繁体字が複数ある字

簡略化のときに、意味の違う複数の字が1つの簡体字にまとめられた例があります。これが、後で説明する「機械的な変換を誤る」原因です。Big5 に入っている漢字 13,061字を OpenCC の t2s で簡体字にし、同じ簡体字になる組を数えました。

2,311字GB2312 の漢字で、繁体字にすると変わる字6,763字のうち(s2t で変換)
3,134字Big5 の漢字で、簡体字にすると変わる字13,061字のうち(t2s で変換)
293組複数の繁体字が同じ簡体字になる組発/髪、後/后、乾/幹/干 など
发 ← 發 髮          (発する / 髪)
后 ← 后 後          (皇后 / 後ろ)
干 ← 乾 干 幹 榦    (乾く / 干す / 幹部)
面 ← 面 麵          (顔・面 / 麺)
钟 ← 鍾 鐘          (人名など / 鐘・時計)
台 ← 台 檯 臺 颱    (台 / 机 / 台湾の臺 / 台風の颱)
复 ← 复 復 複       (戻る / 複数)
系 ← 係 系 繫       (関係 / 系統 / つなぐ)
只 ← 只 隻          (ただ / 動物を数える語)
云 ← 云 雲          (言う / 雲)

簡体字から繁体字にするときは、この中から文脈で正しい字を選ぶ必要があります。「发」が「發」か「髮」かは、字だけ見ても決まりません。

Unicodeでの繁体字と簡体字(同じ字・違う字をPythonで確かめる)

この節では、繁体字と簡体字がコンピューターの中でどう区別されているかを、Python の実行結果で確かめます。

形がはっきり違う繁体字と簡体字は、Unicode で別の符号位置になっています。そのため、プログラムから見ると「愛」と「爱」は、「A」と「B」くらい別の文字です。

import unicodedata as u
pairs = [('爱', '愛'), ('电', '電'), ('东', '東'), ('国', '國')]
for s, t in pairs:
    print(s, t, f'U+{ord(s):04X} U+{ord(t):04X}',
          s.encode().hex(' '), t.encode().hex(' '), s == t)
print(u.name('爱'), '/', u.name('愛'))
爱 愛 U+7231 U+611B e7 88 b1 e6 84 9b False
电 電 U+7535 U+96FB e7 94 b5 e9 9b bb False
东 東 U+4E1C U+6771 e4 b8 9c e6 9d b1 False
国 國 U+56FD U+570B e5 9b bd e5 9c 8b False
CJK UNIFIED IDEOGRAPH-7231 / CJK UNIFIED IDEOGRAPH-611B

UTF-8 では、どちらも3バイトです。文字の名前はどちらも「CJK UNIFIED IDEOGRAPH-番号」で、名前から繁体字か簡体字かは分かりません。

同じ符号位置なのに、地域で形が違う字

一方で、形の違いが小さい字は、1つの符号位置にまとめられています。これを「統合漢字(Han unification)」といいます。Unicode の FAQ は、文字の基本的な同一性が問題にならないなら1つの文字として符号化し、地域による形の違いはフォントで扱う、と説明しています。

骨 U+9AA8 CJK UNIFIED IDEOGRAPH-9AA8
直 U+76F4 CJK UNIFIED IDEOGRAPH-76F4
化 U+5316 CJK UNIFIED IDEOGRAPH-5316
次 U+6B21 CJK UNIFIED IDEOGRAPH-6B21
今 U+4ECA CJK UNIFIED IDEOGRAPH-4ECA

「骨」は日本・台湾・中国大陸で細部の形が違いますが、符号位置は U+9AA8 の1つだけです。どの形で描くかは、フォントと lang 属性で決まります(後の節で実測します)。

1形が違う字は別の文字

愛/爱、電/电。プログラムでは == が False になり、検索でも一致しない。

2形の差が小さい字は同じ文字

骨・直・化など。データは同じで、見た目だけがフォントで変わる。

3名前では見分けられない

どちらも CJK UNIFIED IDEOGRAPH。繁体字か簡体字かの判定には辞書が要る。

互換漢字は正規化で別の字に変わる

もう1つの落とし穴が「CJK 互換漢字」です。以前の文字コードとの往復のために用意された字で、Unicode 正規化(NFC)をかけると、見た目が同じ統合漢字に置き換わります。

import unicodedata as u
for cp in [0xF914, 0xF900, 0xF902, 0xFA11]:
    c = chr(cp); n = u.normalize('NFC', c)
    print(f'U+{cp:04X} {c} -> U+{ord(n):04X} {n} {u.name(c)}')
U+F914 樂 -> U+6A02 樂 CJK COMPATIBILITY IDEOGRAPH-F914
U+F900 豈 -> U+8C48 豈 CJK COMPATIBILITY IDEOGRAPH-F900
U+F902 車 -> U+8ECA 車 CJK COMPATIBILITY IDEOGRAPH-F902
U+FA11 﨑 -> U+FA11 﨑 CJK COMPATIBILITY IDEOGRAPH-FA11

繁体字の昔の文献をデジタル化したデータには、互換漢字が混ざっていることがあります。正規化の前後で文字数は変わりませんが、符号位置が変わるので、ハッシュ値や重複判定の結果が変わります。「﨑」(U+FA11)のように、互換漢字の区画にあっても正規化で変わらない字もあります。

日本語の文字化けや、濁点が分かれる正規化の話は、関連記事「文字化けの原因8選|濁点分離・utf8mb4・絵文字の文字数」で扱っています。

繁体字の文字コード(Big5・GB2312・UTF-8)と文字化け

この節では、繁体字と簡体字で使われてきた文字コードと、それぞれに入る字・入らない字、文字化けしたときの見え方が分かります。

今は UTF-8 を使えば繁体字も簡体字も日本語も1つのファイルに混ぜられます。ただ、以前のシステムやファイルでは、繁体字は Big5、簡体字は GB2312・GBK・GB18030 という文字コードがよく使われてきました。Python の標準の codecs で、U+4E00〜U+9FFF の漢字のうち何字を表せるかを数えました。

文字コード 主な用途 表せた漢字の数 手元で表せなかった字(例)
GB2312簡体字(以前の標準)6,763愛 電 國 東 體 龍 広 髮 発
GBK簡体字(GB2312 の拡張)20,902(例の字はすべて表せた)
Big5繁体字13,061爱 电 国 东 龙 広 発
Big5-HKSCS繁体字(香港の追加字)15,316―
CP932(Shift_JIS)日本語6,682爱 电 东 龙

CP932 は「国」「体」を表せます。日本の常用漢字と同じ形だからです。Big5 に簡体字は基本的に入らず、GB2312 に繁体字は入りません。表せない字を変換しようとすると、次のエラーになります。

>>> '东京'.encode('big5')
UnicodeEncodeError: 'big5' codec can't encode character '东' in position 0: illegal multibyte sequence
>>> '臺灣'.encode('gb2312')
UnicodeEncodeError: 'gb2312' codec can't encode character '臺' in position 0: illegal multibyte sequence

文字化けの見え方

Big5 で保存したファイルを別の文字コードとして読むと、次のように化けます。「繁體字」を Big5 にしたバイト列で試しました。

Big5 のバイト列     : c1 63 c5 e9 a6 72
CP932 として読む    : チcナ鬥r
UTF-8 として読む    : �c��r
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc1 in position 0: invalid start byte
UTF-8 を CP950(Big5)として読む : 蝜�擃�摮�

半角カナと漢字が混ざる、または意味のない漢字が並ぶときは、文字コードの取り違えを疑います。Python で読むときは open(path, encoding='big5') や encoding='cp950' のように、ファイルの実際の文字コードを指定します。読み込み時のエラーの直し方は、関連記事「UnicodeDecodeErrorの原因と直し方|cp932・utf-8・BOM」で扱っています。

バイト数の違い

同じ文でも、文字コードでバイト数が変わります。

繁體字と簡体字  utf-8: 21  utf-16-le: 14  gb18030: 14
中華民國        utf-8: 12  utf-16-le: 8   gb18030: 8   big5: 8

UTF-8 は漢字1字が3バイト、Big5・GB18030 は2バイトです。容量は1.5倍になりますが、繁体字・簡体字・日本語を混ぜられる利点のほうが大きいため、新しく作るシステムでは UTF-8 にします。

繁体字と簡体字の変換(OpenCCの使い方)

この節では、繁体字と簡体字を変換する定番のライブラリ OpenCC の入れ方と使い方、設定ファイルの選び方が分かります。

OpenCC(Open Chinese Convert)は、字の置き換えだけでなく、語句の辞書を使って変換するライブラリです。ライセンスは Apache License 2.0 で、Python・C++・コマンドから使えます。

最初の5分で変換する

1

pip で入れる

pip install opencc。手元では venv に入れ、辞書も一緒に入った(追加のダウンロードは無し)。

OpenCC 1.4.2

2

設定ファイルを選ぶ

簡体字→繁体字は s2t、台湾の字形は s2tw、台湾の言い回しまで変えるなら s2twp、香港は s2hk。逆向きは t2s・tw2sp など。

README の一覧

3

変換して結果を読む

opencc.OpenCC('s2twp.json').convert(文字列)。語の置き換えが入るので、人が読んで確かめる。

次の節で誤りの例

import opencc
converter = opencc.OpenCC('s2t.json')
print(converter.convert('汉字'))
漢字

コマンドでも同じことができます。

$ echo '我们在开发一个新的软件系统,后台服务运行在云计算平台上。' > in.txt
$ opencc -c s2twp.json -i in.txt
我們在開發一個新的軟體系統,後臺服務執行在雲端計算平臺上。

設定ファイルの違い(字だけか、言い回しまでか)

同じ簡体字の語を、4つの設定で変換した結果です。s2t・s2tw・s2hk は主に字形を変え、s2twp は台湾で使う語に言い換えます。

簡体字 s2t(標準) s2tw(台湾の字形) s2twp(台湾の語) s2hk(香港の字形)
软件軟件軟件軟體軟件
内存內存內存記憶體內存
鼠标鼠標鼠標滑鼠鼠標
信息信息信息資訊信息
网络網絡網絡網路網絡
视频視頻視頻影片視頻
程序员程序員程序員程式設計師程序員
面包麪包麵包麵包麪包
里面裏面裡面裡面裏面
台湾臺灣臺灣臺灣台灣

「面包」は s2t で「麪包」、s2tw で「麵包」になりました。同じ繁体字でも、地域によって標準の字形(異体字)が違うためです。台湾向けなら s2tw か s2twp、香港向けなら s2hk を選びます。

逆向きの tw2sp(台湾の繁体字→中国大陸の簡体字と言い回し)も確かめました。

軟體 → 软件     記憶體 → 内存     滑鼠 → 鼠标
印表機 → 打印机  資訊 → 信息       網路 → 网络
計程車 → 出租车  影片 → 视频       程式設計師 → 程序员

速さ

56万字の簡体字の文を1回で変換した時間です(2 CPU のマシン。設定の読み込みは 0.006 秒)。

s2t   560000 chars 0.022s
s2twp 560000 chars 0.077s

語句の辞書を多く使う s2twp のほうが遅いものの、記事数千本分でも1秒かかりません。変換の速さが問題になることは少なく、時間をかけるべきなのは結果の確認です。

変換を誤る例と、往復で戻らない字

この節では、OpenCC で実際に誤変換になった文と、繁体字→簡体字→繁体字の往復で元に戻らない字が分かります。

OpenCC は語句の辞書で多くの字を正しく選びますが、文脈まで読むわけではありません。s2twp で変換した結果です。

簡体字の文 s2twp の結果 判定
我在后面的面馆吃了一碗面。我在後面的麵館吃了一碗麵。正しい(後・麵を選べた)
我的头发很干。我的頭髮很乾。正しい(髮・乾を選べた)
乾隆皇帝喜欢吃饼干。乾隆皇帝喜歡吃餅乾。正しい
他干了一杯,然后去干活。他幹了一杯,然後去幹活。前半が誤り。「一杯を飲み干す」は「乾」
他们在讨论“后”这个字。他們在討論“後”這個字。誤り。字そのものの話は変換してはいけない
后台服务运行在云计算平台上後臺服務執行在雲端計算平臺上「運行」が「執行」に言い換わり、意味がずれた

「干杯」「干部」「若干」のような語は辞書に入っていて、それぞれ「乾杯」「幹部」「若干」と正しくなりました。誤りが出るのは、辞書に無い組み合わせや、文字そのものを話題にしている文です。

変換の扱い方

避けたい簡体字のページを s2t で一括変換し、確認せずに繁体字版として公開する
→
代わりにs2tw か s2twp で下訳を作り、繁体字を読める人が語と字を確かめてから公開する

見分ける問い:「読む人の地域の言い回しになっているか」

往復で元に戻らない字

繁体字を t2s で簡体字にして、s2t で繁体字に戻しました。

乾杯 -> 干杯 -> 乾杯 OK
幹部 -> 干部 -> 幹部 OK
頭髮 -> 头发 -> 頭髮 OK
後天 -> 后天 -> 後天 OK
麵包 -> 面包 -> 麪包 CHANGED
台灣 -> 台湾 -> 臺灣 CHANGED
裡面 -> 里面 -> 裏面 CHANGED

語の選び方は戻っても、異体字(麵と麪、台と臺、裡と裏)は標準の形にそろえられて戻りません。繁体字の原文があるなら、原文を残しておき、簡体字版から繁体字版を作り直さないようにします。

繁体字か簡体字かを判定する

t2s と s2t の両方をかけて、変わるかどうかで判定する方法があります。

import opencc
t2s = opencc.OpenCC('t2s.json'); s2t = opencc.OpenCC('s2t.json')
def kind(x):
    a, b = t2s.convert(x), s2t.convert(x)
    if a == x and b == x: return '区別なし'
    if a == x: return '簡体字'
    if b == x: return '繁体字'
    return '混在'
for x in ['電腦', '电脑', '中文', '這是簡体字', '日本語の文章']:
    print(x, kind(x))
電腦 繁体字
电脑 簡体字
中文 区別なし
這是簡体字 混在
日本語の文章 繁体字

「日本語の文章」が繁体字と判定されました。「語」が繁体字と同じ形だからです。日本語が混ざる文では、この方法は使えません。日本語かどうかは、ひらがな・カタカナの有無で先に分けます。文字の種類を正規表現で判定する方法は、関連記事「正規表現でひらがな・カタカナ・漢字を判定する方法【言語別】」で扱っています。

日本の漢字(新字体)との関係

この節では、日本で使う漢字が繁体字・簡体字のどちらに近いのか、変換ツールにかけると何が起きるかが分かります。

日本の漢字(新字体)は、繁体字でも簡体字でもありません。日本も戦後に字体を整理しましたが、中国大陸とは別に行ったため、同じ字でも簡略化の仕方が違います。

日本 繁体字 簡体字 メモ
広廣广3つとも違う形
発發发3つとも違う形
図圖图3つとも違う形
国國国日本と簡体字が同じ
愛愛爱日本と繁体字が同じ
学學学日本と簡体字が同じ
芸藝艺日本の「芸」は、中国語では別の字(香草の名)

日本語の文を中国語用の設定で変換すると、中途半端な結果になります。

原文     s2t        jp2t       t2s
広告     広告       廣告       広告
芸術     芸術       藝術       芸术
図書館   図書館     圖書館     図书馆
気温     気溫       氣溫       気温
台風     臺風       臺風       台风
発売     発売       發賣       発売

s2t は日本の新字体を知らないので「広」「図」はそのまま、「温」だけ「溫」に変わりました。jp2t(日本の新字体→旧字体)は字形をそろえますが、「発売」が「發賣」になるなど、中国語として自然な語にはなりません。OpenCC の README も、日本語関連の設定は探索的な研究向けで本番には勧めない、としています。日本語から繁体字の中国語にするのは「翻訳」で、変換ツールの仕事ではありません。

フォントで字形が変わる(Noto Sans TC・SCとlang属性)

この節では、同じ符号位置の字が、フォントと lang 属性の組み合わせでどの地域の形で表示されるかを、Chromium で画素単位まで比べた結果が分かります。

Noto Sans CJK のように地域ごとの字形を持つフォントは、lang 属性を見て形を切り替えます。Noto Sans CJK のファイル(TTC)には日本・簡体字・繁体字(台湾)・香港・韓国の5つの顔が入っていて、fontTools で読むと、同じ字でも使う字形の番号が違いました。

char  JP        SC        TC        HK        KR
骨    cid45132  cid45133  cid45134  cid45132  cid45132   distinct=3
化    cid11563  cid11564  cid11565  cid11563  cid62135   distinct=4
遍    cid40420  cid40421  cid40422  cid40423  cid62888   distinct=5
直    cid27873  cid27874  cid27874  cid27875  cid27873   distinct=3

「遍」は5つの地域すべてで形が違います。「直」は簡体字と繁体字で同じ形でした。

lang 属性で形が切り替わるか(Chromium で実測)

各地域の字形をそれぞれの顔で描いた画像を見本にし、条件を変えて描いた画像がどの見本と一致するかを、画素の差で判定しました。8字(骨直化次今令遍誤)のうち、地域の形が判定できた字の結果を代表して示します。

font-family lang 表示された形(骨・化・遍)
"Noto Sans CJK JP"なし・ja日本の形
"Noto Sans CJK JP"zh-Hans・zh-CN・zh簡体字(SC)の形
"Noto Sans CJK JP"zh-Hant・zh-TW繁体字(TC)の形
"Noto Sans CJK JP"zh-HK香港(HK)の形
"Noto Sans CJK TC"なし繁体字(TC)の形
"Noto Sans CJK TC"ja日本の形
sans-serif(総称名)zh-Hant・zh-Hans・なしどれも同じ形(WenQuanYi Zen Hei が使われた)
"Noto Sans TC", sans-serifzh-Hant同上(Noto Sans TC が入っておらず代わりのフォント)

分かったことは3つです。

1font-family が JP でも lang が勝つ

Noto Sans CJK JP を指定しても、lang="zh-Hant" なら台湾の形で描かれた。フォントの locl(地域別字形)機能が働くため。

2lang="zh" は簡体字の形

地域や用字を付けない zh は、簡体字の形になった。繁体字のページを lang="zh" にすると、字形が意図とずれる。

3地域の形を持たないフォントでは変わらない

総称名 sans-serif で選ばれた WenQuanYi Zen Hei は、lang を変えても同じ形だった。

確認のため、フォントの locl 機能を CSS で止める(font-feature-settings: "locl" 0)と、lang を変えても形が切り替わらないことも確かめました。

Google Fonts の Noto Sans TC・SC に入っている字

Web フォントとしてよく使う Google Fonts の Noto Sans TC(繁体字)と Noto Sans SC(簡体字)は、Noto Sans CJK から地域で使う字を選んで作られています。Google Fonts と同じ分け方の Fontsource 版(可変フォント)を fontTools で読みました。

フォント ファイル数 合計の大きさ 文字数
Noto Sans TC(繁体字)1084.28MB12,372
Noto Sans SC(簡体字)1014.50MB13,635

共通の字は 9,920字、TC だけにある字が 2,452字、SC だけにある字が 3,715字でした。Noto Sans TC には「爱」「简」が無く、日本の新字体の「図」「気」「経」「済」もありません。127.0.0.1 のページで、このフォントを指定した文を Chromium に表示し、実際に使われたフォントを記録しました。

我愛你,繁體字的網頁。        [('Noto Sans TC Thin', 11)]
我爱你,简体字的网页。        [('WenQuanYi Zen Hei', 2), ('Noto Sans TC Thin', 9)]
日本の図書館の気温と経済。    [('WenQuanYi Zen Hei', 4), ('Noto Sans TC Thin', 9)]
我爱你,简体字的网页。(SC)    [('Noto Sans SC Thin', 11)]

「Thin」は、可変フォントの中に書かれた名前を CDP がそのまま返したもので、ここでは太さの指定は変えていません。繁体字用のフォントに簡体字や日本語を流すと、無い字だけ別のフォントで描かれ、1行の中で書体が混ざります。言語ごとにフォントを分けて指定するのが確実です。日本語のフォント指定の書き方は、関連記事「CSS font-family日本語おすすめ指定|游ゴシック対応コピペ集」で扱っています。

繁体字のWebページでの指定(lang・hreflang・:lang)

この節では、繁体字・簡体字のページで lang 属性や hreflang に何を書けばよいかと、CSS の :lang() の落とし穴が分かります。

繁体字のページは lang="zh-Hant"(地域も示すなら zh-Hant-TW・zh-Hant-HK)、簡体字のページは lang="zh-Hans" が基本です。W3C の「Language tags in HTML and XML」は、以前は zh-CN を簡体字、zh-TW や zh-HK を繁体字の意味に流用していたが、zh-Hans・zh-Hant のほうが一貫して正確で、広く使われるようになっている、と説明しています。

<html lang="zh-Hant-TW">
...
<p lang="ja">日本語の段落はここだけ ja にする</p>

CSS の :lang() は地域タグと用字タグを区別する

Chromium で、いろいろな lang の要素に :lang() のセレクターが一致するかを調べました。

:lang(zh)      -> zh-Hant, zh-TW, zh-Hant-TW, zh-HK, zh-Hans, zh-CN, zh
:lang(zh-Hant) -> zh-Hant, zh-Hant-TW
:lang(zh-TW)   -> zh-TW
:lang(zh-Hans) -> zh-Hans

:lang(zh-Hant) は lang="zh-TW" や lang="zh-HK" の要素に一致しませんでした。前の節のとおり、フォントの字形は zh-TW でも繁体字の形になるので、表示とセレクターで扱いがずれます。CSS で繁体字だけにフォントを当てるなら、サイトの lang の書き方を1つにそろえるか、セレクターを並べます。

:lang(zh-Hant), :lang(zh-TW), :lang(zh-HK) {
  font-family: "Noto Sans TC", "PingFang TC", "Microsoft JhengHei", sans-serif;
}
:lang(zh-Hans), :lang(zh-CN) {
  font-family: "Noto Sans SC", "PingFang SC", "Microsoft YaHei", sans-serif;
}

hreflang(検索エンジン向け)

Google 検索セントラルの「ページのローカライズ版」の説明では、hreflang の値は言語(ISO 639-1)と地域(ISO 3166-1 Alpha 2)で書き、用字(ISO 15924)も指定できる、としています。例として zh-Hant(繁体字)・zh-Hans(簡体字)が挙がっていて、地域コードの zh-TW からは繁体字が導かれる、とも書かれています。

<link rel="alternate" hreflang="zh-Hant" href="https://example.com/zh-hant/" />
<link rel="alternate" hreflang="zh-Hans" href="https://example.com/zh-hans/" />
<link rel="alternate" hreflang="ja" href="https://example.com/ja/" />
  • 1html の lang を zh-Hant か zh-Hans にしたzh だけだと、フォントによっては簡体字の形で描かれる
  • 2日本語や英語が混ざる部分に別の lang を付けた日本語の段落は ja。字形と読み上げの両方に効く
  • 3フォントを言語ごとに指定したTC のフォントに無い字は別のフォントで描かれる
  • 4:lang() のセレクターがサイトの lang の書き方と合っている:lang(zh-Hant) は zh-TW に一致しない
  • 5hreflang で繁体字版と簡体字版を互いに示した片方からだけ示しても対応関係にならない

繁体字の検索・データベースでの扱い

この節では、繁体字と簡体字が混ざったデータを検索するときに何が起きるかと、正規化した列を持たせる方法が分かります。

繁体字と簡体字は別の文字なので、そのままでは検索で一致しません。Python の casefold や NFKC 正規化をかけても、「電腦」と「电脑」は等しくなりませんでした。

'電腦' == '电脑'          False
casefold して比べる      False
NFKC して比べる          False

SQLite で、商品名に繁体字と簡体字が混ざった表を作り、検索を試しました。

import sqlite3, opencc
tw2sp = opencc.OpenCC('tw2sp.json')
db = sqlite3.connect(':memory:')
db.execute('create table item(id integer primary key, name text, name_norm text)')
for r in ['筆記型電腦', '笔记本电脑', '記憶體 16GB', '内存 16GB']:
    db.execute('insert into item(name, name_norm) values(?, ?)', (r, tw2sp.convert(r)))
print(db.execute("select name from item where name like ?", ('%电脑%',)).fetchall())
q = tw2sp.convert('電腦')
print(db.execute("select name from item where name_norm like ?", ('%' + q + '%',)).fetchall())
q = tw2sp.convert('記憶體')
print(q, db.execute("select name from item where name_norm like ?", ('%' + q + '%',)).fetchall())
[('笔记本电脑',)]
[('筆記型電腦',), ('笔记本电脑',)]
内存 [('記憶體 16GB',), ('内存 16GB',)]

元の列だけでは簡体字の行しか見つかりませんでしたが、検索用に簡体字へそろえた列(name_norm)を持たせ、検索語も同じ変換をかけると、両方が見つかりました。tw2sp は「筆記型電腦」を「笔记本电脑」、「記憶體」を「内存」と語ごと言い換えるので、台湾と中国大陸で呼び方が違う語にも一致します。

  1. 1表示用の列は原文のまま残す往復で戻らない字があるため、変換した値で上書きしない
  2. 2検索用の列を作り、片方の字形にそろえるt2s(字だけ)か tw2sp(語も)を選ぶ
  3. 3検索語にも同じ変換をかける変換の設定と版をそろえる
  4. 4辞書を更新したら検索用の列を作り直すOpenCC の版を上げたときは再計算する

言語ごとに名前や説明を持つテーブルの設計は、関連記事「多言語対応のDB設計パターン比較|翻訳テーブルのDDLと選び方」で扱っています。

繁体字の入力方法(Windows・Mac)

この節では、Windows と Mac で繁体字を入力するための設定を、公式のヘルプで確かめた範囲で説明します。

繁体字を入力するには、繁体字用の入力方式(IME・入力ソース)を追加します。日本語の IME でも「愛」のように日本と同じ形の字は打てますが、「體」「們」のような字をまとめて入力するなら、中国語の入力方式が便利です。

Windows(Microsoft 繁体字中国語 IME)

Microsoft サポートの「Microsoft 繁体字中国語 IME」では、入力方式として Microsoft Bopomofo(注音)・Microsoft ChangJie(倉頡)・Microsoft Quick(速成)が挙がっています。設定は「時刻 & 言語」→「言語 & 地域」で繁体字中国語の言語オプションを開き、キーボードを確かめます。一覧に無ければキーボードとして追加します。

  • Shift:英語モードと中国語モードの切り替え
  • Shift + Space:全角と半角の切り替え

Mac(中国語(繁体字)の入力ソース)

Apple サポートの「Mac で中国語または広東語の入力ソースを設定する」では、次の手順が示されています。

1

キーボードの設定を開く

アップルメニュー →「システム設定」→ サイドバーの「キーボード」。

Apple サポート

2

入力ソースを編集する

「テキスト入力」の「編集」をクリックし、追加ボタン(+)を押す。

Apple サポート

3

中国語(繁体字)を選ぶ

注音・拼音・倉頡・速成・画数などから選んで「追加」。広東語は「広東語(繁体字)」。

Apple サポート

Mac の繁体字の入力ソースには、注音(Zhuyin)・注音 Eten・拼音(Pinyin)・双拼・画数(Stroke)・倉頡(Cangjie)・速成(Sucheng)があり、トラックパッドでの手書き入力もあります。簡体字と繁体字は別の入力ソースとして用意されています。

繁体字でよくあるエラー・つまずき

この節では、繁体字を扱うプログラムや Web ページで出やすいエラーと症状を、原因と直し方つきでまとめます。

症状・エラー原文 原因 直し方
UnicodeEncodeError: 'big5' codec can't encode character '东'簡体字(东)を Big5 で保存しようとしたUTF-8 で保存する。Big5 が必須なら先に s2t で繁体字にする
UnicodeEncodeError: 'gb2312' codec can't encode character '臺'繁体字(臺)を GB2312 で保存しようとしたUTF-8 か GB18030 にする
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc1 in position 0: invalid start byteBig5 のファイルを UTF-8 として読んだencoding='big5'(または 'cp950')で読む
「チcナ鬥r」のように半角カナと漢字が混ざるBig5 を CP932 として読んだ文字コードを指定して読み直す
RuntimeError: s2tw_typo.json not found or not accessible.OpenCC の設定ファイル名の打ち間違いs2t・s2tw・s2twp・t2s など README の名前にする
繁体字のページで一部の字だけ書体が違うTC のフォントに無い字(簡体字・日本の新字体)が混ざった言語ごとに lang とフォントを分ける
繁体字のはずが中国大陸の形で表示されるlang="zh" や lang 無しlang="zh-Hant"(または zh-TW・zh-HK)にする
CSS の :lang(zh-Hant) が効かない要素の lang が zh-TW・zh-HKセレクターを並べるか、lang の書き方をそろえる
繁体字に変換した文が不自然s2t は字だけを置き換え、語は変えない台湾向けは s2twp、香港向けは s2hk。最後は人が確認する
簡体字版から戻した繁体字が原文と違う異体字(麵/麪、台/臺)が標準の形にそろう原文を残し、往復変換で作り直さない

繁体字・簡体字の扱いを決める判断表

この節では、やりたいことに合わせて、文字コード・変換の設定・lang・フォントをどう選ぶかが分かります。

やりたいこと 選ぶもの 注意
繁体字と簡体字を同じシステムで扱うUTF-8Big5・GB2312 は片方しか入らない
簡体字の文から台湾向けの下訳を作るOpenCC s2twp語の言い換えが入る。人が確認する
簡体字の文を香港の字形にするOpenCC s2hk語は言い換えない
字形だけそろえて意味は変えないOpenCC s2t・s2tw・t2s1対多の字(发・后・干)は確認する
繁体字・簡体字のどちらでも検索に当てる検索用の列を t2s か tw2sp でそろえる表示用の原文は残す
繁体字のページを正しい字形で表示するlang="zh-Hant" + 繁体字のフォント総称名 sans-serif だけに頼らない
日本語の文を繁体字の中国語にする翻訳(人か翻訳ツール)OpenCC の jp2t は本番向けではない

繁体字についてよくある質問

この節では、繁体字と簡体字について、検索でよく聞かれる疑問に短く答えます。

Q. 繁体字は何と読みますか。
「はんたいじ」です。簡体字は「かんたいじ」と読みます。

Q. 繁体字と簡体字、どちらを学ぶべきですか。
使う地域で決めます。台湾・香港の人とやりとりするなら繁体字、中国大陸の人や教材が中心なら簡体字です。日本語を読める人は、日本と同じ形の字が多い繁体字を読みやすいと感じることもありますが、形が違う字も多くあります。

Q. 繁体字が読めれば簡体字も読めますか。
部品の簡略化の型(言→讠、金→钅など)を覚えると推測しやすくなります。ただ、「开」「书」のように元の字から大きく形が変わった字は、個別に覚える必要があります。

Q. 台湾と香港の繁体字は同じですか。
多くは同じですが、標準とする字形や異体字に違いがあります。OpenCC に s2tw と s2hk が分かれているのはこのためで、「台湾」は s2tw で「臺灣」、s2hk で「台灣」になりました。フォントも Noto Sans TC と Noto Sans HK で一部の字の形が違います。

Q. 繁体字を Excel や Word で使えますか。
UTF-8 や Unicode で保存されていれば、日本語の環境でも表示できます。表示には繁体字の字を持つフォントが必要です。CSV を CP932(Shift_JIS)で保存すると、「爱」「电」のような簡体字や、CP932 に無い繁体字は保存できません。

Q. Google 翻訳などで「中国語(繁体)」を選ぶのと、OpenCC で変換するのは同じですか。
違います。翻訳は意味から文を作り直し、OpenCC は辞書で字と語を置き換えます。簡体字の文を繁体字の文にするだけなら OpenCC のほうが原文に忠実で、言い回しまで台湾向けにしたいときは s2twp か翻訳を使い、どちらの場合も人が確かめます。

Q. 繁体字の中国語ページの lang は zh-TW と zh-Hant のどちらですか。
W3C は、用字を区別したいなら zh-Hant を勧めています。地域も示したいなら zh-Hant-TW・zh-Hant-HK のように両方を書けます。どちらでもフォントは繁体字の形になりましたが、CSS の :lang(zh-Hant) は zh-TW に一致しないので、サイト内で書き方をそろえます。

Q. 繁体字かどうかをプログラムで判定できますか。
OpenCC で t2s と s2t をかけて変わるかどうかを見る方法があります。ただし、日本語の文は「語」「説」のような字で繁体字と判定されることがあるので、ひらがな・カタカナを含むかを先に調べます。

Q. 繁体字は簡体字より容量が大きいですか。
UTF-8 ではどちらも1字3バイト(この記事で扱った字の場合)で、容量は変わりません。画数が多くても、データの大きさは同じです。違いが出るのは Web フォントの大きさで、Noto Sans TC と SC はどちらも合計 4MB 強でした。

Q. 「臺」と「台」はどちらが正しいですか。
どちらも繁体字の文で使われる字で、文脈や表記の決まりによって選ばれます。OpenCC の s2t は「臺灣」、s2hk は「台灣」を出しました。公開する文では、読む人の地域の表記の決まりに合わせます。

まとめ

  • 繁体字は、簡略化する前の伝統的な字形の漢字で、台湾・香港・マカオなどで使われる。簡体字との違いは言語ではなく書き方の違い。
  • 形が違う字は Unicode でも別の文字(愛 U+611B・爱 U+7231)。形の差が小さい字(骨・直など)は同じ符号位置で、地域の形はフォントが描き分ける。
  • 変換は OpenCC。s2t・s2tw・s2hk は字形、s2twp は台湾の言い回しまで変える。1対多の字(发・后・干)と、往復で戻らない異体字に注意し、最後は人が確かめる。
  • lang 属性はフォントの字形を切り替える。Noto Sans CJK では zh-Hant・zh-TW で繁体字、zh・zh-Hans で簡体字の形になった。:lang(zh-Hant) は zh-TW に一致しない。
  • 検索は、検索用に字形をそろえた列を持たせる。表示用の原文は残し、日本語の文の中国語化は変換ではなく翻訳で行う。

参考・出典

確認日はいずれも 2026年10月29日です。

  • Unicode「FAQ - Chinese and Japanese」:https://www.unicode.org/faq/han_cjk.html
  • W3C「Language tags in HTML and XML」:https://www.w3.org/International/articles/language-tags/
  • W3C「Choosing a Language Tag」:https://www.w3.org/International/questions/qa-choosing-language-tags
  • Google 検索セントラル「Localized Versions of your Pages」:https://developers.google.com/search/docs/specialty/international/localized-versions
  • MDN「lang グローバル属性」:https://developer.mozilla.org/ja/docs/Web/HTML/Reference/Global_attributes/lang
  • BYVoid/OpenCC(README・設定ファイルの一覧・ライセンス):https://github.com/BYVoid/OpenCC
  • notofonts/noto-cjk(Noto Sans CJK の配布形式):https://github.com/notofonts/noto-cjk
  • Fontsource「@fontsource-variable/noto-sans-tc」「@fontsource-variable/noto-sans-sc」5.3.1(npm パッケージの index.css とフォントファイル)
  • Microsoft サポート「Microsoft 繁体字中国語 IME」:https://support.microsoft.com/ja-JP/Windows/Hardware/Input-Devices/microsoft-traditional-chinese-ime
  • Apple サポート「Chinese and Cantonese Input Method User Guide for Mac」:https://support.apple.com/ja-jp/guide/chinese-input-method/welcome/mac
  • Apple サポート「Set up a Chinese or Cantonese input source on Mac」:https://support.apple.com/ja-jp/guide/chinese-input-method/cim6023ab944/mac
  • Python ドキュメント「unicodedata」「codecs(標準エンコーディング)」:https://docs.python.org/ja/3/library/codecs.html

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「繁体字とは?簡体字との違いをUnicode・変換・フォントで実測」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ
参加受付中

AI駆動開発、 無料セミナー