はじめに
データ変換ツールDTR 1 を用いて、Unicodeの多バイト文字(絵文字)をシフトJISに存在する文字へ置き換えてみました。文字コード変換は単なるバイト列の変換ではなく、変換元と変換先の文字集合の差異を理解し、必要に応じて変換ルールを拡張する設計力が問われる領域です。
絵文字とは
絵文字(Emoji)は文字コードで表現された小さな絵です。文章だけでは伝えにくい感情やニュアンスを、一瞬で伝えるための視覚的な記号です。絵文字はアイコンのような画像に見えますが、送受信されているものはあくまで文字データです。そのため 通信量は小さく、処理も軽いことが強みです。
OSやプラットフォームごとに絵文字のデザインは異なりますが、それはフォントが違えば同じ文字でも見た目が変わるのと同じ仕組みです。背後で使われているコードポイントが同じである限り、意味は共通です。
絵文字の歴史は日本の携帯電話から始まりました。当時は各キャリアが外字領域に独自定義していたため、相互運用性は高くありませんでした。そこで2010年、Unicode 6.0で正式に採用され、世界標準になりました。絵文字という日本文化が、そのままEmojiとしてグローバル仕様になりました。
日本発祥らしく、日本地図や富士山といった日本固有のものが今も絵文字として残っています。最近では肌の色のバリエーションやジェンダー表現など、国際化を反映した拡張も進んでいます。今や絵文字は、世界中のユーザーが同じコードポイントを共有してコミュニケーションできる文化の橋になりました。
やりたいこと
エフティーアドニャンは、ファイル転送の安全と成功をそっと見守る「ファイルの妖精」をイメージした架空のキャラクターです。拙記事のアイキャッチ画像 2 や拙アカウントのアイコン画像で活躍しています。少しおちゃめな性格のエフティーアドニャンは、絵文字が大好きです。日々の食事も以下のように絵文字で記録しています。
20260301朝食🍚
20260301昼食🍜
20260301夕食🍣
このファイルはUTF-8で保管されています。
最初の8文字はYYYYMMDD形式の日付です。
次の2文字は食事のタイミングです。朝食、昼食、夕食の何れかが入ります。
最後の1文字は食事内容の絵文字が入ります。
このファイルをシフトJISに変換します。
検証環境
以下の環境で検証しました。
- OS:Windows 11 Enterprise
- ソフトウェア:DTRII 5R21U
DTRIIはDTRのWindows版の商品名です。
シフトJIS変換
まずDTRで単純に変換してみます。以下のコマンドを実行します。
C:\dtr\dtrnt '{ c8 k4,k6 k2,k4 }' -PQ 3 ftadnyan-food-utf8.txt -A -S ftadnyan-food-sjis.txt
「C:\dtr」はDTRのデフォルトの導入ディレクトリです。デフォルトとは異なる場所に導入された場合は、その環境に合わせて下さい。
「c8 k4,k6 k2,k4」が変換パラメータです。最初の8文字は日付を表す半角英数です。UTF-8もシフトJISも半角英数はASCIIと同じく1バイトです。よってc型8バイトです。
次の2文字は朝食または昼食、夕食の漢字2文字です。UTF-8は3バイトのため、合計6バイトです。シフトJISは2バイトのため、合計4バイトです。よって「k4,k6」となります。
次の1文字は絵文字です。UTF-8では4バイトです。これをシフトJIS 1文字に置き換えるため、「k2,k4」です。
変換パラメータに続いて入力指示と出力指示です。共に文字コード・漢字コードのオプションの後に入出力のファイルを指定します。オプションの意味は以下の表の通りです。
| オプション | 意味 |
|---|---|
| -PQ 3 | UTF-8 |
| -A | ASCII |
| -S | シフトJIS |
出力指示でASCIIとシフトJISを共に指定していることを奇妙に思われるかもしれません。DTRでは半角文字の文字コードと全角文字の漢字コードを区別するため、各々指定します。
このDTRコマンドを実行すると、以下のファイルがシフトJISで出力されます。
20260301朝食
20260301昼食
20260301夕食
入力ファイルの絵文字部分は空白で出力されます。シフトJISには存在しないためです。
漢字変換テーブル変更ファイル
それではDTRの外字変換機能を利用して絵文字を変換してみます。
DTRの外字変換機能を利用するためには、先ず漢字変換テーブル変更ファイルを作成します。
ファイル名は任意です。DTRコマンドのオプションでパスを指定します。
フォーマットは以下です。
入力コード.出力コード: #コメント
入力コード.出力コード: #コメント
変換したい文字の文字コードを16進値で指定します。
Unicodeの場合はUTF-16BEの文字コードを指定します。サロゲートペアや異体字に対応してUnicodeでは最大8バイト(16桁)指定できます。
今回は絵文字をシフトJISの漢字に変換する内容にします。
D83CDF5A.95C4: # [絵文字 to 米]
D83CDF5C.96CB: # [絵文字 to 麺]
D83CDF63.E9BD: # [絵文字 to 鮨]
UTF-16は「2バイトで1文字」を原則としたエンコーディング方式ですが、世界の全ての文字を収めようとすると2バイト(約6万5千字)では不足すると判明しました。漢字だけでも2バイトでは不足します。古くはメソポタミア文明で使用された楔形文字などの歴史的文字があります。新しくは日本の携帯文化が生み出した絵文字があります。
これらの文字を扱うためにサロゲートペアが登場しました。High Surrogate(前半の2バイト)とLow Surrogate(後半の2バイト)を組み合わせ、合計4バイトで1つのコードポイントを表現する仕組みです。UTF-16の「2バイト前提」という設計を守りながら拡張性を確保しました。絵文字もサロゲートペアです。上の例ではD83CがHigh Surrogateになります。
この画像はD83CとDF63のサロゲートペアが寿司の絵文字になるイメージ図です。自作キャラクター「エフティーアドニャン」を元に生成AIで作成しました。
UTF-16に対してUTF-8は最初から可変長エンコーディングとして設計されており、1バイトから4バイトまで柔軟にコードポイントを表現できます。このため、サロゲートペアという概念そのものが不要です。
DTRコマンドに漢字変換テーブル変更ファイルを指定して実行します。
C:\dtr\dtrnt '{ c8 k4,k6 k2,k4 }' -PQ 3 ftadnyan-food-utf8.txt -A -S ftadnyan-food-output.txt -K ktab.txt
Kオプションで漢字変換テーブル変更ファイルを指定します。
このDTRコマンドを実行すると、以下のファイルがシフトJISで出力されます。
20260301朝食米
20260301昼食麺
20260301夕食鮨
絵文字が漢字に置き換わりました。
まとめ
今回はUTF-8で保存された絵文字をそのまま出力できない環境に対して、DTRを用いることで絵文字の意味に即した漢字へ置き換える手法を示しました。DTRの漢字変換テーブル変更ファイルはサロゲートペアを含むUnicodeコードを明示的に指定してマッピングできるため、移行時の情報欠落を抑制できます。
We Are Hiring!
-
DTRは、BIPROGYが提供する高機能データ変換ツールです。DTRを使用することで、文字コードやファイル形式、レイアウトの違いに悩まされること無く、簡単にデータ変換することができます。また、データ変換の結果を使用して、高度なシステム連携を実施することができます。詳細は、以下をご覧ください。
https://www.biprogy.com/solution/service/dtr.html ↩ -
例えば「DTRとデータ変換の歴史」
https://qiita.com/rhaya/items/6ac6496a0178c99fcc94 ↩