<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[6]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>をある<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>から他の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">変換</anchor>することを、
一般には<dfn>文字コード変換</dfn>といいます。</p><section><h1>呼称</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="16" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[16]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>を変更する操作 (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">演算</anchor>) は一般に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">変換</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">convert</anchor>,
conversion のような語で表すことが多いようです。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="17" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[17]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">関数名</anchor>等としては from や to と<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の名称をつなげるなどして組み立てることが多く、
変換操作の動詞を含まないこともしばしばあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="322" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[322]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Python</anchor> では変換器を <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">codec</anchor> と呼んでいます。この言葉は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">媒体</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号化</anchor>の分野で符号化方式やその実装に言及するときに使いますが、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字符号化</anchor>の分野ではほぼ使わず、おそらく <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Python</anchor> 界隈だけの独特の風習です。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="324" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[324]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コードの変換</anchor>とよく似た、ときに混同され、ときに併用・連結される処理に
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">escape</anchor> / <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">unescape</anchor>
があります。</p><section><h1>符号化と復号</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="13" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[13]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>データ型の値に変換することを<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">復号</anchor>、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>データ型の値から<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>に変換することを<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号化</anchor>といいます。</p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">
<anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="14" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[14]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>に限らず、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プログラミング言語</anchor>等の処理用の内部データと保存用の外部データの変換を一般に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号化</anchor>、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">復号</anchor>のようにいいます。</comment-p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">
<anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="323" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[323]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号化</anchor> (encoding) は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>への変換の操作の意味 (動詞) でも、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字符号化</anchor>の方式や技術の意味 (名詞) でも、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>規格への<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>の追加の意味 (動詞) でも使います。
文脈によるので注意が必要です。</comment-p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="15" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[15]</anchor-end> 
現代の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プログラミング言語</anchor>等では内部データを <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode文字列</anchor>とすることが多いので、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> への変換を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">復号</anchor>、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> からの変換を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号化</anchor>のように言っているかのような使われ方をされがちですが、
厳密な語法ではありません。</p></section><section><h1>転符号化</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="4" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[4]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>をある<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>から他の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">変換</anchor>することを、
<dfn><rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">転符号化<rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">transcode</rt></rubyb></dfn>といいます。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">転符号化</anchor>する<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ソフトウェア部品</anchor>を、
<dfn><rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">転符号化器<rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">transcoder</rt></rubyb></dfn>といいます。<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;1</anchor-internal></src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="5" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[5]</anchor-end> あまりメジャーな語ではありません。</p><figure class="quote"><figcaption><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1]</anchor-end> 
<cite xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RFC 3536</anchor> - Terminology Used in Internationalization in the IETF</cite> (<time>2011-01-29 02:14:52 +09:00</time> 版) <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://tools.ietf.org/html/rfc3536#page-6">http://tools.ietf.org/html/rfc3536#page-6</anchor-external></figcaption><blockquote><p>Transcoding is the process of converting text data from one
character encoding form to another.  Transcoders work only at the
level of character encoding and do not parse the text.  Note:
Transcoding may involve one-to-one, many-to-one, one-to-many or
many-to-many mappings.  Because some legacy mappings are glyphic,
they may not only be many-to-many, but also discontinuous: thus
XYZ may map to yxz.  &lt;CHARMOD&gt;</p><p>In this definition, &quot;many-to-one&quot; means a sequence of characters
mapped to a single character.  The &quot;many&quot; does not mean
alternative characters that map to the single character.</p></blockquote></figure><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="2" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[2]</anchor-end> <cite xml:lang="en">RFC 6365 - Terminology Used in Internationalization in the IETF</cite>
(<time>2011-09-10 19:11:51 +09:00</time> 版)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://tools.ietf.org/html/rfc6365#page-7">http://tools.ietf.org/html/rfc6365#page-7</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="3" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[3]</anchor-end> <cite xml:lang="en">Character Model for the World Wide Web 1.0: Fundamentals</cite>
( (<time>2005-02-15 14:24:00 +09:00</time> 版))
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://www.w3.org/TR/charmod/#sec-Transcoding">http://www.w3.org/TR/charmod/#sec-Transcoding</anchor-external></p></section></section><section><h1>変換の意味</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="173" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[173]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コードの変換</anchor>の操作は、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">意味</anchor>に影響を与えることがあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="174" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[174]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTF-8</anchor> と <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTF-16</anchor> の変換のように同じ<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>の定義を共有する<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>体系同士の変換であれば、
技術的な表現方法の機械的な変換にとどまりますから、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">意味</anchor>には影響が及びません。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="175" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[175]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTF-8</anchor> と <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">EUC-JP</anchor> の変換のように異なる<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号化文字</anchor>を扱う<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>体系同士の変換だと、
変換によって<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">意味</anchor>に影響が出てしまうことがあります。
例えば <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTF-8</anchor> (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor>) の<sw-ch xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">鴎</sw-ch>と
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">EUC-JP</anchor> (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">JIS X 0208</anchor>) の<sw-ch xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">鴎</sw-ch>は、
厳密には<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">意味</anchor>が異なります。変換はこの微妙な意味の違いを無視する操作となります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="176" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[176]</anchor-end> 
変換の一方の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>にのみある<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>が含まれる場合など、
「微妙な意味の違い」を超えた無視できない違いを生じる場合もあります。
詳しくは本記事の各項を参照。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="177" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[177]</anchor-end> 
<anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="175" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;175</anchor-internal> <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="176" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;176</anchor-internal> の要素を含む<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コードの変換</anchor>は、破壊的な操作です。
無闇矢鱈と行うべきではありません。</p><section><h1>異なる文字への変換</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="301" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[301]</anchor-end> 
様々な<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">歴史的事情</anchor>によって、意図的に別の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>への<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">変換</anchor>がなされることがあります。</p><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="302" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[302]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">DOSコードページ</anchor>等で <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CL</anchor>に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">図形文字</anchor>が割り当てられていることがありますが、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> で<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号位置</anchor>が一致する<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">C0制御文字</anchor>に一律で変換されることが多いです。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="303" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[303]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CL</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">GL</anchor> ([ <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x00</n>, <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x7F</n> ]) は機械的に <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> の
[ <sw-cc xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">U+0000</sw-cc>, <sw-cc xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">U+007F</sw-cc> ] に対応付ける実装があります。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="304" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[304]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">シフトJIS</anchor>の <sw-cc xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x5C</sw-cc> は <sw-cn xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">YEN SIGN</sw-cn> ですが、
無視して <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> の <sw-cc xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">U+005C</sw-cc> に対応付ける実装が大多数です。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">日本</anchor>市場では
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> の <sw-cc xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">U+005C</sw-cc> が <sw-cn xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">YEN SIGN</sw-cn>
の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">字形</anchor>で表示される<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">フォント</anchor>が多く流通しています。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="305" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[305]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">EUDC</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PUA</anchor> や<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">空き領域</anchor>などの対応関係を意図的に無視して削除する実装があります。</li></ul></section></section><section><h1>変換のインターフェイス</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="19" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[19]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コードの変換</anchor>の操作は次のような形態のいずれかで実装されていることが多いようです。</p><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="18" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[18]</anchor-end> 
ある<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>から他の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>への変換操作</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="22" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[22]</anchor-end> 
ある<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>から内部処理用の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>データ型の値への変換操作</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="23" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[23]</anchor-end> 
内部処理用の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>データ型の値からある<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>への変換操作</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="28" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[28]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>から <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode文字列</anchor>に変換された状態のある<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>からある<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>への変換操作</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="24" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[24]</anchor-end> 
ある<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文書形式</anchor>のある<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文書</anchor>からある<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文書形式</anchor>のある<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文書</anchor>への変換操作<ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="25" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[25]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTML</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RTF</anchor>, <cite>Microsoft Word</cite> など</li></ul></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[26]</anchor-end> 
ある<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">データ構造</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">オブジェクト</anchor>におけるある<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>からある<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>への変換操作<ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="27" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[27]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTML</anchor> (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">DOM</anchor>), <cite>Microsoft Word</cite> (選択範囲), <cite>LibreOffice</cite> 
(選択範囲) など</li></ul></li></ul><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="29" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[29]</anchor-end> 
<anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="18" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;18</anchor-internal> <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="22" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;22</anchor-internal> <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="23" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;23</anchor-internal> は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プラットフォーム</anchor>の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">API</anchor> として提供されていることもあれば、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">アプリケーション</anchor>等が独自に実装する場合も多いです。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="32" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[32]</anchor-end> 
<anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="18" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;18</anchor-internal> <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="24" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;24</anchor-internal> は独立した<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プログラム</anchor>となっている場合が多いです。
<anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="18" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;18</anchor-internal> はこの場合<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">テキストファイル</anchor>の変換操作と言えます。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="33" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[33]</anchor-end> 
<anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="28" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;28</anchor-internal> は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Webページ</anchor>で <code>textarea</code> 
等を使った変換ツールとして提供されているものです。
それと同等の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ライブラリー</anchor>として提供されている場合もあります。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">8ビット符号</anchor>の変換器を称していても、
実態は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">8ビット符号</anchor>から変換された <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode文字列</anchor>同士の変換になっています。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="34" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[34]</anchor-end> 
<anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="24" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;24</anchor-internal> <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal> は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Webブラウザー</anchor>や<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ワープロ</anchor>等のソフトウェアの内部で動作する<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ブラウザー拡張</anchor>や<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">マクロ</anchor>のような形になっているものです。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>だけでなく<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">フォント名</anchor>が変換に関与します。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="41" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[41]</anchor-end> 
入出力の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>は、多数に対応しているものもあれば、
特定のものに限られている実装も多いです。
ただし、
多数に対応しているものでも、古今東西の膨大な数の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>技術の中の限られた一部のものにしか対応できていません。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="43" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[43]</anchor-end> 
多くの実装は対象となる地域や言語に関係する<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>群にしか対応していません。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">20世紀</anchor>には当該システムで採用している<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>を中心に、
それとその他の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>との変換という形態が多く見られました。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">21世紀</anchor>になると <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> を中心に、
それとその他の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>との変換という形態が一般化しました。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="42" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[42]</anchor-end> 
実変換処理の定義を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">宣言的</anchor>な外部ファイルに分離するなど拡張可能な設計になっているものもありますが、
そうでない固定のものもかなり多いです。
拡張可能なものであっても、外部ファイルの記述力には限界があり、
複雑な変換は実装できません。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="46" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[46]</anchor-end> 
狭義の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の変換の他に、</p><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="231" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[231]</anchor-end> 入出力として <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">escape</anchor> や<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">翻字</anchor>・<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">転写</anchor>の手法などを選択できたり、</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="230" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[230]</anchor-end> 出力として<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>を表す<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">画像</anchor>を選択できたり、</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="228" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[228]</anchor-end> それらの混在に対応していたり、</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="226" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[226]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">改行文字</anchor>の変更や<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode正規化</anchor>などの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>に関連する他の処理の適用があったり、</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="227" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[227]</anchor-end> 入出力として<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">内容転送符号化</anchor>や<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号化語</anchor>を選択できたり、</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="229" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[229]</anchor-end> 破損したデータの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">発見的</anchor>手法による<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">修復<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">文字コードの修復</title></anchor>に対応していたり、</li></ul><p>... するものもあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="137" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[137]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>体系によっては、同じ<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>の表現方法に揺れ、曖昧性、その他本記事の各項に挙げるような選択肢が存在することがあり、
それらを動作オプションとして指定できるものもあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="45" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[45]</anchor-end> 
変換不能な場合にエラーとするか、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">escape</anchor> 等に置き換えるか、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">代替文字</anchor>に置き換えるか、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">置換文字</anchor>に置き換えるかなどを動作オプションとして指定できるものも多いです。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="44" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[44]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">GUI</anchor> や<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ワープロ</anchor>ソフトウェアの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">マクロ</anchor>のような形態のものは、
動作オプションやエラーの処理などを通知したり、確認したり、選択させたりしているものもあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="48" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[48]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTML</anchor> や <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RTF</anchor> や<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ワープロ</anchor>ソフトウェアの独自形式のファイルなど、
単純<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>や<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">テキストファイル</anchor>としての変換処理ができず、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ファイル形式</anchor>と<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">フォント名</anchor>に応じた処理が必要となる場合があります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="178" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[178]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">JavaScript</anchor> によって <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">DOM</anchor> 上に挿入された<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>のように、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTML</anchor> ファイルの静的な変換ではなく 
<anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;26</anchor-internal>
方式で実装された変換器が必須となる場合があります。</p><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="271" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[271]</anchor-end> 
実務上は、処理を途中で停止したり、中断・再開したり、
ネットワークから追加のデータが到着するごとに続きを処理させる形態にしたり、
といった仕組みが必要になることがあります。
(<anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="269" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;269</anchor-internal> も参照。)
こうした措置を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プログラミング言語</anchor>の組み込みの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">データ型</anchor>や制御機構で自然に実現できる場合もあれば、
独自の設計が必要となる場合もあります。</p><example xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><p xmlns="http://www.w3.org/1999/xhtml"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="275" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[275]</anchor-end> 
入力が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">1バイト符号</anchor>だけなら<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>を分割して読み取って変換器の入力としても、
出力を単純につなぎ合わせるだけで済みます。</p><p xmlns="http://www.w3.org/1999/xhtml"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="276" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[276]</anchor-end> 
入力に複数バイトの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号</anchor>が含まれたり、状態を持つ<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>体系だったりすると、
分割して変換した出力の連結は全体の変換結果と一致しないことが多くなります。</p></example><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="273" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[273]</anchor-end> 
入力が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">空文字列</anchor>や数バイトの短い<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>であることもあれば、
数GBの長大な<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>であることもあります。
こうした普通でない入力に対する設計や動作検証はなおざりにされがちなようで、
不具合を抱えている実装の事例も散見されます。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">セキュリティー</anchor>の問題となることもありますから、
注意が必要です。</p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="274" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[274]</anchor-end> 
利用形態によっては、例えば短い文字列と決まっているから長大なバイト列で性能が低下しても許容できる、
とか一定以上のバイト数なら処理を拒絶する、といった実装戦略もあります。
しかしそうした場合であっても、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">セキュリティー</anchor>は常に注視が必要です。</comment-p><section><h1>変換の入出力のデータ型と文字コード</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="138" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[138]</anchor-end> 
現代の多くの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プログラミング言語</anchor>には<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>と<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>の区別があります。
また、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTML</anchor> や <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RTF</anchor> やその他の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文書形式</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">データ構造</anchor>は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>を構成要素としていることが多いです。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="139" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[139]</anchor-end> 
組合せ上、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コードの変換</anchor>の処理の入出力は</p><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="140" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[140]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>から<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>へ</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="141" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[141]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>から<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>へ</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="142" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[142]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>から<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>へ</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="144" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[144]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>から<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>へ</li></ul><p>... の4通りがあり得ます。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="181" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[181]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">言語情報</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">bidi</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">フォント</anchor>, 装飾, その他の付加情報の付随する構造を考慮すると、
組合せは更に増えます。</p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="182" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[182]</anchor-end> 
なお、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RTF</anchor> で<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">フォント依存符号化</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">フォント</anchor>が指定された<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>のように、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>データ型の仕様上の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>とその実際の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>は一致しないことがあります。</comment-p><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="183" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[183]</anchor-end> 
古典的な<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コードの変換</anchor>の実装や、単独の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>対の実装は、
単純に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>から<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>への変換としていることが多いです。
複数の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>対に対応するときは、
単体の変換の実装を増やしていくことになります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="184" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[184]</anchor-end> 
多数の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コードの変換</anchor>に対応する実装は、
特定の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>を「中心」に、それと各種<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の変換を実装する形態としていることが多いです。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="185" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[185]</anchor-end> 
現代の実装は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プログラミング言語</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列型</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>を「中心」
とすることが多いです。現代の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プログラミング言語</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列型</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>は、
ほとんどの場合 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode文字列</anchor>です。従って <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> からの変換、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> への変換ということになります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="186" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[186]</anchor-end> 
古くからの実装は、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> ではない<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">内部符号</anchor>を使っていることがあります。
新しい実装であっても多くの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>に対応する実装は独自の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">内部符号</anchor>を採用していることがあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="193" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[193]</anchor-end> 
完全独自の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">内部符号</anchor>ではなく、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PUA</anchor> を使ったり、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>に付随する<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>とは別の情報を組合せたりすることもあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="159" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[159]</anchor-end> 
実装の都合 
(例えば多数の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>体系の相互変換のための中間符号としての利用)
のために、
入出力の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>と無関係の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>を利用する場合があります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="160" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[160]</anchor-end> 
中間符号は、入出力として現れにくいものが選ばれますが、
設計者の判断と利用者の用途が一致するとは限らず、
意図しない結果になる場合もあります。</p><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="161" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[161]</anchor-end> <cite>Padma</cite> の内部符号 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Padma</anchor> は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PUA</anchor> を使っています。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="162" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[162]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ビルマ文字の文字コード</anchor>の変換器の系譜の1つでは
<sw-cc xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">U+3000</sw-cc> からの領域や <sw-cc xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">U+0FFF</sw-cc> が使われています。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="163" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[163]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode符号位置</anchor>ではない <sw-cc xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">U-00110000</sw-cc> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">以上</anchor>の領域が使われる場合があります。
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>Unicodeの符号空間</anchor> </sw-see></li></ul><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="164" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[164]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ワープロ</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">マクロ</anchor>としての変換器の実装は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号位置</anchor>と<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">フォント</anchor>の組を変換の入出力に使うことがあります。
同じ<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号位置</anchor>でも<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">フォント名</anchor>が違えば別の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>扱いになり、
変換対象にしたりしなかったりできます。
実在しないダミーの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">フォント名</anchor>を使ったり、
実在の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">フォント名</anchor>であっても多段変換のどの段階で変換するかを調整することで、
中間符号を用いる方式と同様の効果を実現している場合があります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="187" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[187]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">内部符号</anchor>等が扱う <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> だけでない情報の例
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>文字のようなもの</anchor> </sw-see></p><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="188" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[188]</anchor-end> 
現代のほぼすべてのデータ (過去からデータ形式の変換により引き継がれたものを含みます。) 
は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">8ビットバイト</anchor>で記述されています。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="189" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[189]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">7ビット符号</anchor>は多いですが、実際の処理では<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">8ビットバイト</anchor>の列として扱うことになります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="190" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[190]</anchor-end> 
歴史的には6ビットや9ビットなど異なる単位もありますし、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>より大きな単位が実処理の最低単位となることもありますし、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プロトコル</anchor>や<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">データ形式</anchor>が8ビット以外の単位で区切っていることも多々ありますが、
現代の計算機上の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の処理の入出力となる段階では8ビット単位となっており、
変換の処理がそれ以外を想定することはまずありません。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="191" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[191]</anchor-end> 
理屈の上では16ビット符号や32ビット符号など、より大きな単位を束ねた符号体系もいくつもありますが、
それらも結局のところは<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号空間</anchor>の大きさに過ぎないのであって、
それが最低の処理単位となる<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プラットフォーム</anchor>は極めて稀です。
よって、壊れたデータが端数のバイトを持つ場合や、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ネットワーク</anchor>転送時のパケット境界が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>の途中で出現する場合などを<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コードの変換の処理</anchor>は考慮する必要があります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="192" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[192]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Base64</anchor> や <code>application/octet-stream</code>
のように端数の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ビット</anchor>を扱える (扱えてしまう) (こともある) <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">データ形式</anchor>もありますが、
それを<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コードの変換</anchor>の実装と組合せて利用できる実装はほとんどありません。</p><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="194" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[194]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">C言語</anchor>など <sw-cn xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">NULL</sw-cn> を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">終端</anchor>とする<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プラットフォーム</anchor>もありますが、
そうした<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プラットフォーム</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コードの変換</anchor>の実装であっても、
入出力の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>の途中で <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x00</n> が出現する<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>体系や、
入出力の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>が <sw-cn xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">NULL</sw-cn> を含む場合を適切に処理できる必要があります。</p><example xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><p xmlns="http://www.w3.org/1999/xhtml"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="195" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[195]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTF-16</anchor> で <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ASCII文字</anchor>を使うと <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x00</n> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>が出現します。</p></example><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="197" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[197]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コードの変換</anchor>は、「どの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>で記述されていたか」が暗示的に保持していた情報を失うことがあります。
例えば <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">GB 2312</anchor> から <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> へと変換すると、
それが<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">中文</anchor>で<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">中華人民共和国</anchor>で作られた可能性が高い、
という情報を失ってしまうことになります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="198" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[198]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">言語情報</anchor>がないと<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字のレンダリング</anchor>を適切に行えませんが、
国ごと、言語ごとに異なる<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>を使っていた時代のデータには明示的な<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">言語情報</anchor>が付与されていないことが多いです。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> に変換して<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>の表示その他の処理を行う実装は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の情報を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">言語情報</anchor>を補助するヒントとして活用するべきです。
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>文字コード等に依存した特殊な表示処理</anchor>, <anchor>フォントの選択</anchor> </sw-see></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="199" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[199]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ISO-2022-INT</anchor> や <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">junet</anchor> や <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TRONコード</anchor>のような多言語、複数地域の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>を組合せた形の多言語<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>から
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> 等に変換するときは、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>(列片)単位の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">言語</anchor>補助情報を保持した形で変換できるような配慮が必要です。</p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="200" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[200]</anchor-end> それに対応可能な<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">内部符号</anchor>を使うのが扱いやすいのでしょうが、
技術的に難しければ<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode言語タグ</anchor>を挿入して後からそれを解釈する形でもいいかもしれません。</comment-p></section><section><h1>文字コードの指定</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="232" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[232]</anchor-end> 
入出力の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の指定は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コードの識別子</anchor>を明示的に与えるものもあれば、
関数名等に組み込まれているものもあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="233" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[233]</anchor-end> 
入出力の各種の動作オプションまで含めた<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の名称・定義を提供しているものもあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="47" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[47]</anchor-end> 
入力となる<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の明示的な選択を省略し、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コードの判定</anchor>に拠るものもあります。</p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="270" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[270]</anchor-end> 
その場合、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">応用</anchor>に判定結果を通知する必要があるかもしれません
(<anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="269" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;269</anchor-internal>)。</comment-p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="234" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[234]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTML</anchor> や <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RTF</anchor> など、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文書形式</anchor>自体に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>決定の機構が組み込まれているものもあります。
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>HTMLにおける文字コード</anchor> </sw-see>
それを尊重するものもあれば、
敢えて無視するもの、
上書きして指定できるものもあります。</p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="272" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[272]</anchor-end> 
処理の途中で<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の指定を検知して、その場で入力<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>を切り替える仕組みが必要となる場合もあります
(<anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="269" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;269</anchor-internal>)。</comment-p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="235" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[235]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">フォント依存符号化</anchor>を使った <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTML</anchor> や <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RTF</anchor> のように<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の指定が多層的になる場合もあります。
通常は上層は記述された<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">フォント名</anchor>により自動的に決まりますが、
上層まで含めた全体の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード名</anchor>が指定された場合の処理、
上層の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">フォント名</anchor>が実態と合っていないため無視して上書きする動作オプションの提供など、
実装上考慮するべき特殊ケースもあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="236" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[236]</anchor-end> 
原理的に <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RTF</anchor> で使いようがない<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>など、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の指定と<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文書形式</anchor>の指定が矛盾する組合せが存在するため、
実装上は注意が必要になります。</p></section><section><h1>変換可能性の判定</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="145" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[145]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コードの変換</anchor>の操作と関係して、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コードの変換</anchor>が可能かどうかを決定するという操作が必要となる場合がたまにあります。</p><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="146" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[146]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">MIME</anchor> は <code>charset</code> について「最小公倍数」を指定することを求めていました。
例えば <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ASCII文字</anchor>のみで構成されるなら、 <code>ISO-8859-1</code> よりも <code>US-ASCII</code>
と指定するのが良いとしていました。 <sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>charset最小化</anchor> </sw-see></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="147" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[147]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">日本</anchor>市場向けの <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">MUA</anchor> の中には通常は <code>ISO-2022-JP</code>
を使い、それで表せない<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>が含まれる時 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTF-8</anchor> を使う機能を有するものがあります。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="148" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[148]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">エディター</anchor>類の中にはファイルの保存時等に出力<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>で記述できない<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>が含まれる場合に、
その旨の警告を表示したり他の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の選択を促したりする機能を有するものがあります。</li></ul><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="149" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[149]</anchor-end> 
こうした機能は実際に変換を行いながらエラーを検出する形で実装される場合もあれば、
事前に高速に判定する手法により実装される場合もあります。
どちらが好ましいかは使い方によりますが、後者の場合は実際の変換処理と乖離するリスクがあります。</p></section></section><section><h1>変換の構成要素</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="325" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[325]</anchor-end> 
変換処理の実装戦略は様々ですが、その性格はいくつかの要素に分解できます。</p><section><h1>1対1対応</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="50" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[50]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">一対一対応</anchor>が存在する場合、入力を機械的に変換して出力するだけですから、
変換器は非常に単純になります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="51" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[51]</anchor-end> 
すべての<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号</anchor>が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">一対一対応</anchor>可能な<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>体系間の変換は、
宣言的な変換表を用意して外部化することで、容易に対応体系を増やすことができます。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="49" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[49]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">平成時代</anchor>初期くらいまでに欧米企業が進出していた地域の標準的な<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>のほとんどは、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> と<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">一対一対応</anchor>が存在します。
また、同じ地域の同じ言語を対象とする他の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>とも<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">1対1対応</anchor>が存在する<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>が多いです。</p></section><section><h1>1文字対多文字対応</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="52" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[52]</anchor-end> 
ある<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>で1文字として扱えるものが、他の文字コードでは複数の文字の列になることがあります。</p><example xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><p xmlns="http://www.w3.org/1999/xhtml"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="53" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[53]</anchor-end> 
例えば地域の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>ではアクセント付きで1つの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>で表せたものが、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> では<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">基底文字</anchor>と<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">結合文字</anchor>の組合せとして表現するほかないことがあります。</p></example><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="54" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[54]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">一対一対応</anchor>限定の実装より少し面倒になりますが、容易に実装できます。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="59" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[59]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">西暦1990年代</anchor>初頭頃に欧米企業が実装していなかった<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>にある<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>は、
それが他の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode文字</anchor>の組合せで表現できると判断された場合 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor>
に追加されないことがほとんどなので、
それらから <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> への変換でこのパターンとなります。</p></section><section><h1>多文字対1文字対応 / 多文字対多文字対応</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="55" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[55]</anchor-end> 
ある<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>で複数の文字の列で表されるものが、他の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>では1文字となることがあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="56" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[56]</anchor-end> 
複数の文字のそれぞれが変換先の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>にも存在するなら、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">1対1対応</anchor>とみなして単純に変換することも可能です。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="57" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[57]</anchor-end> 
複数の文字のいずれかが変換先の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>に存在しないなら、
文字列を1文字に変換する必要が出てきます。</p><example xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><p xmlns="http://www.w3.org/1999/xhtml"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="58" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[58]</anchor-end> 例えば<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">基底文字</anchor>と<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">結合文字</anchor>の組合せが入力されたとき、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">結合文字</anchor>に相当する<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>が変換先にないなら、
組合せと同等の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>に置き換えないといけません。</p></example><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="61" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[61]</anchor-end> 
入力があってもすぐに変換先を確定できず、数文字読み続けて適切な出力文字を選ぶ必要が出てきますから、
変換処理は複雑になってきます。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="60" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[60]</anchor-end> 
1文字対多文字対応の変換の逆方向でこのパターンとなります。</p><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="62" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[62]</anchor-end> 
ある<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>で複数の文字の列で表されるものが、
他の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>では複数の文字の列で表され、
両者の構成する文字それぞれに直接的な対応関係がないことがあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="63" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[63]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">インド系文字の文字コード</anchor>などと <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> との変換のように、
なにを<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号化文字</anchor>の単位とするかの考え方に大きな違いがある場合に、
この種の変換が頻出することになります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="64" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[64]</anchor-end> 
変換処理は相当に複雑になります。</p></section><section><h1>文字の削除</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="257" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[257]</anchor-end> 
入力<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の文字(列)が完全に削除されることがあります。</p><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="258" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[258]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">インド系文字の文字コード</anchor>などで表示上の位置調整など本質的な<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>データを構成しない<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>が含まれることがあり、
これが不要な<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>への変換で削除されます。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="259" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[259]</anchor-end> 多段変換の途中で便宜上の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>が挿入されることがあり、
不要になった段階で削除されます。</li></ul></section><section><h1>変換対象部分文字列の条件</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="277" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[277]</anchor-end> 
ある<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の文字(列)から他の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の文字(列)への変換が、
入力<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の文字(列)の複雑な条件という形で記述・実装されることがあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="278" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[278]</anchor-end> 
汎用の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">正規表現</anchor>エンジンで実装されることもあれば、
独自の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">状態機械</anchor>などの形で実装されることもあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="279" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[279]</anchor-end> 
固定長ではない文字列になることもあります (<code>+</code>, <code>*</code> など)。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="280" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[280]</anchor-end> 
記述には<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字クラス</anchor>が使われることもあります。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字クラス</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">否定</anchor>が使われることもあります。
1文字だけの小さな<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字クラス</anchor>もあれば、
十数万字の大きな<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字クラス</anchor>になることもあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="281" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[281]</anchor-end> 
記述には選択 (<code>|</code>) が使われることもあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="283" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[283]</anchor-end> 
記述形式によっては<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>や<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">空文字列</anchor>も<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字クラス</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要素</anchor>とできることがあります。
実効上は選択と等価です。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="282" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[282]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字クラス</anchor>や選択は基本的には複数の置換規則に展開できます。
ただ<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字クラス</anchor>の展開は文字数が多すぎて現実的でないこともあります。</p><section><h1>変換対象部分文字列の可変部分の置換</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="286" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[286]</anchor-end> 
対象部分文字列のうちの一部分が、置換先で使われることがあります (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">capture</anchor>)。
実例をみていくと、</p><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="287" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[287]</anchor-end> 順序の入れ替えの規則の記述に使われている場合</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="288" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[288]</anchor-end> 前方一致や後方一致の条件として記述されている場合</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="289" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[289]</anchor-end> ある文字の前後で使われる文字列の組合せを置換したい場合</li></ul><p>のような用途があるようです。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="291" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[291]</anchor-end> 順序入れ替えのように、置換前と置換先とで出現順序が変わることも少なくありません。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="292" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[292]</anchor-end> 
1つの変換の条件で出現する <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">capture</anchor> の数は1個、2個程度のものが多く、
5,6個に達するものは珍しいようです。</p><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="290" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[290]</anchor-end> 
対象部分文字列が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字クラス</anchor>や選択で記述されているとき、
置換先では<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">写像</anchor>からそれに対応付けられた<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>を選ぶ形になっていることもあれば、
部分文字列だけに適用される規則群の形で記述されていることもあります。</p></section><section><h1>変換対象部分文字列の前方一致と後方一致の条件</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="98" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[98]</anchor-end> 
ある<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の文字(列)から他の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の文字(列)への変換が、
入力<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の文字(列)とその前後の文字(列)の条件という形で記述・実装されることがあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="99" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[99]</anchor-end> 
単純な多文字からの変換に置換できる場合も多いですが、
それでは変換表が巨大になりすぎてしまう (数千から無限大の規模となる) とき、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">先読み</anchor>・<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">後読み</anchor>のような手法で実装されることになります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="100" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[100]</anchor-end> 
条件部は固定長ではない文字列になることもあります (<code>+</code>, <code>*</code> など)。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="262" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[262]</anchor-end> 
条件部の記述には<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字クラス</anchor>が使われることもあります。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字クラス</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">否定</anchor>が使われることもあります。
1文字だけの小さな<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字クラス</anchor>もあれば、
十数万字の大きな<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字クラス</anchor>になることもあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="284" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[284]</anchor-end> 
条件部の記述には選択 (<code>|</code>) が使われることもあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="285" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[285]</anchor-end> 
記述形式によっては<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>や<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">空文字列</anchor>も<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字クラス</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要素</anchor>とできることがあります。
実効上は選択と等価です。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="101" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[101]</anchor-end> 
条件部は文字列先頭、文字列末尾、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">語境界</anchor>、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">空白</anchor>といった形で記述・実装されることも多いです。
こうしたものは<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">語頭形</anchor>や<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">語末形</anchor>のような文字列中の文字の位置によって変換を制御する必要がある場合に使われがちです。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="260" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[260]</anchor-end> 
条件部は一致するべき条件が記述されることもあれば、
一致しないべき条件が記述されることもあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="261" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[261]</anchor-end> 
一致する、しないの条件と先頭・末尾・境界が一致するかしないかは、
条件の記述方法や<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">正規表現</anchor>エンジン等の利用方法によって変わってくるので要注意です。</p></section><section><h1>メモ</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="102" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[102]</anchor-end> 
いずれの場合も変換処理は相当に複雑になります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="103" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[103]</anchor-end> 
意図を正確に記述できているのか疑問が残る実装も散見されます。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="104" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[104]</anchor-end> 
<anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="101" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;101</anchor-internal> のように本来同等の条件を意図していたと思われるものが実装ごとに違った形で記述されていることもよくあります。
同じような条件を移植していても、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プログラミング言語</anchor>等で挙動が微妙に異なると思われるケースもあります。</p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="263" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[263]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字クラス</anchor>の定義、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">境界</anchor>の定義、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">非決定的</anchor>な挙動などが実装手法によって変わりがちです。</comment-p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="105" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[105]</anchor-end> 
実装の正しさの評価や他の実装との比較が困難になりますから、
可能であれば避けるべきなのでしょうが、避けることが困難と思われるケースも多いです。</p></section></section><section><h1>1対多対応</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="65" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[65]</anchor-end> 
入力<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の1つの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>に相当する出力<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の文字(列)に複数の候補がある場合があります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="66" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[66]</anchor-end> 
出力の文字(列)が互いに同等なら、どれを選ぶかは実装者の任意の選択となります。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ライブラリー</anchor>の類なら<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">応用</anchor>に動作オプションとして指定させる場合もあります。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プラットフォーム</anchor>等で慣習が成立している場合もあります。
慣習とならず<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">相互運用性</anchor>の問題が起こることもあります。</p><example xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><p xmlns="http://www.w3.org/1999/xhtml"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="67" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[67]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> への変換で、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">基底文字</anchor>と<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">結合文字</anchor>の組合せを出力するか、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">合成済み文字</anchor>を出力するかの選択肢が存在することがあります。
一般的には<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">合成済み文字</anchor>が適切と考えられていますし、
1対1対応の変換にできるので実装も単純化できます。</p></example><example xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><p xmlns="http://www.w3.org/1999/xhtml"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="68" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[68]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> に似た字形の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">記号</anchor>がいくつもあり、
いずれを選択するか実装によって違いがあって<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">相互運用性</anchor>の問題となっている場合があります。</p></example><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="70" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[70]</anchor-end> 
出力の文字(列)が同等とはいえないなら、どれを選ぶかは文脈その他によって決めることになります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="71" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[71]</anchor-end> 
前後の文字列との組合せで決められるなら多文字対多文字対応のような形で変換できますが、
多くの場合は機械的に選択することが困難です。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="72" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[72]</anchor-end> 
機械的に決定できなければ、不適切な場合があることを承知の上でどれかを選ぶか、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">GUI</anchor> による選択などの手段で個々に決めるなどの方法になります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="73" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[73]</anchor-end> 
多くの場合はデータの劣化を恐れずどれか1つを選んで機械的に対応付ける方法を採っているようです。</p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="74" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[74]</anchor-end> 
そうした関係性によって旧来の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>における<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>の弁別や選定の慣習が
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> にも持ち込まれている事例が多々あると思われます。
元々旧来の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>は当該地域や言語の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>の選択の慣習を反映して開発されているでしょうから、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> がそれと異なる基準で<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>を収録していたとしても、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> の基準が現地の運用に耐えられるとは限らないわけです。</comment-p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="69" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[69]</anchor-end> 
実装ではなく <cite>Wikipedia</cite> の記事の対応表などでは、
複数の対応先の候補を併記する形を採っていることがあります。</p></section><section><h1>多対1対応</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="75" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[75]</anchor-end> 
入力<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の複数の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>に相当する出力<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の文字が1つとなる場合があります。
いくつかに分類できます。</p><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="76" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[76]</anchor-end> 
入力の各<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>が同等である、つまり<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">重複符号化</anchor>の場合</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="77" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[77]</anchor-end> 
入力の各<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>が似た意味を持ち、入力の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>では用法を細かく区別するが、
出力の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>では区別しない場合</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="78" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[78]</anchor-end> 
入力の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>で出力の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>では表現できないものが、
表現できる似た<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>に置き換えられる場合</li></ul><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="79" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[79]</anchor-end> <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="76" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;76</anchor-internal> <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="77" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;77</anchor-internal> は実装上は大きな問題はなく、単純に変換すれば済みます。</p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="80" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[80]</anchor-end> ただし、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">往復変換</anchor>はできなくなることに注意が必要です。</comment-p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="81" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[81]</anchor-end> 
<anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="78" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;78</anchor-internal> は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> から従来の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>への変換で実装されていることがあります。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">best fit</anchor> などと呼ばれることがあります。
変換で失われる情報をできるだけ少なくするための配慮として実装されたものでしょうが、
情報の損失がわかりにくくなるという問題があります。</p><example xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><p xmlns="http://www.w3.org/1999/xhtml"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="84" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[84]</anchor-end> 
例えば <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> から<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">シフトJIS</anchor>に変換する <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Win32 API</anchor> で <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">best fit</anchor>
を有効にすると、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">アクセント付きラテン文字</anchor>がただの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ラテン文字</anchor>に変換されます。</p></example><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="82" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[82]</anchor-end> 
また、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">best fit</anchor> 写像によって<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">セキュリティー</anchor>の問題が生じる事案も報告されています。
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>best fit</anchor> </sw-see></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="83" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[83]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">best fit</anchor> は提供する場合でも動作オプションとするべきでしょう。</p></section><section><h1>多段変換</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="85" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[85]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">インド系文字の文字コード</anchor>と <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> との変換など<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号化文字</anchor>の考え方が大きく異なる<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>間の変換は、
1パスの単純な変換ではなく、複数回の変形処理の組合せとして実装されていることがよくあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="86" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[86]</anchor-end> 
多段変換とすることで記述や実装が単純化することも多いですが、
どんな入力がどんな出力になるかの見通しは悪いことが多いです。</p><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="156" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[156]</anchor-end> 
機能的必然性がなく、実装の容易性のために多段化されているとみられる事例も散見されます。
例えば <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">JavaScript</anchor> で実装された変換器で、 <code>String</code> の <code>replace</code>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">メソッド</anchor>を繰り返し適用することで順次<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>を置換していくようなスタイルの変換器が多数あります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="157" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[157]</anchor-end> 一昔前なら何パスも掛けて<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>を走査するのは無駄が多く、
1パスで文字列の先頭から順に見ていくのが良いとされたのでしょうが、
現在ではパフォーマンス上の違いは微々たるもので、
実装の簡単性と視認性のメリットが遥かに上回ります。
標準メソッドだけで記述できる分、独自にループで1パスで実装するよりも高速になる可能性までありますし、
実装ミスによる不具合のリスクも減ります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="158" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[158]</anchor-end> 
ただしこの手法は入力文字集合と出力文字集合が重ならない場合には安全ですが、
そうでない場合には置換の適用順序が重要になってきます。
ところがこれをあまり意識していないと思われる事例が散見されます。
出力が再度入力条件と一致することによる置換同士の相互作用が意図的と推定できる場合もあれば、
意図的なのかどうかはっきりしない場合も多いのです。
どちらにしても変換処理全体の入出力の関係が不明瞭となりがちで、不具合の温床となっています。
開発者自身が挙動を理解しきれず冗長な置換規則や誤った置換規則を挿入したと思しき事例もあります。</p><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="253" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[253]</anchor-end> 
変換の段 (pass, phase) 数は、
前述の通り実装戦略次第で1パスだったり数十から数百パスだったり様々となります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="254" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[254]</anchor-end> 
前述の <code>replace</code> 鎖のような実装戦略の場合、
互いに干渉せず同時処理可能なものをまとめると高々二、三十パス程度になることが多いようです。
(もちろん一パスから二、三パス、せいぜい十パス程度に収まるものがかなり多いです。)
中には百数十パスくらいまでしか減らないものもありますが、
同時処理可能かどうかの判定が難しいケースを保守的に数えた結果ですから、
厳密に検討していけばもっと減らせるでしょう。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="255" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[255]</anchor-end> 
<cite>TECkit</cite> の <code>.map</code> のように同時処理可能なものをまとめつつ人間の判断で分けた方が扱いやすいものを分ける実装戦略だと、
多くても十数パス程度になるようです。
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>.map</anchor> </sw-see>
人間により <code>.map</code> で記述されたことがない<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の方が圧倒的に多いでしょうが、
おそらくこれを大きく上回る複雑さの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>は存在していないでしょう。</p></section><section><h1>正規化処理</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="87" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[87]</anchor-end> 
変換処理本体の単純化のために別段で<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">正規化</anchor>の処理が適用されることがあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="88" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[88]</anchor-end> 
入力が <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> のとき、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">NFC</anchor> や <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">NFD</anchor> を適用することで、
変換処理本体が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">基底文字</anchor>と<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">結合文字</anchor>の組合せか<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">合成済み文字</anchor>の一方だけを記述することで済ませたり、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">結合文字</anchor>の順序が入れ替わっている場合への対処を省略したりすることができます。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="89" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[89]</anchor-end> 
入力が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">翻字</anchor>系の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号化</anchor>のときで<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">大文字・小文字不区別</anchor>のとき、
一括してどちらかに統一してから変換処理本体を実行する場合があります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="90" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[90]</anchor-end> 
入力の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の構造上の理由から変換処理本体が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">基底文字</anchor>と<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">結合文字</anchor>の組合せを出力したり、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">合成済み文字</anchor>を出力したりすることがあり、これを好ましくないと考える場合、
変換処理本体の後に <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">NFC</anchor> や <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">NFD</anchor> を適用する場合があります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="91" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[91]</anchor-end> 
こうした処理は変換処理本体の実装コストを削減できますが、
思わぬ副作用を生むこともあり、注意が必要です。</p><example xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><p xmlns="http://www.w3.org/1999/xhtml"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="92" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[92]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">大文字と小文字</anchor>の変換は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プログラミング言語</anchor>によって実装が違いますし、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ロケール</anchor>によって違った変換となる場合もあります。
変換器の実装者がそうした詳細まで細かく注意して設計していないと思われる事例が散見されます。</p></example><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="256" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[256]</anchor-end> 
なお、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode正規化</anchor>を実装しているかのような説明でありながら、
当該<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>やその<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">言語</anchor>に関連がある部分だけしか実装していないようなものもあります。</p></section><section><h1>順序入れ替え処理</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="93" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[93]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">インド系文字の文字コード</anchor>と <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> の変換など、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号化文字</anchor>の考え方が大きく異なる<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の変換では、
入出力で<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>の配列順序を変更しなければならないことがよくあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="94" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[94]</anchor-end> 
入力または出力の数文字の部分文字列が特定のパターンに一致するかを判定し、
一致するなら順序を入れ替えるような処理を複数種類適用することになります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="95" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[95]</anchor-end> 
部分文字列の組み合わせ数が膨大過ぎて、
多文字対多文字対応に展開するのが事実上不可能な場合が多いです。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="96" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[96]</anchor-end> 
実装によって、
出力<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>への変換後に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">正規表現</anchor>の置換を組合せたり、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">正規表現</anchor>の置換の組合せの後に出力<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>へ変換したり、
出力<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>へ変換しながら順序を入れ替える<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">状態機械</anchor>を実装したり、
内部処理用の中間表現を導入したりと、
様々な実装戦略が採られています。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="97" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[97]</anchor-end> 
どの方法も相当複雑になりますし、概略同じ手法でも置換パターンの作り方次第で見かけ上の処理は大きく変わってしまいます。
従ってソースコードを読んで挙動を理解するのは至難の業ですし、
諸実装の特徴を比較することも困難です。</p><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="242" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[242]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘブライ文字の文字コード</anchor>や<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">アラビア文字の文字コード</anchor>では<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">論理順</anchor>と<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">視覚順</anchor>の変換処理が必要となる場合が多いです。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="243" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[243]</anchor-end> 
従来<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>側だけでなく <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> 側にも<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">bidi</anchor> 関係の制御の文字が多数あり、
それらの相互作用を考慮する必要があります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="244" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[244]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">行</anchor>の単位を検出し文字の順序を入れ替える必要があります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="245" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[245]</anchor-end> 
単純な逆順への入れ替えだけでなく、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">結合文字</anchor>のように<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">基底文字</anchor>に付随する文字をグループ化するなど細かな調整が必要となります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="247" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[247]</anchor-end> 
実装戦略としては、</p><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="248" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[248]</anchor-end> 狭義変換の前に実施する、</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="249" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[249]</anchor-end> 狭義変換の後に実施する、</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="250" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[250]</anchor-end> 狭義変換と組み合わさった処理として同時に実行する、</li></ul><p>... の3通りがあります。
完全に分離する方がアルゴリズムとして綺麗でありメンテナンスが容易で不具合を生みにくいと考えられますが、
1パスで処理したい、 <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="244" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;244</anchor-internal> や <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="245" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;245</anchor-internal> のような複雑な処理との組合せで <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="250" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;250</anchor-internal>
の方が実装しやすいという状況もあるのでしょう。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="246" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[246]</anchor-end> 
<cite>TECkit</cite> の <code>.map</code> のように事前または事後に行うべき処理として分離している記述形式もあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="251" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[251]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コードの変換</anchor>の処理から<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">視覚順</anchor>と<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">論理順</anchor>の処理を敢えて除外することもあります。</p><example xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><p xmlns="http://www.w3.org/1999/xhtml"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="252" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[252]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Webにおける文字コード</anchor>の処理では<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">視覚順</anchor>の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ISO-8859-8</anchor> を
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode文字列</anchor>に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">変換<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">文字コードの変換</title></anchor>する際に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">論理順</anchor>にせず元のままにして、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CSS</anchor> によって<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">表示<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">文字のレンダリング</title></anchor>する際に通常の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">bidi</anchor> の規則を適用せずそのままの順序としています。
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>ISO-8859-8</anchor> </sw-see></p></example></section><section><h1>アルゴリズム的変換</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="109" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[109]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コードの変換</anchor>の処理で変換表の類によらない計算のみで実現できる操作はいろいろあります。
例えば、</p><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="110" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[110]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ISO/IEC 2022</anchor> における <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">GL</anchor> と <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">GR</anchor> の変換</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="115" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[115]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ISO/IEC 2022</anchor> における <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CR</anchor> と <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><sw-cn>ESC</sw-cn> <var xmlns="http://www.w3.org/1999/xhtml">Fe</var></anchor> の変換</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="111" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[111]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">JIS X 0208</anchor> に基づく<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">シフトJIS</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">日本語EUC</anchor>, いわゆる<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">JISコード</anchor>の変換</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="112" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[112]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTF-8</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTF-16</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTF-7</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SCSU</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">BOCU</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTF-1</anchor> などの変換</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="116" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[116]</anchor-end> 情報交換用符号を符号空間に配置した各種<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">内部符号</anchor>との変換</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="117" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[117]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">同型符号化</anchor>・<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">同型復号</anchor></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="113" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[113]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Punycode</anchor> などの変換</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="114" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[114]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">escape</anchor> との変換</li></ul><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="106" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[106]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">平成時代</anchor>初期ごろまでの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">日本</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コードの変換</anchor>は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">JIS X 0208</anchor> に基づく<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">シフトJIS</anchor>と<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">日本語EUC</anchor>といわゆる<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">JISコード</anchor>の変換が中心で、
簡単な計算で相互に変換できました。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="107" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[107]</anchor-end> 
その後 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> の普及期には、計算で変換できず数千行の変換表が必要となる
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> と従来<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>との変換は敬遠されがちで、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor>
移行の障害となっていました。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="108" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[108]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> が一般化した現在では、計算機性能の向上もあってこうした問題が意識されることはなくなりました。
しかし<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">シフトJIS</anchor>と<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">日本語EUC</anchor>といわゆる<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">JISコード</anchor>の変換も <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> を介して行われることが増え、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> との対応関係がそれぞれ微妙に異なるために従来なら無劣化で行えた変換でデータ損失が生じるような事態も生じています。</p></section><section><h1>入力符号の状態</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="204" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[204]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コードの変換</anchor>の実装は、入力を読み込みながら、
入力<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の状態を管理する必要があります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="205" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[205]</anchor-end> 
入力の状態の例:</p><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="208" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[208]</anchor-end> 複数の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>で構成される<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号</anchor>の読み取り状態</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="209" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[209]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">エスケープシーケンス</anchor>の読み取り状態</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="210" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[210]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">制御機能</anchor>の読み取り状態</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="206" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[206]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ISO/IEC 2022</anchor> の状態</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="207" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[207]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TRONコード</anchor>の状態</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="265" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[265]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">漢字イン</anchor>・<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">漢字アウト</anchor>の状態</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="266" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[266]</anchor-end> その他<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>体系独自の状態</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="264" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[264]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">翻字</anchor>・<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">転写</anchor>の手法が規定するモード切り替えや<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">括弧</anchor>の対応など</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="211" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[211]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">結合文字列</anchor>その他の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">合成文字</anchor>を構成する<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>の列の読み取り状態</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="220" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[220]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><sw-ch>˥˩</sw-ch></anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><sw-ch>˩˥</sw-ch></anchor></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="221" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[221]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">国旗絵文字</anchor></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="223" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[223]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">PVS</anchor></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="224" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[224]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">escape</anchor></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="213" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[213]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">行</anchor>その他<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">端末</anchor>の状態</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="222" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[222]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">単語</anchor>における位置</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="214" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[214]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">bidi</anchor> の状態</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="215" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[215]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">書式制御文字</anchor>の状態</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="216" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[216]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">タグ文字</anchor>の状態</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="217" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[217]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">言語情報</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ロケール</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">フォント</anchor></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="218" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[218]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">太字</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">斜体</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">打ち消し線</anchor>, その他</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="219" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[219]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>に埋め込まれた<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>ではないオブジェクト</li></ul><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="212" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[212]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode正規化</anchor>から呼び出される<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">正準再順序付け</anchor>のように無限の長さの文字列の状態を保持しなければならない処理があります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="237" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[237]</anchor-end> 
<cite>TECkit</cite> の <code>.map</code> は <code>+</code> や <code>*</code> などによる任意の長さの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">列</anchor>を条件として記述していますが、
一致する最大長を <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">15</n> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">以下</anchor>に制限しています。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="238" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[238]</anchor-end> 
同じような条件の記述でも、このような長さ制限を設けていないで<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">正規表現</anchor>の実装に任せたり、
自前でも<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">状態機械</anchor>により無限の長さを<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">受理</anchor>したりする実装も多いです。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="239" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[239]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">自然言語</anchor>の記述である<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>の列であれば、そうした余りに長い<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>が出現することはまずないと考えられるので、
<n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">15</n> など<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">現実的な長さに制限することは合理的な実装上の配慮であり、セキュリティーその他のために望ましくもあります<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">ハードウェア制限条項</title></anchor>。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="240" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[240]</anchor-end> 
こうした長さの上限のない変換条件の記述は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">音節</anchor>の単位を検出しつつ置換や順序入れ替えを実施したい<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">インド系文字の文字コード</anchor>の変換処理や、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">行</anchor>単位で順序の入れ替えを実施したい<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘブライ文字の文字コード</anchor>や<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">アラビア文字の文字コード</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">論理順</anchor>と<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">視覚順</anchor>の処理、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">語頭形</anchor>・<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">語中形</anchor>・<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">語末形</anchor>の処理などで見られます。</p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="241" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[241]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コードの変換</anchor>以外では <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">shaping</anchor> や<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">結合文字列</anchor>など<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字のレンダリング</anchor>の関連の処理で似たような状況が出現します。</comment-p><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="267" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[267]</anchor-end> 
実装によっては<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コードの判定</anchor>や<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">翻字</anchor>・<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">転写</anchor>の体系とただの <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">English</anchor>
の区別の確立的判定など、符号化手法を判断する処理と変換の処理が結合していることがあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="268" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[268]</anchor-end> 
更には <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTML</anchor> の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>指定の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">検知<title xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">charset sniffing</title></anchor>のような<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文書形式</anchor>や<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プロトコル</anchor>に依存した処理も併合されていることがあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="269" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[269]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTML</anchor> における<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号化の変更</anchor>の処理など、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コードの判定</anchor>の結果を報告したり、
それに応じて<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コードの変換</anchor>の処理を再起動したりといった措置が必要になることもあります。</p></section><section><h1>状態付き符号への変換</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="150" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[150]</anchor-end> 
出力<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>が状態を持つことがあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="151" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[151]</anchor-end> 
例えば出力が <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ISO/IEC 2022</anchor> に基づき複数の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号化文字集合</anchor>を切り替えて使える<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号</anchor>の場合、
変換は入力文字符号から状態と文字符号の組への<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">写像</anchor>の形で記述されることになります。
出力の状態が現在の状態と同じならそのまま文字符号を出力でき、
現在の状態と異なるなら状態を切り替えてから文字符号を出力することになります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="152" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[152]</anchor-end> 
同じ入力文字符号に対する出力の候補として、複数の状態とその文字符号がある場合があります。
この場合、現在の状態と同じものがあれば、その候補を選択すると、自然な出力となる場合が多いです。
(出力<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の仕様や慣習にも依存します。)</p><example xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><p xmlns="http://www.w3.org/1999/xhtml"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="153" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[153]</anchor-end> 
例えば <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> から <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ISO/IEC 2022</anchor> に基づき <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">JIS X 0208</anchor> と <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">GB 2312</anchor> を使える<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号</anchor>へと変換する場合、
<sw-ch xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">一</sw-ch>は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">JIS X 0208</anchor> と <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">GB 2312</anchor> のどちらにも存在するので、
現在の状態に応じてどちらを使うかを決めれば、切り替えのための<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">指示シーケンス</anchor>を節約できます。</p></example><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="154" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[154]</anchor-end> 
出力の状態切り替えは、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ISO/IEC 2022</anchor> の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">エスケープシーケンス</anchor>のような<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>層の技術による場合もあれば、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTML</anchor> の <code>font</code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要素</anchor>や <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RTF</anchor> の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">フォント</anchor>切り替えのような<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文書形式</anchor>の機能によって行う場合もあります。</p><example xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><p xmlns="http://www.w3.org/1999/xhtml"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="155" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[155]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">エチオピア文字の文字コード</anchor>や<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">チベット文字の文字コード</anchor>や<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ギリシャ文字の文字コード</anchor>など、
変換処理が入力の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">フォント</anchor>の違いを認識したり、出力の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">フォント</anchor>を切り替えたりする必要のある構造のものがあります。</p></example></section><section><h1>変換されない部分文字列</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="326" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[326]</anchor-end>
入力の部分文字列がそのまま出力されることがあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="327" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[327]</anchor-end> 
入力<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>と出力<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>で同じ表現になる<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>がある場合があります。</p><example xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><p xmlns="http://www.w3.org/1999/xhtml"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="328" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[328]</anchor-end> 多くの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>体系は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ASCII文字</anchor>を同じ<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>で表します。</p></example><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="329" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[329]</anchor-end> 
入出力がほぼ同じでも、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>と<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>のような<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">データ型</anchor>の違いだけがある場合があります。
そうした場合の処置は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プラットフォーム</anchor>によって異なります。</p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="330" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[330]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">暗黙の型変換</anchor>が行われる<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プログラミング言語</anchor>等もあります。
そうした機能性を活用するときは意図せぬ<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">型変換</anchor>による<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">不具合</anchor>への注意も同時に必要となります。</comment-p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="331" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[331]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTF-8</anchor> の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>から内部表現 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTF-8</anchor> の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>へ、
通常行われる検査を省略して高速に変換する <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">API</anchor> を持つ<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プログラミング言語</anchor>等もあります。
そうした機能を使う場合、不正な入力を無理に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列型</anchor>に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">キャスト</anchor>してしまい、
以後の処理が誤作動したり、暴走したり、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">セキュリティー</anchor>の問題を起こしたりすることがないよう、
最新の注意が必要となります。</comment-p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="332" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[332]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">フォント依存符号化</anchor>の変換器のように、対象外となる部分は無変換とすることがあります。</p><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="333" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[333]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ASCII</anchor> と<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">8ビット符号</anchor>で構成される<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>であることを前提に、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ASCII文字列</anchor>なら<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コードの変換</anchor>の処理を省略し、
そうでないなら<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コードの変換</anchor>の処理を実行するような性能向上のための最適化が行われることがあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="334" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[334]</anchor-end> 
こうした最適化は、例えば<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">多バイト符号</anchor>の第2バイトに <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ASCII文字</anchor>と同じ<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>が含まれる場合や、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ISO-2022-JP</anchor> のような<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">7ビット符号</anchor>など、設計者の想定不足による不具合を起こすことがありますから、
十分に注意が必要です。</p></section><section><h1>変換不能な入力への対処</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="118" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[118]</anchor-end> 
入力となる<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>であるはずのものには、
適切に変換できないデータが含まれていることがあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="119" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[119]</anchor-end> 
具体的には</p><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="120" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[120]</anchor-end> 入力<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の仕様上出現しないはずの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="121" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[121]</anchor-end> 入力<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の構造上は存在するものの、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号化文字</anchor>の割当がない空き領域に相当するもの<ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="122" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[122]</anchor-end> そのうち、新しい版など関連する他の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>では割当があるもの</li></ul></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="135" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[135]</anchor-end> 
入力<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>では正当な<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>だが、出力<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>で表せないもの</li></ul><p>といったものが考えられます。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="123" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[123]</anchor-end> 
歴史的に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>関連規格は不正な入力への対処を明確に規定して来ませんでした。
こうしたものに遭遇したときの仕様上の「正しい」挙動が存在しないことが多いです。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="124" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[124]</anchor-end> 
近年の <cite>Encoding Standard</cite> はあらゆる入力に対する挙動を定めていますが、
例外的な存在です。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="125" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[125]</anchor-end> 
こうしたデータに対する処理は実装によって様々です。</p><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="126" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[126]</anchor-end> 動作オプションを指定できるもの</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="127" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[127]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">置換文字</anchor>等に置き換えるもの</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="225" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[225]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">画像</anchor>その他の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>ではないオブジェクトや<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>と<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>でないオブジェクトの組合せや<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>と書式その他の付加情報の組合せに置き換えるもの</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="128" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[128]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">escape</anchor> 類に置き換えるもの</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="134" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[134]</anchor-end> 関連する他の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>とみなして処理するもの (<anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="122" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;122</anchor-internal>)</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="143" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[143]</anchor-end> 似た文字に置き換えるもの (<anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="81" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;81</anchor-internal>)</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="129" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[129]</anchor-end> エラーとして停止するもの</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="130" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[130]</anchor-end> 入力をそのまま出力するもの</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="131" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[131]</anchor-end> 何も出力しないもの</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="132" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[132]</anchor-end> 異常停止するもの、異常動作するもの</li></ul><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="133" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[133]</anchor-end> 
このうち <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="130" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;130</anchor-internal> <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="131" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;131</anchor-internal> <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="132" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;132</anchor-internal> は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">セキュリティー</anchor>上の問題を起こしかねないですし、
<anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="129" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;129</anchor-internal> も<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ライブラリー</anchor>等で<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">応用</anchor>の開発者が意図していない場合には好ましからざる挙動となることがあります。
不適切なデータに対する挙動はあまり意識されないことが多いようで、
このような問題を孕んだ実装は意外と多いです。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="136" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[136]</anchor-end> 
ただし出力先が <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTML</anchor> や <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RTF</anchor> などで<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">フォント</anchor>指定を伴う場合のように、
<anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="130" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;130</anchor-internal> が正当な選択肢となることもあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="203" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[203]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">エディター</anchor>類でファイルを開く場合のように、不正な入力も生の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>として他の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>とは区別してそのまま保持できることが好ましい用途もあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="179" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[179]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">置換文字</anchor>や <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">escape</anchor> に置き換える手法は非常によく用いられますが、
通常の入力からの変換結果との区別に注意が必要となることがあります。
例えば不正な入力を <sw-ch xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">?</sw-ch> に置き換えると、
本来の <sw-ch xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">?</sw-ch> と区別が付かなくなり、問題となる場合もあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="180" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[180]</anchor-end> 
多数の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の出力に対応する実装や外部から動作オプションで指定できる実装は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">置換文字</anchor>や <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">escape</anchor> が出力先の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>に存在しない<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>を含む場合の対処にも注意が必要です。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="293" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[293]</anchor-end> 
変換表の類は、明示的な変換規則がない場合に使われる<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">置換文字</anchor>を記述できるようにしているものも多いです。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="294" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[294]</anchor-end> 
変換表や実装などが採用している<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">置換文字</anchor>の例:</p><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="295" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[295]</anchor-end> <sw-cc xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">U+FFFD</sw-cc></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="297" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[297]</anchor-end> <sw-cc xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">U+0020</sw-cc></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="300" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[300]</anchor-end> <sw-cc xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">U+001A</sw-cc></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="298" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[298]</anchor-end> <sw-ch xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">〓</sw-ch></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="299" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[299]</anchor-end> <sw-ch xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">・</sw-ch></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="296" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[296]</anchor-end> <sw-ch xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">?</sw-ch></li></ul></section></section><section><h1>往復変換</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="306" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[306]</anchor-end> 
変換直後に逆変換することを合わせて<dfn><rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">往復変換<rt xmlns="http://www.w3.org/1999/xhtml">roundtrip conversion</rt></rubyb></dfn>といいます。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="307" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[307]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コードの変換</anchor>に限った用語ではありませんが、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>について使うことがかなり多いようです。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="308" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[308]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">往復変換</anchor>は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の性質や<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コードの変換</anchor>の性質の評価において重要な観点です。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="319" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[319]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">往復変換</anchor>の成否は個別の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字列</anchor>についていう事もあれば、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>体系全体を総括的にいうこともあります。</p><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="309" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[309]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> は欧米の主要な<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>をすべて収録しているため、
そのような従来<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>から <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> に変換し、
従来<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>に戻すような<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">往復変換</anchor>では情報の損失がほとんど発生しません。</p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="310" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[310]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">20世紀</anchor>末から<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">21世紀</anchor>初頭の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プラットフォーム</anchor>は保存データが従来<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>、
内部処理用が <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> という方式のものが多かったので、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">往復変換</anchor>の安全性が重要でした。</comment-p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="311" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[311]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">往復変換</anchor>の安全性は、逆転させると違うことがあります。</p><example xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><p xmlns="http://www.w3.org/1999/xhtml"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="312" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[312]</anchor-end> <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="309" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;309</anchor-internal> の場合でも、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> から従来<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>に変換し、
更に <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> に変換すると、情報の損失が発生することがあります。</p></example><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="313" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[313]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">アジア</anchor>の多くの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>は <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="309" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;309</anchor-internal> の性質が成り立たないか、
成り立つか自明ではありません。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="314" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[314]</anchor-end> 
個別の実装をみても、順方向と逆方向で処理が対照的になっていない事例が散見されます。
それが意図的なものかそうでないのか、
特定の実装の性質なのか<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>自体の性質かなど、
判断するのが困難な場合が多いです。
(そういう実装は複雑な変換処理を行っているものなので、判定が難しいです。)</p><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="315" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[315]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">重複符号化</anchor>は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">往復変換</anchor>が成功しなくなる大きな要因です。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="317" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[317]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>の概念や<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号化</anchor>モデルが違う<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>体系同士の変換だと<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">往復変換</anchor>が成功しないことが多くなると考えられます。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="318" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[318]</anchor-end> 
扱う<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>が異なる<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>体系だと<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">往復変換</anchor>が成功しないことが多くなります。
一方にしかない<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>があると当然失敗します。</p><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="316" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[316]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">往復変換</anchor>の安全性は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>レベルの情報の損失を基準に議論されることが多いようです。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>レベルで複数の表現があり得る<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>体系だと<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">往復変換</anchor>によって異なる<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト列</anchor>となることがあり、
それを<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">往復変換</anchor>が成功した、していないと議論されることはあまりないように思われます。</p><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="320" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[320]</anchor-end> 
変換表の形で記述される変換は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">往復変換</anchor>を前提にしたものが多いです。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="321" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[321]</anchor-end> 
<cite>TECkit</cite> の <code>.map</code> のように複雑めな変換を記述できる形式でも、
順方向と逆方向の変換をセットで記述し、共通部分と差分を含められるようにしている場合があります。</p></section><section><h1>変換用の写像表</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="35" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[35]</anchor-end> 
<cite xml:lang="en">CodepageEncoder/data/encodings at main · NielsLeenheer/CodepageEncoder · GitHub</cite>, <time>2025-05-23T15:52:48.000Z</time> <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://github.com/NielsLeenheer/CodepageEncoder/tree/main/data/encodings">https://github.com/NielsLeenheer/CodepageEncoder/tree/main/data/encodings</anchor-external></p><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="36" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[36]</anchor-end> <cite xml:lang="en">icu/icu4c/source/data/mappings at main · unicode-org/icu · GitHub</cite>, <time>2025-05-29T12:29:56.000Z</time> <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://github.com/unicode-org/icu/tree/main/icu4c/source/data/mappings">https://github.com/unicode-org/icu/tree/main/icu4c/source/data/mappings</anchor-external></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="37" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[37]</anchor-end> <cite xml:lang="en">icu-data/charset at main · unicode-org/icu-data · GitHub</cite>, <time>2025-05-31T11:52:53.000Z</time> <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://github.com/unicode-org/icu-data/tree/main/charset">https://github.com/unicode-org/icu-data/tree/main/charset</anchor-external></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="38" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[38]</anchor-end> <cite xml:lang="ja">ICU - International Components for Unicode - Character Set Mapping Tables</cite>, <time>2025-05-31T11:53:44.000Z</time> <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://icu.unicode.org/charts/charset">https://icu.unicode.org/charts/charset</anchor-external></li></ul><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="39" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[39]</anchor-end> <cite>Evertype: Unicode Mapping Tables</cite>, <time>2006-01-01T14:10:51.000Z</time>, <time>2025-06-06T14:32:00.732Z</time> <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://www.evertype.com/standards/mappings/">https://www.evertype.com/standards/mappings/</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="40" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[40]</anchor-end> 
<cite xml:lang="en-US">sourceware.org Git - glibc.git/tree - iconvdata/</cite>, <time>2025-06-25T13:02:45.000Z</time> <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://sourceware.org/git/?p=glibc.git;a=tree;f=iconvdata;h=494f8c50b9c9662ae85bf56184db943b0526e12c;hb=b2a8d19f4adc8ca22394b02c144b4bc867adc804">https://sourceware.org/git/?p=glibc.git;a=tree;f=iconvdata;h=494f8c50b9c9662ae85bf56184db943b0526e12c;hb=b2a8d19f4adc8ca22394b02c144b4bc867adc804</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="10" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[10]</anchor-end> <cite xml:lang="ja">xorg / font / encodings · GitLab</cite>, <time>2025-09-12T10:22:04.000Z</time> <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://gitlab.freedesktop.org/xorg/font/encodings">https://gitlab.freedesktop.org/xorg/font/encodings</anchor-external></p><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="11" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[11]</anchor-end> <cite xml:lang="en">xterm-snapshots/charsets.dat at master · xterm-x11/xterm-snapshots · GitHub</cite>, <time>2025-09-12T10:30:35.000Z</time> <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://github.com/xterm-x11/xterm-snapshots/blob/master/charsets.dat">https://github.com/xterm-x11/xterm-snapshots/blob/master/charsets.dat</anchor-external><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="12" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[12]</anchor-end> <cite xml:lang="en">xterm-snapshots/charsets.h at master · xterm-x11/xterm-snapshots · GitHub</cite>, <time>2025-09-12T10:31:19.000Z</time> <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://github.com/xterm-x11/xterm-snapshots/blob/master/charsets.h">https://github.com/xterm-x11/xterm-snapshots/blob/master/charsets.h</anchor-external></li></ul></li></ul><section><h1>Unicode Consortium の変換表</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="8" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[8]</anchor-end> 当初は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">FTP</anchor> 配布 <sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>Unicode Consortium</anchor> </sw-see></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="20" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[20]</anchor-end> <cite>General Questions about Chararcter Mappings</cite>, <time>2025-06-30T04:33:44.000Z</time>, <time>1997-01-05T19:42:04.261Z</time> <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://web.archive.org/web/19970105193228/http://stonehand.com:80/unicode/faq/mappings/general.html">https://web.archive.org/web/19970105193228/http://stonehand.com:80/unicode/faq/mappings/general.html</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="21" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[21]</anchor-end> 
<cite>Questions about Mapping Tables</cite>, <time>2025-06-30T04:34:20.000Z</time>, <time>1997-01-05T19:42:29.061Z</time> <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://web.archive.org/web/19970105193219/http://stonehand.com:80/unicode/faq/mappings/tables.html">https://web.archive.org/web/19970105193219/http://stonehand.com:80/unicode/faq/mappings/tables.html</anchor-external></p></section><section><h1><cite>Encoding Standard</cite> の変換表</h1><p><sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>Encoding Standard</anchor> </sw-see></p></section><section><h1><cite>TECkit</cite> の <code>.map</code> ファイル</h1><p><sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <code xmlns="http://www.w3.org/1999/xhtml">.map</code>, <anchor>TECkit</anchor> </sw-see></p></section></section><section><h1>文脈</h1><figure class="list middle"><figcaption><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="9" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[9]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コードの変換</anchor></figcaption><ul><li><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Webにおける文字コード</anchor><ul><li><cite><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Encoding Standard</anchor></cite></li></ul></li><li><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SGMLにおける文字コード</anchor></li><li><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">XMLにおける文字コード</anchor></li><li><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ファイル名の文字コード</anchor></li></ul></figure></section><section><h1>実装</h1><figure class="list middle"><figcaption><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="196" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[196]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コードの変換</anchor>の実装</figcaption><ul><li><cite>iconv</cite></li><li><cite>nkf</cite></li><li><cite>hc</cite></li><li><cite>hmconv</cite></li><li><cite>hcode</cite></li><li><code>jcode.pl</code></li><li><code>Jcode.pm</code></li><li><code>Encode.pm</code></li><li><cite>lv</cite></li><li><cite>Emacs</cite></li><li><cite>w3m</cite></li></ul></figure></section><section><h1>研究史</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="170" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[170]</anchor-end> 
個別の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>対の変換操作については<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">20世紀</anchor>から<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">21世紀</anchor>初頭の頃に実装戦略が研究されてきているものの、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ソースコード</anchor>以外にまとまった文章の形となっていない場合が大多数と思われます。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="171" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[171]</anchor-end> 
各種の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>技術の変換を包括的に議論したものはほとんどないと思われます。
あるとしても<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">欧米</anchor>や<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">東アジア</anchor>の主要な<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>規格に関するものが中心で、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">アジア</anchor>等の各地で使われた<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">フォント依存符号化</anchor>系の変換技術や <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTML</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RTF</anchor>
の処理と組み合わさった変換技術、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ワープロ</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">マクロ</anchor>の形の実装手法など、
本格的な研究対象として観察されてこなかったと思われる領域が多いです。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="172" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[172]</anchor-end> 
実装技法も実装そのものも <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> への移行の進展と共に忘れられつつあり、
技術史の観点から個々の実態調査を進めて全貌を究明し、
要素技術を整理して検証していくことが急務でしょう。</p></section><section><h1>関連</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="7" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[7]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">変形</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号化</anchor>、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">復号</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード判定</anchor>,
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コードの修復</anchor></p></section><section><h1>メモ</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="165" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[165]</anchor-end> 
変換器は古今東西に無数に開発され利用されてきたようです。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="166" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[166]</anchor-end> 
その中には十分なテストがされておらず満足に動作しないもの、
致命的な不具合があるもの、
意図した動作なのか疑わしい挙動をするものもあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="167" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[167]</anchor-end> 
驚くべきことに、地域コミュニティーの中心的な Web サイトの変換器であってもそのような品質のものが珍しくありません。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="168" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[168]</anchor-end> 
また、同じ<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>体系に対応していると主張する変換器同士であっても、
互いの挙動に違いがあることは珍しくありません。
どちらが正しいか判断できないもの、どちらも違った形で壊れていると思われるものも多いです。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="169" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[169]</anchor-end> 
単純な変換表の形で表現された変換器の実装や明らかに単純な変換をしている変換器の出力なら互いに比較することもできますが、
複雑なアルゴリズムで変換しているものは、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ソースコード</anchor>を慎重に読み込んでも互いの挙動にどのような違いがあるのか理解しづらいことがほとんどです。</p><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="30" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[30]</anchor-end> <cite>telecode(5)</cite>, <time>1998-10-14T23:29:58.000Z</time>, <time>2022-05-03T03:38:56.992Z</time> <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://www2.phys.canterbury.ac.nz/dept/docs/manuals/unix/DEC_4.0e_Docs/HTML/MAN/MAN5/0330____.HTM">http://www2.phys.canterbury.ac.nz/dept/docs/manuals/unix/DEC_4.0e_Docs/HTML/MAN/MAN5/0330____.HTM</anchor-external></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="31" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[31]</anchor-end> <cite>Microsoft Word - Chinawrd.doc - CHINPRN.PDF</cite>, <time>1999-06-21T12:00:00.000Z</time>, <time>2022-05-03T06:55:10.367Z</time> <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://www2.phys.canterbury.ac.nz/dept/docs/manuals/unix/DEC_5.0a_Docs/ACRO_SUP/CHINPRN.PDF#page=33">http://www2.phys.canterbury.ac.nz/dept/docs/manuals/unix/DEC_5.0a_Docs/ACRO_SUP/CHINPRN.PDF#page=33</anchor-external></li></ul><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="201" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[201]</anchor-end> <cite xml:lang="ja">3.15.7 Javaにおける文字化けの問題についての注意事項</cite>, <time>2006-08-04T20:04:19.000Z</time>, <time>2025-11-19T14:46:58.392Z</time> <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://software.fujitsu.com/jp/manual/manualfiles/M060036/B1WN6251/01Z201/note03/note0083.htm">https://software.fujitsu.com/jp/manual/manualfiles/M060036/B1WN6251/01Z201/note03/note0083.htm</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="202" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[202]</anchor-end> <cite>null</cite>, <time>2025-11-19T14:48:49.000Z</time> <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://docs.oracle.com/cd/E19253-01/819-0364/6n2q0anpf/index.html">https://docs.oracle.com/cd/E19253-01/819-0364/6n2q0anpf/index.html</anchor-external></p></section></body></html>