<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Posts on Nerufic</title>
    <link>https://nerufic.com/ja/posts/</link>
    <description>Recent content in Posts on Nerufic</description>
    <generator>Hugo -- 0.147.0</generator>
    <language>ja</language>
    <lastBuildDate>Thu, 15 May 2025 11:17:23 +0900</lastBuildDate>
    <atom:link href="https://nerufic.com/ja/posts/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>リナックスでIMEが作動する方法</title>
      <link>https://nerufic.com/ja/posts/how-input-methods-work-in-linux/</link>
      <pubDate>Thu, 15 May 2025 11:17:23 +0900</pubDate>
      <guid>https://nerufic.com/ja/posts/how-input-methods-work-in-linux/</guid>
      <description>&lt;p&gt;日本語、韓国語、中国語のように文字数が多いまたは文字の組み合わせが必要な言語をリナックス&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;で入力するためには、特殊な&lt;strong&gt;IME&lt;/strong&gt;が必要です。WindowsやmacOSではこのようなIMEがオペレーティングシステムに基本的に統合されているため、ユーザーが別途気にする必要はありません。一方、リナックスでは使用するディストリビューションによってIMEを別途インストールして設定する必要がある場合が多いです。&lt;/p&gt;
&lt;p&gt;リナックス環境で非西欧圏の言語を入力する際、IMEに関連する問題が発生することがしばしばあります。開発者がこのような問題を効果的に解決するためには、リナックスのIMEシステムについての理解が必要です。&lt;/p&gt;
&lt;p&gt;この記事では、リナックスのIMEシステムを構成する様々な要素の役割および相互作用の方式、動作過程を詳しく見ていきます。&lt;/p&gt;
&lt;h2 id=&#34;1-imeとinput-method-framework&#34;&gt;1. IMEとInput Method Framework&lt;/h2&gt;
&lt;p&gt;通常、IMEは&lt;strong&gt;Input Method Framework&lt;/strong&gt;上で動作します。
Input Method Frameworkは様々なIMEを管理し統合する上位ソフトウェアで、代表的な例として&lt;a href=&#34;https://github.com/ibus/ibus&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;IBus&lt;/a&gt;と&lt;a href=&#34;https://fcitx-im.org/wiki/Fcitx_5&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Fcitx&lt;/a&gt;があります。&lt;/p&gt;
&lt;p&gt;IME自体は一般的にInput Method Frameworkとは別にインストールする必要があります。
例えば、Fcitxベースの韓国語IMEは&lt;code&gt;fcitx5-hangul&lt;/code&gt;、IBusベースの日本語IMEは&lt;code&gt;ibus-mozc&lt;/code&gt;などのパッケージをインストールする必要があります。&lt;/p&gt;
&lt;p&gt;Input Method Frameworkはユーザーの設定に従って、アプリケーションのキー入力をアクティブなIMEが処理するよう仲介する役割を果たします。
この記事では便宜上、Input Method Frameworkを区別せずに&lt;strong&gt;IME&lt;/strong&gt;と呼ぶことにします。&lt;/p&gt;
&lt;figure&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://nerufic.com/images/input_method_framework_and_input_method_ja.png&#34;
         alt=&#34;Input Method FrameworkとIME&#34;/&gt; &lt;figcaption&gt;
            &lt;p&gt;IMEとInput Method Framework&lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&#34;2-通信プロトコルおよびアプリケーション&#34;&gt;2. 通信プロトコルおよびアプリケーション&lt;/h2&gt;
&lt;p&gt;IMEは基本的にクライアント-サーバー構造で設計されています。
アプリケーションはIMEデーモンと様々なIPC（プロセス間通信）方式を通じて通信し、入力を処理することができます。
この過程で使用されるプロトコルは二種類に分けることができます。一つはIMEと独立して動作する標準プロトコルであり、もう一つはIME開発者が独自に開発した固有のプロトコルです。
アプリケーションはこれらの通信方式の中から一つを選択して動作します。&lt;/p&gt;
&lt;h3 id=&#34;標準プロトコル&#34;&gt;標準プロトコル&lt;/h3&gt;
&lt;p&gt;クライアントとIME間の通信に使用される標準プロトコルは次の通りです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.x.org/releases/X11R7.6/doc/libX11/specs/XIM/xim.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;XIM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Wayland
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://wayland.app/protocols/input-method-unstable-v1&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;input-method-unstable-v1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://wayland.app/protocols/input-method-unstable-v2&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;input-method-unstable-v2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://wayland.app/protocols/text-input-unstable-v3&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;text-input-unstable-v3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;x-input-method-xim&#34;&gt;X Input Method (XIM)&lt;/h4&gt;
&lt;p&gt;XIMは1990年代にX Consortiumが制定したプロトコルで、X11サーバーを通じてIMEとクライアントが通信する方法を定義したものです。
作られてから30年以上経った古いプロトコルのため、最近ではあまり使用されていませんが、互換性のためにほとんどのIMEがサポートしています。
X11ベースですが、Wayland環境でもX11との互換性レイヤーであるXWaylandを使用する場合、XIMプロトコルを使用することができます。&lt;/p&gt;
&lt;p&gt;IMEをインストールする際によく設定する次の環境変数は、XIMプロトコルで使用するIMEを指定します。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;export XMODIFIERS&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;@im&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;ibus
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;wayland&#34;&gt;Wayland&lt;/h4&gt;
&lt;p&gt;X11を代替するために設計されたディスプレイプロトコルであるWaylandもIMEのためのプロトコルを含んでいます。
WaylandのIMEプロトコルは2回も変更され、最新バージョンであるtext-input-unstable-v3もまだunstableが付いている状態です。
しかし、現時点でtext-input-unstable-v3は事実上Waylandの入力プロトコル標準に近い形で使用されています。
特徴的な点として、XIMがただX11サーバーを通じてアプリケーションとIMEが通信する方式であるのに対し、text-input-unstable-v3は間にWaylandコンポジターが直接関与する構造となっています。&lt;/p&gt;
&lt;h3 id=&#34;独自のプロトコル&#34;&gt;独自のプロトコル&lt;/h3&gt;
&lt;p&gt;IBus、Fcitx、UimなどほとんどのIMEは標準プロトコル以外にも独自の通信プロトコルを実装しています。
IBusとFcitxの独自プロトコルは&lt;a href=&#34;https://www.freedesktop.org/wiki/Software/dbus/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;D-Bus&lt;/a&gt;というリナックスのIPCシステム上で通信し、Uimは直接ソケットを使用します。
これらの独自プロトコルおよびクライアントは主に後述するIMモジュールのために使用されます。&lt;/p&gt;
&lt;p&gt;それでは標準プロトコルが存在するにもかかわらず、なぜ独自プロトコルが作られたのか疑問が生じます。
これについて推測すると、おそらく次のような過程があったと考えられます。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;1990年代に開発されたXIMは基本的な入力機能のみをサポートし、現代的な入力方式（周辺テキスト参照など）をサポートしていなかった&lt;/li&gt;
&lt;li&gt;各IME開発チーム（IBus、Fcitx、Uimなど）はXIMの限界を克服するために独自のプロトコルを開発した&lt;/li&gt;
&lt;li&gt;その後Waylandが登場し、入力プロトコルが3つも作成された&lt;/li&gt;
&lt;li&gt;結果的に複数のプロトコルが乱立することになり、アプリケーション開発者は様々なプロトコルをサポートする負担が生じた&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;imeを使用するアプリケーション開発&#34;&gt;IMEを使用するアプリケーション開発&lt;/h3&gt;
&lt;p&gt;アプリケーション開発者がIMEに関連する考慮をする必要があるケースは多くありません。
多くの場合、GTKやQtのようなウィジェットツールキットがIMEとの連携をバックグラウンドで自動的に処理するためです。
そのため、ウィジェットツールキットで&lt;code&gt;GtkEntry&lt;/code&gt;や&lt;code&gt;QLineEdit&lt;/code&gt;のような入力フィールドを使用する際、開発者はIMEに関連する詳細に気を配る必要はありません。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
