<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="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> (<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> (例: <code>charset</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="24" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[24]</anchor-end> 
推定手法やそれらの組合せは不確実性を伴うものの、現実には非常に広範囲かつ頻繁に用いられています。</p><section><h1>文字コードの決定</h1><p><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> 
<dfn>文字コードの決定</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>の解釈に使う<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="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:">転送プロトコル</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><figure class="steps"><figcaption><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> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コードの決定</anchor></figcaption><ol><li><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> 決定的指定</li><li><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> <sw-cn xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">BOM</sw-cn></li><li><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> 上書き指定</li><li><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>による指定</li><li><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> <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="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>の継承</li><li><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> <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="103" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[103]</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="104" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[104]</anchor-end> 最終既定値</li></ol></figure><p><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:">符号化</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>の推奨候補の選出のように、
いくつも<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="391" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[391]</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="392" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[392]</anchor-end> 
入力となり得るもの:</p><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="395" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[395]</anchor-end> 判定したいデータ本体 : <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="410" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;410</anchor-internal></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="402" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[402]</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="110" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;110</anchor-internal></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="403" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[403]</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="118" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;118</anchor-internal></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="404" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[404]</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="124" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;124</anchor-internal></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="393" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[393]</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="106" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;106</anchor-internal> <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="173" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;173</anchor-internal></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="405" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[405]</anchor-end> データの出所に関する情報 : <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="138" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;138</anchor-internal></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="406" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[406]</anchor-end> 利用環境に関する情報 : <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="138" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;138</anchor-internal></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="407" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[407]</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="384" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;384</anchor-internal></li></ul><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="394" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[394]</anchor-end> 
出力となり得るもの:</p><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="396" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[396]</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="428" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;428</anchor-internal><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="397" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[397]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号化</anchor>の種別1つ<ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="399" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[399]</anchor-end> 「結果なし」</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="400" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[400]</anchor-end> 「バイナリー」 <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="346" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;346</anchor-internal></li></ul></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="398" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[398]</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="114" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;114</anchor-internal></li></ul></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="409" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[409]</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="401" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[401]</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="108" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;108</anchor-internal></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="408" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[408]</anchor-end> 結果の確信度 : <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="447" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;447</anchor-internal></li></ul><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="427" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[427]</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:">encoding sniffing algorithm</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:">MIME sniffing</anchor>,
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">speculative HTML parser</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:">fetch</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><section><h1>入力バイトストリーム</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="410" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[410]</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="411" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[411]</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="414" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[414]</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="412" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[412]</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:">CSV</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="413" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[413]</anchor-end> 
自由にとはいいつつ、一般的な実装では先頭から順に好きなところまで読んでいく形になります。
といっても判定器を構成する小判定器群がそれぞれ順に走査していくような
<cite xmlns="http://www.w3.org/1999/xhtml">UnivCharDet</cite> 型の<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="415" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[415]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP応答</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="416" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[416]</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:">EOF</anchor>
を渡す<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">メソッド</anchor>の2つを用意し、新規データが到着するたびに前者を呼び出す手法でしょうか。</p></example><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="417" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[417]</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="418" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[418]</anchor-end> 
例えば2バイト文字の最初の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>が塊の最後にあったときは、
そのまま未確定の状態を保持しておき、
次の塊の最初を第2バイトとして処理を再開することになります。</p></example><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="419" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[419]</anchor-end> 
巨大ファイルの先頭部分だけを判定に使う場合のように不完全な入力を判定器に渡すことを認める場合には、
データの末尾 (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">EOF</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="420" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[420]</anchor-end> 
例えば2バイト文字の最初の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>と解釈出来るものが塊の最後にあったとき、
その続きが <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">EOF</anchor> なら不正 (2バイト符号ではない、または壊れたデータ)
と判断できますが、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">EOF</anchor> ではなく判定のための入力データの末尾なら、
不正かそうでないかは判断できません。</p></example><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="421" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[421]</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 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="422" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[422]</anchor-end> 
例えばバイトの塊を供給されながら動作する判定器は、
入力に <sw-cn xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">BOM</sw-cn> があって <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTF-8</anchor> と確定したら、
それ以上の入力は不要であると通知すると無駄な入力を抑制できます。</p></example><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="426" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[426]</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:">encoding sniffing algorithm</anchor> の如く、
判定に使う入力の長さや待機時間長に制限がある場合もあります。
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>資源ヘッダー</anchor> </sw-see>
こうした入力の制限は、
判定器の側と判定器に<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="427" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;427</anchor-internal>)
次第となることでしょう。</p><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="455" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[455]</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つだけの入力<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="456" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[456]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ZIPファイル</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:">文字コード</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:">ファイル名</anchor>を
「正解データ」
として参考にできることがあります。</p></section><section><h1>結果として得られる符号化</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="428" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[428]</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="429" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[429]</anchor-end> 
理想的には正解が1つ即座に返されてほしいですが、必ずしもそれが可能とは限りません。</p><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="430" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[430]</anchor-end> 
判定器の諸実装は、どれとも決めかねるときは、</p><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="432" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[432]</anchor-end> 結果無しを返す</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="431" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[431]</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:">windows-1252</anchor> などの既定値を返す</li></ul><p>... のどちらかのことが多いようです。他に</p><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="436" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[436]</anchor-end> 異常動作する</li></ul><p>... ものもあるようです。</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="437" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[437]</anchor-end> 判定器の選定時に注意したいポイントです。</comment-p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="433" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[433]</anchor-end> 正常動作の2タイプのどちらがいいかは使い方によるので一概には言えませんが、
判定器単体の実装としては結果無しを<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="434" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[434]</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:">encoding sniffing algorithm</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="435" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[435]</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="438" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[438]</anchor-end> 
候補が複数あるときでも、多くの判定器の実装は最善と思われる1つを返すようです。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="441" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[441]</anchor-end> 
複数の候補を返す、または返せる判定器の実装もあるようです。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="439" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[439]</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>の読み込みなど、
大概の処理はどれか1つの結果を選んでその先の処理に進むことになるので、
1つに絞り切る決定的な証拠がなくても、どれかを選ぶしかありません。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="440" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[440]</anchor-end> 
<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="442" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[442]</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="443" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[443]</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>と解釈されたり、
そもそもその名前が実装されていなかったりといった非互換性に溢れています。
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>文字コードの識別</anchor> </sw-see></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="444" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[444]</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><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="446" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[446]</anchor-end> 
判定器の諸実装は、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IANA charset</anchor> を採用するもの、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プログラミング言語</anchor>の標準ライブラリーの名前を採用するもの、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">iconv</anchor> の名前を採用するものなど方針がバラバラです。
開発過程で二転三転して混乱している実装もあるようです。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="445" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[445]</anchor-end> 
どの名前がどの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>体系を表すのか標準化され安定しているのは
<cite>Encoding Standard</cite>
の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号化名</anchor>と<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号化ラベル</anchor>がほぼ唯一であり、これを中核とすることが望ましいと思われます。
ただし <cite>Encoding Standard</cite>
は欧米の <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:">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>に弱いのがネックです。</p></section><section><h1>未対応の符号</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="457" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[457]</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>を回答とすることがあります。
大別して2種類あります。</p><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="458" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[458]</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="459" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[459]</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><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="460" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[460]</anchor-end> 
<anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="458" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;458</anchor-internal> は、例えば <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP</anchor> の <code>charset=&quot;&quot;</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="461" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[461]</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="462" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[462]</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:">encoding sniffing algorithm</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="463" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[463]</anchor-end> 
<anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="460" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;460</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="464" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[464]</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="466" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[466]</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="465" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[465]</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="467" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[467]</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="248" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[248]</anchor-end> なお <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="384" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;384</anchor-internal> も参照。</p></section><section><h1>符号の包含と重なり</h1><p><sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>最適な文字コードの選定</anchor> </sw-see></p></section></section><section><h1>結果の確信度</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="447" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[447]</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:">encoding sniffing algorithm</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:">符号化</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>できます。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="448" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[448]</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:">HTTPヘッダー</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="449" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[449]</anchor-end> 
判定器は出力した結果やその他の候補の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号化</anchor>それぞれの得点を内部的に持っていることがあります。
<cite>UnivCharDet</cite> の系譜の諸実装は<rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">確度<rt xmlns="http://www.w3.org/1999/xhtml">confidence</rt></rubyb> [ <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0</n>, <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">1</n> ]
を計算し、最大のものを結果としています。他の実装にも似たような尺度があります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="450" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[450]</anchor-end> 
判定器の実装の中にはこうした値を出力できるものもあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="451" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[451]</anchor-end> 
ただ、こうした値は特定の実装でのみ意味を持つものです。
同じ実装でも版によって判定結果が変わることがあります。
こうした値を得ても、当該判定器の開発者以外にとっては大した情報にはなりません。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="452" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[452]</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="453" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[453]</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="454" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[454]</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:">API</anchor>
としての値空間が必要です。
現時点でそのような事例は見当たりません。</p></section><section><h1>結果を引き渡すタイミング</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="468" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[468]</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="469" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[469]</anchor-end> 
ネットワークからのデータなど入力サイズが短かったり長かったりし、
時には無限のこともあるなら、いつどのように結果を引き渡すかを考える必要があります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="470" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[470]</anchor-end> 
例えば <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTML</anchor> の場合は入力の最初の1024バイトに <code>&lt;meta charset&gt;</code>
があればその結果を返せますが、それがなければ最後まで読む必要があるかもしれません。
極端な場合、長く <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ASCII文字</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:">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>を実行して、
後から<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="471" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[471]</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><sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>文字として符号化された文字やバイト</anchor> </sw-see></p></section></section><section><h1>ファイル形式の判定</h1><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:">文字コード</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:">ファイル形式</anchor>等に決定方法の規定があれば、それに従うことになります。</p><p><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> 
そうでなくても内容がある程度限定される場合は、それを前提とした検出手法を採用できます。</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="472" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[472]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">WebVTT</anchor> なら <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTF-8</anchor> と確定できます。</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="473" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[473]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ZIPファイル</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ファイル名</anchor>なら、歴史的に <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ZIPファイル</anchor>で利用された事例がある<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>体系のいずれかに絞り込めます。</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="474" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[474]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTML</anchor> なら、 <cite>HTML Standard</cite> で <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">encoding sniffing algorithm</anchor>
として決定手順が定められています。</p></example><hr></hr><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:">ファイル形式</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>sniffing</anchor> </sw-see></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="390" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[390]</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="346" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;346</anchor-internal></p><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>で<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="105" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[105]</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:">encoding sniffing algorithm</anchor> を参照。</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:">charset sniffing</anchor> も参照。</p></section><section><h1>利用者や応用からの明示的な指定</h1><p><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:">利用者</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> </sw-see></p><p><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:">セキュリティー</anchor>等の理由で好ましくないとされる場合もあります。</p><hr></hr><p><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:">CLI</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>の実行者が明示的に指定する手段が提供されることがあります。</p><p><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> 
こうした方法の指定が最優先されるべきか、他の指定を優先するべきかは、時と場合によります。
<cite>XHR</cite> の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">override charset</anchor> が <sw-cn xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">BOM</sw-cn> よりは優先されないなど、
他の指定が優先されることもあります。</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="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>によって確定的な<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:">WebVTT</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:">テキストファイル</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></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:">HTTPヘッダー</anchor>
や
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">MIMEヘッダー</anchor>の 
<code>Content-Type:</code> 
に指定された
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">MIME型</anchor>が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>を表す
<code>charset</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="119" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[119]</anchor-end> 
その指定方法や解釈方法には<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">MIME型</anchor>ごとに少しずつ違いがあるので注意も必要です。
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>charset</anchor> </sw-see></p><p><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:">Web</anchor> では <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">MIME型</anchor>による規定の違いは必ずしも尊重されず、ほぼ一律に
(<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">MIME charset</anchor> ではなく) <cite>Encoding Standard</cite> の<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>encoding sniffing algorithm</anchor>, <anchor>x-user-defined</anchor> </sw-see></p><p><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:">MIME</anchor> や <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP</anchor> は <code>charset</code> の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">既定値</anchor>を <code>US-ASCII</code> や 
<code>ISO-8859-1</code> とする規定を持っていましたが、
実情とまったく一致しておらず完全に無視されてきた歴史を持ちます。
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>charset</anchor> </sw-see>
<code>charset</code> の不存在を <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP</anchor> や <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">MIME</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="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:">HTTPサーバー</anchor>は <code>ISO-8859-1</code> や <code>UTF-8</code> やその他各地域の一般的な<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>を機械的に
<code>charset</code> として指定することがあります。
こうした機械的な指定は実態と乖離していることがしばしばあります。
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>Webブラウザーによる文字コード判定の失敗事例集</anchor> </sw-see></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>による意図的な指定を区別するのは困難であり、
原則的には盲信することとなりますから、
<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="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:">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:">query parameter</anchor>
や<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">フォームデータ</anchor>に
<code>_charset_</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="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:">Webアプリケーション</anchor>は
<code>ie</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="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:">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:">CGIスクリプト</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="559" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[559]</anchor-end> 
例えば:
<code>&lt;meta charset=&quot;&quot;&gt;</code>,
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><code xmlns="http://www.w3.org/1999/xhtml">encoding</code>宣言</anchor>,
<code>-*- coding -*-</code>
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>charset sniffing</anchor> </sw-see></p><section><h1>フォント指定からの推定</h1><p><sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>文字として符号化された文字やバイト</anchor> </sw-see></p></section></section><section><h1>指定の読み替え</h1><p><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:">文字コードの指定</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="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:">HTML</anchor> の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">prescan</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:">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:">UTF-8</anchor>
に読み替えることになっています。
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>prescan</anchor>, <anchor>UTF-16</anchor>, <anchor>符号化ラベル</anchor> </sw-see></p><p><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:">x-user-defined</anchor> は歴史的理由により <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Windows-1252</anchor>
に読み替えられることがあります。
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>x-user-defined</anchor>, <anchor>prescan</anchor> </sw-see></p><p><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:">キリル文字の文字コード</anchor>は、歴史的理由により、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">蒙古語</anchor>を表すことが確実な場合
(例えば <code>.mn</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-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="187" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;187</anchor-internal>)。</p><p><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:">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>が、
歴史的理由によって統合されている場合が多々あります。</p><p><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>名でも<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">インターネットメール</anchor>と <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Web</anchor>
とで異なる歴史的経過を辿っており、異なる読み替えが必要となる場合もあります。</p></section><section><h1>環境からの継承</h1><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> 
<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:">CSS</anchor> や <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">JavaScript</anchor> 
の参照のように、「外側」からの指定が「内側」で使えることがあります。
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>環境符号化</anchor> </sw-see></p></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:">HTML</anchor> では <code>&lt;meta charset&gt;</code> が、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">XML</anchor> では <code><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&lt;?xml</anchor> <snip xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"></snip> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">encoding=&quot;&quot;</anchor></code> が、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CSS</anchor> では <code>@charset</code>
が<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>encoding sniffing algorithm</anchor> </sw-see>
他の<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="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:">テキストエディター</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:"> <code xmlns="http://www.w3.org/1999/xhtml">-*- coding -*-</code>, <code xmlns="http://www.w3.org/1999/xhtml">vim:</code>, <anchor>局所変数群リスト</anchor>, <anchor>テキストファイルの先頭</anchor> </sw-see></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:">WebVTT</anchor> の <code>WEBVTT</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>に検知できれば、
<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="244" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[244]</anchor-end> 
<cite xml:lang="ja">cmsd_doc_reference.pdf</cite>, <time>2015-08-28T09:04:15.000Z</time>, <time>2025-11-23T04:24:09.319Z</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://cms.al-design.jp/downloads/EUC-JP/cmsd_doc_reference.pdf#page=69">https://cms.al-design.jp/downloads/EUC-JP/cmsd_doc_reference.pdf#page=69</anchor-external></p><blockquote><sw-left xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><pre xmlns="http://www.w3.org/1999/xhtml">&lt;?php require( &quot;cmsdesigner/include/view.php.inc&quot; ); // encoding=&quot;euc-jp&quot; ?&gt;</pre></sw-left></blockquote><blockquote><sw-left xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><p xmlns="http://www.w3.org/1999/xhtml">は、定型文として入れてください。(「// encoding=&quot;euc-jp&quot;」は Dreamweaver の文字化け(不具<sw-br xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"></sw-br>
合?)回避の為のおまじないです。)</p></sw-left></blockquote><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="245" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[245]</anchor-end> <code xmlns="http://www.w3.org/1999/xhtml">encoding=&quot;&quot;</code> の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">sniffing</anchor> を応用した <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">hack</anchor> か?</comment-p></section><section><h1>バイト列等からの推定</h1><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> 
<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="126" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[126]</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="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>や古い <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Webサイト</anchor>など、これ以外に信頼できる方法がないことも多いです。</p><p><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:">HTML</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> </sw-see></p><p><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> 
<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:">ASCII</anchor>
でも <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ISO-8859-1</anchor> でも <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Windows-1252</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:">EUC-JP</anchor>
でもどの回答でも正解になりますが、
その後の処理を考慮すると判定不能と判断することが望ましい場合があります。
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>頻度解析等の手法</anchor> </sw-see></p><p><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 xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTML文書</anchor>では、
<code>&lt;font face&gt;</code> 
を判定の補助情報に使う必要があります。
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>頻度解析等の手法</anchor> </sw-see></p><p><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> 
<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><h1>判定器を意識した著者による記述</h1><p><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>を含めたり、
当該<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="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>が未発達だった<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">平成時代</anchor>初期の
<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>など乱立が著しかった地域に多く見られます。</p><p><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:">Shift_JIS</anchor> と <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">EUC-JP</anchor>
の区別のため、
<n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0xFDFE</n>,
<code>美乳</code>,
<sw-ch xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">龠</sw-ch>
などが使われました。
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>文字コード判定器を意識した著者による記述</anchor> </sw-see></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:">日本</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">平成時代</anchor>前半の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Webアプリケーション</anchor> (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CGIスクリプト</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>と確実に認識されるよう、 
<code>&lt;input type=hidden&gt;</code>
で固定の文字列を用意しておき、
判定の材料とする手法がしばしば使われました。</p></section><section><h1>判定器が必要な場面</h1><figure class="middle list"><figcaption><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></figcaption><ul><li><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">encoding sniffing algorithm</anchor></li><li><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">テキストファイル</anchor>の表示<ul><li><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">テキストエディター</anchor>の「開く」処理</li></ul></li><li><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ZIPファイル</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ファイル名</anchor></li><li><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RFC 822メッセージ</anchor> (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">MIME</anchor> 以前) </li><li><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">query parameter</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><code>mailto:</code></li><li><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CSV</anchor></li><li><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IRC</anchor></li><li><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SRT</anchor></li><li><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ID3</anchor></li><li><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">T<sub xmlns="http://www.w3.org/1999/xhtml">E</sub>X</anchor></li><li><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">QRコード</anchor></li></ul></figure><ul><li><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> 
<cite>Googleの検索結果サマリーが半角カタカナだらけ</cite>, <time>2020-08-20T23:48:51.000Z</time>, <time>2025-11-23T05:54:04.480Z</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.shtml.jp/mojibake/google_hankaku.html">https://www.shtml.jp/mojibake/google_hankaku.html</anchor-external><ul><li><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>Googleの検索サマリーが「\」やフランス語のアクセント記号だらけ</cite>, <time>2020-08-20T23:48:52.000Z</time>, <time>2025-11-23T05:55:00.048Z</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.shtml.jp/mojibake/google_yen.html">https://www.shtml.jp/mojibake/google_yen.html</anchor-external></li><li><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> 
<cite>「痴」「稚」が一杯。英語サイトを作ったら文字化け</cite>, <time>2020-08-20T23:48:46.000Z</time>, <time>2025-11-23T05:55:24.455Z</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.shtml.jp/mojibake/english.html">https://www.shtml.jp/mojibake/english.html</anchor-external></li></ul></li></ul><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> 
<cite xml:lang="en">1551276 - (chardetng) Autodetect legacy encoding on unlabeled pages</cite>, <time>2025-11-23T02:33:03.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://bugzilla.mozilla.org/show_bug.cgi?id=1551276">https://bugzilla.mozilla.org/show_bug.cgi?id=1551276</anchor-external></p><p><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> 
<cite xml:lang="en">Security: ASCII can be autodetected as ISO-2022-JP <strong>[</strong>40089450<strong>]</strong> - Chromium</cite>, <time>2025-11-23T03:27: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://issues.chromium.org/issues/40089450">https://issues.chromium.org/issues/40089450</anchor-external></p><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-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="241" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;241</anchor-internal> <cite>Firefox</cite> の開発者が <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:">セキュリティー</anchor>上の問題だと主張し、
<cite>Chrome</cite> に判定から除外させた回。ところが <cite>Firefox</cite> 
は今でも <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ISO-2022-JP</anchor> と判定している。 <time>2025-11-23T03:29:38.400Z</time></p></section></section><section><h1>決定に使う入力バイト列の長さと範囲</h1><p><sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>資源ヘッダー</anchor>, <anchor>sniffing</anchor>, <anchor>encoding sniffing algorithm</anchor> </sw-see></p></section></section><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:">URL</anchor> の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TLD</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="86" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[86]</anchor-end> 
利用し得る情報の例:</p><ul><li><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> <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="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:">URL</anchor></li><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> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">リンク元</anchor>の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">URL</anchor></li><li><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></li><li><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> <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></li><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:">バイト列</anchor>に付随するメタ情報<ul><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:">URL</anchor> (c.f. <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="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></li><li><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:">Internet Archive</anchor> の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">URL</anchor>
に含まれる原 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">URL</anchor></li><li><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> <code>From:</code> の<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="166" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[166]</anchor-end> <code>Newsgroups:</code> の<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="167" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[167]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IRCサーバー</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="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:">IRC</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="140" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[140]</anchor-end> <code>Content-Location:</code></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> <code>Content-Language:</code></li><li><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> <code>Content-Disposition:</code> の <code>filename</code></li><li><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:">ファイル</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="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:">書庫ファイル</anchor>の格納<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ファイル</anchor>の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">OS</anchor> 情報</li><li><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>の格納<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="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>の情報<ul><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:">書庫ファイル</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="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:">RFC 822メッセージ</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></li><li><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>の情報<ul><li><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:">実体</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="190" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[190]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">実体</anchor>の <code>Content-Language:</code></li><li><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> <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></li></ul></li><li><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> 利用環境に関する情報<ul><li><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:">Webブラウザー</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="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>設定<ul><li><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:">POSIXロケール</anchor></li><li><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:">ANSIコードページ</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">OEMコードページ</anchor></li></ul></li></ul></li></ul><p><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:">URL</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="143" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[143]</anchor-end> <code>file:</code> かどうか</li><li><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:">TLD</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:">URL</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="149" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[149]</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="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>を表す<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="169" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[169]</anchor-end> 
利用方法:</p><ul><li><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>の優先表示選択肢の絞り込み</li><li><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>の候補の絞り込みや重みの割当</li><li><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> 他のどの方法でも決定できないときの既定値の選択</li></ul><hr></hr><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> 
<cite xml:lang="en">845791 - Gather telemetry about the necessity of the Russian and Ukrainian encoding detectors</cite>, <time>2025-11-23T02:17:27.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://bugzilla.mozilla.org/show_bug.cgi?id=845791">https://bugzilla.mozilla.org/show_bug.cgi?id=845791</anchor-external></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-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="236" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;236</anchor-internal> <cite>Firefox</cite> が<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>TLD の利用</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>だけでは似た構造の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コードの判定</anchor>に失敗することが少なくないので、
他の情報を補助的に使うことが試みられています。 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TLD</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> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ccTLD</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><sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>TLDによる文字コード判定の補助</anchor> </sw-see></p><p><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> 
ただ、この情報は飽くまでも補助に過ぎません。</p><ul><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:">IPアドレス</anchor>によるアクセスでは <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TLD</anchor> を使えません。<ul><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:">IPアドレス</anchor>の割当国データベースに基づく推定も可能ではありますが、
実行コストの高い演算なので、判定ヒントを得るためにしては費用対効果に見合うか疑問です。</li></ul></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:">gTLD</anchor> では <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ccTLD</anchor> による推定を使えません。<ul><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:">ccTLD</anchor> 以外の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TLD</anchor> は全世界的によく使われています。</li></ul></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:">ccTLD</anchor> でも国外で多く使われている事例がいくつもあります。<ul><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> 例えば <code>.tv</code> は国外のテレビ業界で使われがちです。</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:">ccTLD</anchor> を使う手法はこうした用途が多い <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ccTLD</anchor> を除外しています。
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>TLDによる文字コード判定の補助</anchor> </sw-see><ul><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> しかし完璧ではなく、国外利用が多くても除外されていないことがあります。</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:">ccTLD</anchor> に基づくヒントを供給できなくなる弊害があります。</li></ul></li></ul></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:">ccTLD</anchor> のヒントが機能しにくいことがあります。</li></ul><p><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:">TLD</anchor> は若干の傾斜を与えたり、最終的に判断がつかなかったときの既定値を決めたりするのに使うのがいいのでしょう。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TLD</anchor> に基づき候補を絞り込んでそれ以外を除外したりするのは避けておくのが無難です。</p><p><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> 
逆に言うなら、</p><ul><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> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TLD</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:">利用者</anchor>が上書きする手段を用意すること、</li></ul><p>の<strong>両方</strong>が必須です。</p><ul><li><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> 
<cite xml:lang="en">977540 - Don't apply detectors to foreign domains</cite>, <time>2025-11-23T03:42: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://bugzilla.mozilla.org/show_bug.cgi?id=977540">https://bugzilla.mozilla.org/show_bug.cgi?id=977540</anchor-external></li><li><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 xml:lang="en">1543077 - Japanese auto-detect no longer work on some generic (i.e. language neutral) TLDs</cite>, <time>2025-11-23T02:20:01.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://bugzilla.mozilla.org/show_bug.cgi?id=1543077">https://bugzilla.mozilla.org/show_bug.cgi?id=1543077</anchor-external></li></ul><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-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="237" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;237</anchor-internal> <cite>Firefox</cite> が
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">gTLD</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="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:">HTTP</anchor> <code>charset</code> や <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTML</anchor> <code>&lt;meta charset&gt;</code> などで指定された<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字符号化</anchor>は、
<code>.mn</code> の場合、次のように置換するべきです。
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>ロケール等による文字コード判定の補助</anchor> </sw-see></p><ul><li><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:">IBM866</anchor> → <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">x-MNS4329</anchor></li><li><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> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">windows-1251</anchor> → <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">x-MNS4330</anchor></li><li><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> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">x-mac-cyrillic</anchor> → <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">x-MNS4331</anchor></li></ul></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>の<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="195" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[195]</anchor-end> <cite>ced</cite> は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">利用者インターフェイス</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">言語情報</anchor>があればヒントとして使うことがあります。
<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="43" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;43</anchor-internal></src></p><p><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> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">subtitle</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> </sw-see></p><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> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ZIPファイル</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コードの判定</anchor>の補助または既定値の決定に
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">POSIXロケール</anchor>が使われることがあります。
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>ZIPファイルの文字コード</anchor> </sw-see></p><refs xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><ul xmlns="http://www.w3.org/1999/xhtml"><li><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> 
<cite xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">compact_enc_det</anchor>/compact_enc_det/compact_enc_det.cc at master · google/compact_enc_det · GitHub</cite>, <time>2025-05-19T15:36:17.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/google/compact_enc_det/blob/master/compact_enc_det/compact_enc_det.cc#L2059">https://github.com/google/compact_enc_det/blob/master/compact_enc_det/compact_enc_det.cc#L2059</anchor-external></li></ul></refs><hr></hr><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:">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:">navigate</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>依存となっています。
<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="177" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;177</anchor-internal></src></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:">利用者</anchor>指定の既定の文字符号化とすると定められています。
<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="177" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;177</anchor-internal></src>
現実的には<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="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:">UTF-8</anchor>
を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">既定値</anchor>とするのが<rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">よい<rt xmlns="http://www.w3.org/1999/xhtml">suggested</rt></rubyb>とされます。
例えば新しい<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ネットワーク</anchor>の専用の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">利用者エージェント</anchor>ではそうできると述べられています。
<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="177" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;177</anchor-internal></src></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="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:">HTTPS</anchor> や <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP/2</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:">HTTP</anchor> <code xmlns="http://www.w3.org/1999/xhtml">charset</code> の指定を徹底させる方向性の方が楽そうで。</comment-p><p><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:">利用者</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:">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>に<rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">典型的には依存<rt xmlns="http://www.w3.org/1999/xhtml">typically dependent</rt></rubyb>して既定値が定まるとされます。
<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="177" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;177</anchor-internal></src>
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>利用者の言語</anchor>, <anchor>ロケール依存の既定の文字コード</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="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:">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:">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:">Webサイト</anchor>をより良く救済できる可能性が高い値を選ぶのが良いと考えられます。</comment-p><refs xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><ul xmlns="http://www.w3.org/1999/xhtml"><li><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> 
<cite xml:lang="en-US-x-hixie">HTML Standard</cite>, <time>2025-11-04T10:59:41.000Z</time>, <time>2025-11-09T05:55:50.836Z</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://html.spec.whatwg.org/#determining-the-character-encoding">https://html.spec.whatwg.org/#determining-the-character-encoding</anchor-external></li></ul></refs><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> <cite xml:lang="en">Encoding detector causing compat issues <strong>[</strong>41301730<strong>]</strong> - Chromium</cite>, <time>2025-11-23T02:10: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://issues.chromium.org/issues/41301730">https://issues.chromium.org/issues/41301730</anchor-external></p><blockquote><p>I'm not sure when exactly Chromium diverged from WebKit, but the status prior to M55 (for several years) is that Chromium, by default, did no sniffing whatsoever and just used a system locale default.  Secondly, if the user ever clicked &quot;Autodetect&quot; in the encoding menu, this acted as a permanent setting, and in that case ICU autodetector would run on 100% of page loads, overriding all headers, and supporting the entire set of ICU encodings.</p><p>Starting at M55, we removed all menus and all influence of system locale, and started to run CED autodetector by default but only affecting pages without headers.</p><p>To my knowledge, Chromium has never shipped a Japanese-specific sniffing configuration.</p></blockquote></section><section><h1>その他の試み</h1><ul><li><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> <cite xml:lang="en-US">Encode::Detect::Upload - Attempt to guess user's locale encoding from IP, HTTP_ACCEPT_LANGUAGE and HTTP_USER_AGENT - metacpan.org</cite>, <time>2025-06-16T10:29:46.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://metacpan.org/pod/Encode::Detect::Upload">https://metacpan.org/pod/Encode::Detect::Upload</anchor-external></li></ul><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> <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="68" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;68</anchor-internal> <code>Accept-Language:</code>, <code>User-Agent:</code> (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">OS</anchor>), 
アクセス者の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IPアドレス</anchor>を使って<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字符号化</anchor>を推定する。
平成25年。</p></section></section><section><h1>符号構造や出現頻度などによる総合的な推測</h1><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> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コードの指定</anchor>の構文が存在しない <weak xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">(または利用されていない)</weak> 
<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="377" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[377]</anchor-end> 
この推定は、どうしても不確実性が伴います。様々な手法が開発され、
それらを組み合わせることで精度が高められてはいますが、
いずれの手法も絶対的とは言えません。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="378" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[378]</anchor-end> 
この種の技法は3通りに大別できます。</p><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="379" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[379]</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="380" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[380]</anchor-end> 典型的バイト列による推測</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="381" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[381]</anchor-end> 統計的手法による推測</li></ul><p>この3種は必ずしもきっちりと分類できるものではなく、
境界的技法もありますし、実装上は組合せて実現されることもあります。</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="382" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[382]</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>は条件分岐のような形で単独で判定することもできますし、
統計的手法による期待出現頻度 0 と記述して計算することもできます。
どのように実現するかは実装戦略上の判断になります。</p></example><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="383" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[383]</anchor-end> 
各技法の詳細はこの後の各節を参照。</p><hr></hr><p><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:">西暦1990年代</anchor>) には <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="5" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[5]</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="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:">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:">利用者</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="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:">Web</anchor> では <code>charset</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> への統合が進んだことで、
<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="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:">イントラネット</anchor>、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ZIPファイル</anchor>、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CSV</anchor>、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">subtitle</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><h1>対象とする符号</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="384" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[384]</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="385" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[385]</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="386" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[386]</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="387" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[387]</anchor-end> 
従って判定器の実装者は適用対象の分野をよく分析し、
必要な<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>Webにおける文字コード</anchor>, <anchor>ファイル名の文字コード</anchor> </sw-see></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="423" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[423]</anchor-end> 
便利な工具として使える独立した判定器なら、多少処理に時間がかかっても、
あらゆる候補を徹底的に分析して回答を出すことに意味があるかもしれません。</p><p xmlns="http://www.w3.org/1999/xhtml"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="424" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[424]</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>は数多くの処理の一部に過ぎませんから、
時間をかけるより高速に動作することが、
多くの検証用データを保持するより小さな実装であることが求められます。</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="425" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[425]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ZIPファイル</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-16</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:">符号</anchor>を最初から候補から除外しておく方が何かと良さそうです。</p></example><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="388" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[388]</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:">UTF-7</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:">UTF-7</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>の側に汚名が着せられるケースもあり、
ケースバイケースの判断が必要です。
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>文字のセキュリティー</anchor>, <anchor>Webセキュリティー</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="389" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[389]</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>が必要とされたときに機能制限モードに切り替えるとか、
対策の仕方もケースバイケースです。</comment-p></section><section><h1>符号構造に基づく判別</h1><p><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:">文字コードの判定</anchor>の基礎的な技法の1つが<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="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>かそうでないかという構造的知識を主に使っていました。
しかしこの方法単独では<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="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:">シフトJIS</anchor>と<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">日本語EUC</anchor>は第1バイトに使われる<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>、
第2バイトに使われる<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 xmlns="http://www.w3.org/1999/xhtml"><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> 
また、<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つにもなっていました。</p></example><hr></hr><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>の判定では<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="336" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[336]</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="339" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[339]</anchor-end> 
特に
<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:">gb18030</anchor> (= <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">EUC-CN</anchor>),
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">EUC-KR</anchor> (= <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UHC</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:">CS1</anchor>
が同一の構造となっています。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="337" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[337]</anchor-end> 
また、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">EUC-JP</anchor> の2バイト文字の少なくない数が、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Shift_JIS</anchor>
の1バイト文字 (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">半角カナ</anchor>) 2つ分に当たります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="338" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[338]</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="340" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[340]</anchor-end> 
狭義の構造だけで判断できなくても、
空き領域で判断できることがあります。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">2バイト符号</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="341" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[341]</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="335" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[335]</anchor-end> 
1バイトの<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>の判定では、
<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="342" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[342]</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><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="343" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[343]</anchor-end> 
1バイトの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">8ビット符号</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:">多バイト符号</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>等で利用されることがあるものの、
<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>以外を除外する条件として使えます。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="344" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[344]</anchor-end> 
<n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x7F</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>の1バイト目にも2バイト目にもまず出現しないので、
どう扱ってもかわりありません。</p><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="345" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[345]</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:">空白</anchor>等
([ <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x09</n>, <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x0D</n> ], <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x1A</n>)
と
<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> 
(<n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x1B</n>, <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x0E</n>, <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x0F</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="347" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[347]</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:">文字コードの判定</anchor>にはほとんど関与しません。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="348" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[348]</anchor-end> 
ただし、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">VISCII</anchor>
等では<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">図形文字</anchor>を割り当てていること、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">OEMコードページ</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="346" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[346]</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:">VISCII</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>と判断できます。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="349" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[349]</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><hr></hr><p><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>を順番に試してエラーにならなかったものを採用するという<em>だけ</em>の実装を
「文字コードの判定」だと称しているものがたまにあります。
このような方法は<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:">8ビット符号</anchor>の区別が不可能です。</p><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:">Shift_JIS</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>では古くからよく知られています。</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="79" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[79]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号構造</anchor>が限定される場合なら、その限定される特徴で判定したほうが高速かつ確実なことが多いので、
この手法が役に立つことはほぼないといっていいでしょう。</comment-p><section><h1>UTF-8</h1><p><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>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTF-8</anchor> はかなり確実に判定できることが知られています。
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>頻度解析等の手法</anchor> </sw-see></p><p><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> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTF-8</anchor> の2バイト以上の<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:">UTF-8</anchor> と判定してほぼ間違いありません。</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:">8ビット符号</anchor>の領域を使っている以上誤判定の可能性が皆無ではありません。</p><p><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> 
<cite>ced</cite> は4種類の2バイト列を <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:">windows-1252</anchor>
に加重する例外条件を持っています。 <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="286" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;286</anchor-internal></src></p><refs xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><ul xmlns="http://www.w3.org/1999/xhtml"><li><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> 
<cite xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">compact_enc_det</anchor>/compact_enc_det/compact_enc_det.cc at master · google/compact_enc_det · GitHub</cite>, <time>2025-11-24T08:13:14.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/google/compact_enc_det/blob/master/compact_enc_det/compact_enc_det.cc#L83">https://github.com/google/compact_enc_det/blob/master/compact_enc_det/compact_enc_det.cc#L83</anchor-external></li></ul></refs></section><section><h1><sw-cn xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">BOM</sw-cn></h1><p><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> 
<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>により <sw-cn xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">BOM</sw-cn> の存在がかなり重視されています。
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>encoding sniffing algorithm</anchor> </sw-see></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> 
<sw-cn xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">BOM</sw-cn> に対応した仕様や実装でも、どの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字符号化</anchor>の <sw-cn xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">BOM</sw-cn> を検知するかはかなりブレがあります。
現在の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Web</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-8</anchor> に限定しています。
過去の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Web</anchor> や <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Web</anchor> 以外の実装はそれ以外にもいろいろなものに対応していたり、
いなかったりします。</p><p><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> 
<sw-cn xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">BOM</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>片では
<sw-cn xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">BOM</sw-cn> が認められていない場合が一般的であり、その場合たとえ <sw-cn xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">BOM</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>の判定には使えません。</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="133" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[133]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ZIPファイル</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-cn xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">BOM</sw-cn>
検査を行いません。</p></example></section><section><h1>ISO/IEC 2022 指示シーケンス</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="355" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[355]</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="356" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[356]</anchor-end> 
ただし実務上いくつか注意が必要です。</p><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="357" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[357]</anchor-end> <sw-cn xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ESC</sw-cn> が含まれていることだけで <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:">CSI</anchor> のために使っているもの、
<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="358" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[358]</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:">ISO-2022-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>を決定的根拠とできますが、
後者は追加の情報がないと確定できません。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="359" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[359]</anchor-end> 
具体的には次のような<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="360" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[360]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">IE</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:">シフトJIS</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>など
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>ISO-2022-JP</anchor> </sw-see></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="361" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[361]</anchor-end> 
<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:">8ビット符号</anchor>としてまたは <sw-cn xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SI</sw-cn>/<sw-cn xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SO</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="362" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[362]</anchor-end> 
<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:">シフトJIS</anchor>に <sw-cn xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ESC</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="363" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[363]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">汎用機</anchor>等で使う <sw-cn xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ESC</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:">JIS X 0201</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="364" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[364]</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:">ISO-2022-KR</anchor></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="365" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[365]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ANSIエスケープシーケンス</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></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="366" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[366]</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:">Fp</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>
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>指示シーケンス</anchor>, <anchor>Fp</anchor> </sw-see>
は、
それが何を表すのか判定が必要になる場合があります。<ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="367" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[367]</anchor-end> 公開データとして流通しているものは <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Mule</anchor> 系の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Fp</anchor>
の場合が多いようですが、それ以外もあり、一部は衝突しているので要注意です。</li></ul></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="368" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[368]</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:">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>が利用されているか検査が必要となります。<ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="369" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[369]</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:">ISO-2022-JP-2</anchor>
と
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ISO-2022-JP-3</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></li></ul></section><section><h1>日本語文字コードの識別用符号列</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="370" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[370]</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:">シフトJIS</anchor>と<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">日本語EUC</anchor>の区別のために特徴的な文字列を挿入する手法が開発されてきました
(<anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="135" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;135</anchor-internal>)。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="371" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[371]</anchor-end> 
こうした手法は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Shift_JIS</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>が候補となるとき、必ずしも十分な根拠にならないこともあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="372" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[372]</anchor-end> 
しかしせっかく<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">著者</anchor>が提供してくれているヒントを判定器が無視するのももったいないのであり、
<sw-cn xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">BOM</sw-cn> や<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">指示シーケンス</anchor>ほどの確実性は無いとしても、
それに準じた重要情報として利用することが期待されます。</p></section><section><h1>gb18030 の特徴的な符号列</h1><p><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:">gb18030</anchor> の4バイト符号は、第1バイトと第3バイトに<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">右</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>が使われ、
第2バイトと第3バイトは <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>で<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ASCII数字</anchor>を第2バイトに使うのは <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">gb18030</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:">gb18030</anchor>
と判定する有力な根拠として使うことができます。</p></section><section><h1>判定条件からの逸脱の扱い</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="350" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[350]</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="351" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[351]</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="341" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;341</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="352" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[352]</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="353" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[353]</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="354" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[354]</anchor-end> 
正常データのほとんどすべてを正しく判定できつつ、
異常データもできればなるべく作成者の想定に近いものと判定できることが好ましいと考えられますが、
具体的にどのような状態を良しとし、
どのようにそれを実現するか、は判定器の適用分野と実装戦略次第になります。</p></section></section><section><h1>典型的バイト列による推測</h1><p><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> 
<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="250" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[250]</anchor-end> 
どれくらい決定的な根拠にできるかはケースバイケースで、
他の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号</anchor>との区別や「ありがち」な度合いによって調整が必要となります。</p><section><h1>8ビット符号の特徴的な符号列</h1><p><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:">Webページ</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>を持っています。
<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>で、
<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>か、<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="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:">windows-1252</anchor> やいくつかの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>体系で <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0xA9</n> に <sw-ch xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">©</sw-ch>
があります。 <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="265" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;265</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="269" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[269]</anchor-end> 
<n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0xA9</n> は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Shift_JIS</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> に当たります。
幸い <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>が来ることがほとんどで、 <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="265" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;265</anchor-internal> 
のようなパターンで出現することはまずありません。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Shift_JIS</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>では第1バイトに使われることがありますし、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Shift_JIS</anchor> でも第2バイトには使われることがあります。
前後が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">空白</anchor>, という条件が重要になります。
多くの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">多バイト符号</anchor>だと第2バイトに <sw-ch xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&lt;</sw-ch> や <sw-ch xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;</sw-ch> が来ることもないので、
<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:">windows-1252</anchor> やいくつかの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>体系で <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0xAE</n> に 
<sw-ch xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">®</sw-ch> があります。
<n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x99</n>
に
<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="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> <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0xAE</n> 
が1つだけ出現して<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">空白</anchor>が来ることはほとんどないので、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Shift_JIS</anchor> ではない可能性が高いと判断できます。</p><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> 
しかし <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0xAE</n> や <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x99</n> は<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>の後に <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0xAE</n> や <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x99</n>
が来るケースでは注意が必要です。</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="321" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[321]</anchor-end> 
<cite>ced</cite> は 「NESTLÉ®」 を <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:">windows-1252</anchor> 
の実例として挙げています。この例のように <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Shift_JIS</anchor> 等の他に
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTF-8</anchor> としても正当なバイト列になり得ることがあるので注意が必要です。</p></example><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:">非ASCII文字</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>だけが<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>をはじめ、世界的によく見られます。
そうした場合にこれを <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Windows-1252</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="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:">言語</anchor>モデルによる判定は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">letter</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>してしまうことがあります。</comment-p><p><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> <cite>chardetng</cite> などがこうしたものを
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">windows-1252</anchor> と判定する条件を組み込んでいます。
<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="289" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;289</anchor-internal></src></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="290" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[290]</anchor-end> ただし <cite xmlns="http://www.w3.org/1999/xhtml">chardetng</cite> はそれでも 
<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:">ISO-8859-2</anchor> と誤認しがちです。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ISO-8859-2</anchor> との区別についてはわざわざ注釈で言及があります <src><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="289" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;289</anchor-internal></src>
ので、意識して設計されているはずですが、それでも取り扱いが難しいということなのでしょう。</comment-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="330" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[330]</anchor-end> 
<anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="329" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;329</anchor-internal>
は
「Copyright ©1997,」
の <sw-ch xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">©</sw-ch> 1文字 (<n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0xA9</n>)
だけが<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">非ASCII文字</anchor>です。
<cite>ced</cite> は正しく判定しますが、
<cite>chardetng</cite> は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ISO-8859-2</anchor> と誤認します。</p><refs><ul xmlns="http://www.w3.org/1999/xhtml"><li><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> 
<cite>Open Society-Georgia Foundation (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">OSGF</anchor>)</cite>, <time>2025-11-30T03:20: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://web.archive.org/web/19981202173516id_/http://www.osgf.ge/">https://web.archive.org/web/19981202173516id_/http://www.osgf.ge/</anchor-external></li></ul></refs></example><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="580" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[580]</anchor-end> 
<cite>chardetng</cite> はこの他にも<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>
に関係するいくつかのパターンで特殊処理を持っています。
<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="289" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;289</anchor-internal></src></p><refs xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><ul xmlns="http://www.w3.org/1999/xhtml"><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> 
<cite xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">chardetng</anchor>/src/lib.rs at main · hsivonen/chardetng · GitHub</cite>, <time>2025-11-24T08:19:16.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/hsivonen/chardetng/blob/main/src/lib.rs#L58">https://github.com/hsivonen/chardetng/blob/main/src/lib.rs#L58</anchor-external></li><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> 
<cite xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">chardetng</anchor>/src/lib.rs at main · hsivonen/chardetng · GitHub</cite>, <time>2025-11-24T08:34:54.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/hsivonen/chardetng/blob/main/src/lib.rs#L450">https://github.com/hsivonen/chardetng/blob/main/src/lib.rs#L450</anchor-external></li></ul></refs></section><section><h1>価格</h1><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:">windows-1252</anchor> などいくつかの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">コードページ</anchor>の <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x80</n> は <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>の後に<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><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>モデルによる判定は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">letter</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="324" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[324]</anchor-end> 
<n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x80</n> は主要な<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">多バイト符号</anchor>の第1バイトには使われないので、
空白の後などで重要なヒントとして使えます。
しかし第2バイトに使われることはあるので、注意が必要です。</p><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> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">windows-1252</anchor> の <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0xA4</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>の第1バイトや第2バイトや、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Shift_JIS</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="326" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[326]</anchor-end> 
多くの <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">OEMコードページ</anchor>は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">罫線素片</anchor>等の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CUI</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="327" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[327]</anchor-end> 
こうした文字が1つだけ孤立して出現することはまずないので、
負のヒントとして使うことができます。</p><p><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:">罫線素片</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="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:">OEMコードページ</anchor>が使われることが多い
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ZIPファイル</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></section><section><h1>仮名</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="510" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[510]</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="511" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[511]</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="512" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[512]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Shift_JIS</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:">EUC</anchor>
との区別に非常に便利な特徴です。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">日本</anchor>では古くから使われてきました。
近年でも <cite>chardetng</cite> が利用しています <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="252" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;252</anchor-internal></src>。</p></section><section><h1>ハングル</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="513" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[513]</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="514" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[514]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">EUC-KR</anchor> と <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">gb18030</anchor> や <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">EUC-JP</anchor> は基本構造が共通しているので、
一見すると区別がつかなそうですが、いくつか特徴があります。</p><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="515" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[515]</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="516" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[516]</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="510" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;510</anchor-internal>)。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="517" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[517]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">EUC-KR</anchor> の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">KS X 1001</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>の領域ばかりの出現でも区別できると
<cite>chardetng</cite> は述べています。 <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="252" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;252</anchor-internal></src></li></ul></section><section><h1>EUC-JP の特徴的な符号列</h1><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 xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">EUC-JP</anchor> の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CS3</anchor> は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">JIS X 0212</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>の列の中に孤立して1つだけ混じることが多そうです。
2つ以上続くこともあるでしょうが、1つだけのことが多そうです。</p><p><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:">ASCII文字</anchor>に囲まれた <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x8F</n> (<sw-cn xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SS3</sw-cn>) と <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">GR</anchor> 
のバイト2つで構成される3バイトの列は、 <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="271" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;271</anchor-internal> の文字である可能性が高そうです。
各種の<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:">EUC-JP</anchor>
と判定する有力な根拠として使うことができます。</p><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:">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>のためのライブラリーのテストデータに含まれていることもあるのですが、
テスト用に変換して人工的に作った例文と思われます。</p><p><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> 
よってあまり優先度は高くありませんが、簡単に対応できるならしておいても良いかなという感じでしょうか。</p></section><section><h1>UTF-16 や UTF-32</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="373" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[373]</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:">ASCII文字</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:">ASCII文字</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> ]
に配置されているので、
<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-32</anchor>
では <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x00</n> が規則的かつ大量に出現することになります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="374" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[374]</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:">UTF-16</anchor> / <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTF-32</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:">BOM</sw-cn> がなくても 
<n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x00</n>
の数を数えることで高確度で判定できます。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="375" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[375]</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:">文字</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-32</anchor> か <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ASCII</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="376" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[376]</anchor-end> しかしあまり需要が無いので、研究も実装もそれほどなされていないようです。</comment-p></section><section><h1>改行</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="636" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[636]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Mac OS符号化</anchor>であることの徴証の1つとして「<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">改行</anchor>が <sw-cn xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CR</sw-cn> であること」が使える可能性がありますが、この性質を実用している判定器は見当たりません。実世界データでの検証の報告もなく、実効性は不明です。</p><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="645" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[645]</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="637" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[637]</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>として <sw-cn xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CR</sw-cn>, <sw-cn xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">LF</sw-cn>, <sw-cn xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CRLF</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>の判別が必要になることはそれほど多くありません。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="638" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[638]</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="639" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[639]</anchor-end> 
あまり必要性の高くない単純な処理なので、
詳しく議論されている例を見かけません。具体的な実装方法としては、</p><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="640" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[640]</anchor-end> 最初に発見したものを採用する</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="641" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[641]</anchor-end> 全体を走査して最頻のものを採用する</li></ul><p>...
のどちらかが一般的でしょうか。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="642" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[642]</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="643" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[643]</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:">文字コード</anchor>で <sw-cn xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CR</sw-cn> と <sw-cn xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">LF</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>でも支障ありません。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="644" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[644]</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:">UTF-32</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:">CR</sw-cn> や <sw-cn xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">LF</sw-cn> も2バイト以上になるので、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>レベルで判定するなら注意が必要になります。</p></section></section><section><h1>統計的手法による推測</h1><p><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>の出現頻度の統計データとを突き合わせることで<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="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>の解読法に、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">英語</anchor>の文章で <sw-ch xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">e</sw-ch> 
が頻用されることを利用して暗号文を解読するものがありますが、
基本的な原理はこれと同じです。</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> 
<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="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>されているのが<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="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>から取得中のデータのように利用できる材料が徐々に増えていくこともある
(= 途中で傾向が変化するかもしれないし、全体像が見えない段階で判断を迫られることもある)、
という難しさもあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="478" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[478]</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="477" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[477]</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:">AA</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="479" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[479]</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="646" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[646]</anchor-end> 
統計的に不安定な短い入力では、長い入力と同じ判定結果が得られるとは限らないという点も重要です。これは、判定器の挙動を調整する際に「最小の再現データを用意し、その入力に対して望ましい出力が得られるように修正する」という一般的な開発手法が必ずしも通用しないことを意味しています。短い入力は統計量そのものが揺らぎやすく、小さなバイトの偏りが大きく結果を左右してしまうため、点的なテストケースを追加しても、それが広い入力空間における挙動の改善につながるとは限りません。むしろ、短い断片を対象とした局所的な調整が、長い入力に対して逆効果となることもあり得ます。こうした特性が判定器の開発の難しさの最大の要因のひとつです。</p><section><h1>言語モデル</h1><p><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>の連続 (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">n-gram</anchor>) 
の出現頻度に基づき言語モデルを用意し、推定に使います。</p><p><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> 
具体的にどのような言語モデルを作り、どのように保持し、
どのように処理に使うかは、それぞれの判定器で違います。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="475" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[475]</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="476" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[476]</anchor-end> 
例外的に、 <cite>UnivCharDet</cite> の系譜の各種判定器は共通祖先の<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="480" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[480]</anchor-end> 
設計によるところも大きいですが、
言語モデルは必ずしも1つの<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="481" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[481]</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="482" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[482]</anchor-end> 
言語モデルの種類が多いほど、必要な処理が増えるということですから、処理速度は悪化します。
しかし言語モデルを統合しすぎても、言語の特徴が均されて見えづらくなりますから、
判別精度は悪化します。
実データの傾向を見ながら適度なバランスで分割・統合された言語モデルを用意し、
それらを使って結果を導出する計算のパラメーターを調整していく地道な作業が必要となります。</p><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="483" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[483]</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="484" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[484]</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:">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:">符号</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="485" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[485]</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="486" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[486]</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="487" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[487]</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></section><section><h1>言語モデルの開発</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="488" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[488]</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="497" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[497]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">平成時代</anchor>初期に開発された 
<cite>UnivCharDet</cite>
も苦労したと思われ、
言語モデルの都合で<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">西欧</anchor>と<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">中欧</anchor>への対応に制限があるなど機能性に影響が出ています。
<cite>UnivCharDet</cite> 
の系譜のソフトウェアの多くはその言語モデルをそのまま引き継いでいます。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="498" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[498]</anchor-end> 
<cite>ced</cite>
は
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Google</anchor> のデータベースを利用しているようです。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Google</anchor> が世界中から集めた <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:">Google</anchor> 社外の我々はそれをただ使うことしかできず、
研究することも改良することも、
他に流用することもほとんど不可能という限界も抱えています。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="499" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[499]</anchor-end> 
<cite>ced</cite> に限らず他の判定器の言語モデルも、
基本的には「そこにある」という以上のことはどうにもできない不透明なデータです。
微調整くらいはできるかもしれませんが、
完全に再生成するには同一の元データを用意し、
同じ方法で計算、加工しなければなりません。
完全に再生成できなければ改良もできません。
ところがすべての元データを用意するのは原作者すら不可能な場合が多いです。</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="500" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[500]</anchor-end> 
これは近年 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">LLM</anchor> 等の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">AI</anchor> 技術で問題となっている構図とよく似ています。
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>OSAID</anchor> </sw-see></comment-p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="489" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[489]</anchor-end> 
<cite>UnivCharDet</cite> の系譜のソフトウェアの一部や
<cite>chardetng</cite> <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="252" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;252</anchor-internal></src>
は
<cite>Wikipedia</cite>
の記事を使っています。
<cite>Wikipedia</cite>
には様々な分野の記事が集まっており、
適度に<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="490" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[490]</anchor-end> 
ただし <cite>Wikipedia</cite> が万能ともいえません。
まず、 <cite>Wikipedia</cite> に存在しないか、十分な記事がない<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="491" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[491]</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>の多くは
<cite xmlns="http://www.w3.org/1999/xhtml">Wikipedia</cite> が存在しているようです。しかし<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="492" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[492]</anchor-end> 
また、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ファイル名の文字コード</anchor>の判定のような一般の文章とは異なる語彙の偏りを持つ可能性がある対象に適用する場合の
<cite>Wikipedia</cite> 由来のデータの有効性は明らかではありません。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="493" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[493]</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:">subtitle</anchor> も一般の文章とは異なる偏りを持つ可能性があります。
ただ <cite>Wikipedia</cite> にも楽曲やアーティストの記事はありますから、
カバーされていないともいえません。
有効なのかどうか明確ではないという状況です。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="494" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[494]</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:">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>もあります。
現在の <cite>Wikipedia</cite> から作成した<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">言語モデル</anchor>が当時の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Webページ</anchor>に機能するかどうかは、
慎重にならざるを得ません。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="496" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[496]</anchor-end> 
これについては、
<cite>UnivCharDet</cite> の系譜や
<cite>chardetng</cite>
を使った古い <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Webページ</anchor>の判定に顕著な劣化が見られないことから、
実用上の問題にはならなそうです。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="558" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[558]</anchor-end> 
<cite>Wikipedia</cite> は<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="509" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[509]</anchor-end> 
<cite>Wikipedia</cite> は整った説明調の文章が多く、
会話文や俗語に乏しいことには特に注意が必要かもしれません。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="495" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[495]</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>
とが「文字」の概念のレベルで違っているケースが散見されます。
<cite>Wikipedia</cite> など <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><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="501" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[501]</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:">文字参照</anchor>で表したりしていることもあります。
こうした文書では通常の文章と違った文字の利用頻度となることがあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="502" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[502]</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:">英語</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="503" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[503]</anchor-end> 
こうした事情を抱えた古い <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Webページ</anchor>は、
<cite>Wikipedia</cite> 由来の言語モデルをそのまま単純に使った判定では必ずしも正解を得られないようです。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="504" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[504]</anchor-end> 
注意が必要な具体的事例:</p><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="505" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[505]</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>の選択 <sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>ルーマニア語文字問題</anchor> </sw-see></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="506" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[506]</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:">VNI</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TCVN3</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">windows-1258</anchor>) <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="613" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;613</anchor-internal></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="508" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[508]</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-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="613" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;613</anchor-internal></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="507" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[507]</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="589" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[589]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CJK互換漢字</anchor>に対応付けられている<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">漢字</anchor>およびそれに関係する<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CJK統合漢字</anchor>に対応付けられている<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="608" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[608]</anchor-end> 
言語モデルにおいて狭義の文字 (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">letter</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:">n-gram</anchor> 等でもそれらは除去したり、 <sw-cn xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SP</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:">letter</anchor> の出現パターンとは違うことが多く、混ぜたモデルが有効に機能するとは限らないのです。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="609" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[609]</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>の性質の影響も強く受けてしまうと考えられます。 <cite>Wikipedia</cite> 由来のモデルだと、整った説明文に出てくる<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="610" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[610]</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:">letter</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="611" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[611]</anchor-end> 
<cite>UnivCharDet</cite> の系譜の判定器の言語モデルは基本的には <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">letter</anchor> の出現頻度等で構成されています。系譜の実装の一部は記号類の出現の度合いを判定に加味することがあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="612" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[612]</anchor-end> 
<cite>chardetng</cite> は記号等をいくつかの種別に分けて <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">letter</anchor> とは違った方法で判定に加味しています。</p></section><section><h1>結合文字の扱い</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="613" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[613]</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="614" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[614]</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="615" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[615]</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></ul><p>といった疑問が生じます。これが主に問題となるのは<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="561" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;561</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>の<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="571" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;571</anchor-internal>)。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="616" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[616]</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:">bigram</anchor> が変化します。この違いがどう影響するのかです。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="617" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[617]</anchor-end> 
1つ目の疑問 (<anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="614" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;614</anchor-internal>) については、基本的には <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">letter</anchor> と同じ扱いで良いと思われます。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="618" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[618]</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>の扱いはあまり寄与しません。 <cite>UnivCharDet</cite> の系譜の判定器で <cite>Wikipedia</cite> から生成した言語モデル、すなわち<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">合成済み文字</anchor>方式の文字が含まれる可能性が高いモデルを使ったものがありますが、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">越南語</anchor>かどうかを概ね正しく判定します。また、 <cite>chardetng</cite> は独自の方法で決めた2種類の表現でデータを作っていますが、どちらでも大差はないという報告になっています <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="252" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;252</anchor-internal></src>。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="619" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[619]</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>のどれを使っているかによる差が小さいということです。<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-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="561" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;561</anchor-internal>)。あるいは <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">trigram</anchor> などでも改善できるかもしれません。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="620" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[620]</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="621" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[621]</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>の場合はそれを語全体の構造を意識した採点により実現できますが、他の言語では前後2字の連続によって減点することになるでしょうか。</p></section></section><section><h1>ASCII文字の扱い</h1><p><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:">EBCDIC</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:">ASCII文字</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="306" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[306]</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="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:">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:">JavaScript</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:">英語</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:">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>や<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>の語が極めて頻出します。</p><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>の濃度が極度に大きいと、本来の<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:">ASCII文字</anchor>をどう取り扱うかは設計上無視できない問題となります。</p><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:">ASCII文字</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><p><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:">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:">非ASCII文字</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><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:">非ASCII文字</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:">ASCII文字</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:">n-gram</anchor> の出現頻度は、
とりわけ欧州言語の判定に重要です。</p><p><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> 
<cite>UnivCharDet</cite> は<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>の判定に利用しています。</p><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> 
<cite>chardetng</cite> はそれより攻めていて <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><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> ただしこうした戦略の違いがどれだけ判定性能や動作速度や消費メモリー量に影響を及ぼすのか、
定量的な比較はあまり行われていないようで不明瞭です。</p><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:">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:">非ASCII文字</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="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:">エスケープ</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:">文字参照</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="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:">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>を除去すると、通常の<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="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>とそうでない<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="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:">Windows-1252</anchor> (含 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ISO-8859-1</anchor>) と <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ISO-8859-2</anchor> と <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Windows-1250</anchor>
は区別の難易度が高いことが知られています。</p><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> 
そもそも<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:">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:">非ASCII文字</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="202" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[202]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Windows-1252</anchor> と <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Windows-1250</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>の並びとして見たとき、
どちらかにわかに判断しがたいことが多いです。</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:">Windows-1250</anchor> と <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ISO-8859-2</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="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:">Mozilla</anchor> の <cite>UnivCharDet</cite> は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ISO-8859-2</anchor> に対応しているものの、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ISO-8859-1</anchor> が誤判定されてしまうとして無効化されています。
<cite>UnivCharDet</cite> の派生の中にはこれを改善して有効化しているものもありますが、
それらも完璧に判定できるわけではありません。</p><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> 
<cite>ced</cite> は <code>.hu</code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ドメイン</anchor>のみ <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">trigram</anchor> を有効にするなど、
特別な処理で判定を強化しています。それでも <cite>Chrome</cite>
はたまに判定を誤ります。
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>ロケール等による文字コード判定の補助</anchor> </sw-see></p><p><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> 
<cite>chardetng</cite> も <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TLD</anchor> による傾斜など特別な処理で判定を強化しています。
それでも <cite>Firefox</cite> はしばしば判定を誤ります。
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>ロケール等による文字コード判定の補助</anchor> </sw-see></p><p><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:">文字コード指定メニュー</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="281" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[281]</anchor-end> <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="280" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;280</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:">HTML</anchor> です。
各種の判定器は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ISO-8859-2</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">windows-1250</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">windows-1252</anchor>
と判断が分かれています。
<cite>Firefox</cite> は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">windows-1252</anchor> と考えます。
<cite>Chrome</cite> は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">windows-1252</anchor> と考えますが、
<cite>ced</cite> にバイト列を与えると <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">windows-1250</anchor> と回答します。
<time>2025-11-24T06:15:55.100Z</time></p><p xmlns="http://www.w3.org/1999/xhtml"><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> 実際には3符号化の共通文字が<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>の<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-2</anchor> / <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">windows-1250</anchor> と考えるのが妥当です。
<anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="280" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;280</anchor-internal> の範囲では <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ISO-8859-2</anchor> と <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">windows-1250</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="283" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[283]</anchor-end> <cite xmlns="http://www.w3.org/1999/xhtml">Firefox</cite> と <cite xmlns="http://www.w3.org/1999/xhtml">Chrome</cite> は<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><refs><ul xmlns="http://www.w3.org/1999/xhtml"><li><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> 
<cite>Bemutatkozik a WILD WEST GYÕR</cite>, <time>2025-11-24T06:08:55.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://www.members.tripod.com/wildwestgyor/bemut.htm">https://www.members.tripod.com/wildwestgyor/bemut.htm</anchor-external></li></ul></refs></example><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="539" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[539]</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-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="485" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;485</anchor-internal>)。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="540" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[540]</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:">windows-1252</anchor> / <code>iso-8859-1</code> / <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">macintosh</anchor> / <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ibm850</anchor> の類)
のうち、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">言語</anchor>
<code>fo</code>, <code>is</code>
は利用文字が他と大きく違います。
<cite>chardetng</cite> は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">西欧</anchor>をこれらとそれ以外とで二分しています
<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="252" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;252</anchor-internal></src>。
定量的評価がなされているのかは不明ですが、
有効な戦略のようにみえます。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="541" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[541]</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="542" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[542]</anchor-end> 
したがって<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">西欧</anchor>系の言語モデルは次の3種類にまとめられます。</p><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="543" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[543]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">西欧</anchor> : <code>af</code>, <code>es</code>, <code>fr</code>, <code>it</code>, <code>pt</code><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="544" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[544]</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:">windows-1252</anchor> + <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字参照</anchor>がよく使われた :
<code>et</code>, <code>mt</code>, <code>ro</code>, <code>rs</code>, <code>sq</code>, <code>tk</code></li></ul></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="545" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[545]</anchor-end> 南<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">北欧</anchor> : <code>da</code>, <code>de</code>, <code>fi</code>, <code>no</code>, <code>sv</code></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="546" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[546]</anchor-end> 北<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">北欧</anchor> : <code>fo</code>, <code>is</code></li></ul><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="547" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[547]</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-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="520" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;520</anchor-internal>) に注意が必要です。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="548" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[548]</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:">ISO-8859-3</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="549" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[549]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">トルコ語</anchor> : <code>az</code>, <code>tr</code></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="550" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[550]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">中欧</anchor> : <code>cs</code>, <code>hr</code>, <code>hu</code>, <code>pl</code>, <code>ro</code> (ただし <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="505" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;505</anchor-internal>),
<code>sk</code>, <code>sl</code>, <code>tk</code></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="551" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[551]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バルト</anchor> : <code>et</code>, <code>lv</code>, <code>lt</code></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="554" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[554]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">エスペラント</anchor> : <code>eo</code></li></ul><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="552" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[552]</anchor-end> <code>et</code> は <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="551" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;551</anchor-internal> と <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="554" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;554</anchor-internal> に重出しますが、この是非については検討の余地があります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="555" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[555]</anchor-end> 他に <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ibm865</anchor> や <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ISO-8859-15</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ISO-8859-16</anchor> 
などを扱うなら、対象言語に特化した言語群のモデルを用意したほうが良いかもしれませんが、
<anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="543" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;543</anchor-internal> との関係を検討しなければなりません。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="556" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[556]</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="553" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[553]</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="525" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[525]</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:">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>からの脱却を進めたところが多く、
その影響が問題となります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="526" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[526]</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:">Internet Archive</anchor> に残る各国の古い
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Webサイト</anchor>を調査すると、地域によって差も大きいものの、</p><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="527" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[527]</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:">windows-1251</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">KOI8-R</anchor>)</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="528" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[528]</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="529" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[529]</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:">windows-1250</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">windows-1252</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">windows-1251</anchor>,
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">KOI8-R</anchor> のいずれかと、それらで足りなければ<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字参照</anchor>)</li></ul><p>が大部分で、国単位の例外で</p><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="530" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[530]</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="532" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[532]</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="531" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[531]</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:">windows-1251</anchor>)</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="533" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[533]</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:">windows-1251</anchor>)</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="534" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[534]</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:">windows-1251</anchor>)</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="535" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[535]</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:">MNS 4330</anchor>)</li></ul><p>があります。<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>表記は見つけるのが困難です。
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>ロケール等による文字コード判定の補助</anchor> </sw-see></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="536" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[536]</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="538" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[538]</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="537" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[537]</anchor-end> 
<cite>UnivCharDet</cite> は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">キリル文字</anchor>に関して<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ロシア語</anchor>の言語モデルを用意していました。
<cite>UnivCharDet</cite> の系譜の判定器の中にはこれだけでは不足として<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ブルガリア語</anchor>の言語モデルを追加したものがあります。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Webページ</anchor>の判定ではこの2つのモデルがあれば他の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">キリル文字</anchor>言語も含めて実用的な精度が得られるようです。</p><history 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="523" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[523]</anchor-end> 
<cite>chardetng</cite> は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">アゼルバイジャン語</anchor>について</p><blockquote xmlns="http://www.w3.org/1999/xhtml"><ul><li>For Azerbaijani, I replaced ə with ä to synthetize the windows-1254-compatible 1991 orthography.</li></ul></blockquote><p xmlns="http://www.w3.org/1999/xhtml">なる調整をしたと説明しています。 <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="252" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;252</anchor-internal></src>
しかしその必要性について十分な根拠を示していません。</p><p xmlns="http://www.w3.org/1999/xhtml"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="524" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[524]</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:">windows-1254</anchor> の利用は皆無ではないにせよ一般的とは言い難く、
ここで説明されているような表記法の利用実態があるのか、
それが判定精度に寄与するのか、といった点に不安が多いです。
実際に
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Internet Archive</anchor>
で確認できる古い
<code>.az</code>
の
<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:">windows-1251</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="523" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;523</anchor-internal> のような事例は未発見です。
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>ラテン文字の文字コード</anchor>, <anchor>ロケール等による文字コード判定の補助</anchor> </sw-see></p></history><history 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="522" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[522]</anchor-end> 
<cite>chardetng</cite> は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">蒙古語</anchor>でも調整したと説明しています。
<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="252" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;252</anchor-internal></src>
これは <cite>Encoding Standard</cite> や <cite>Firefox</cite> が
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">MNS 4330</anchor> の存在を認めていないために必要になる処置です。</p></history></section><section><h1>大文字と小文字</h1><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>を同一視して<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字</anchor>や <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">n-gram</anchor>
の頻度を見ています。ほとんどはこの手法でうまく判定できます。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="520" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[520]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">トルコ語</anchor>では他の言語と <sw-ch xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">I</sw-ch> / <sw-ch xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">i</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="521" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[521]</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><hr></hr><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> 
<cite>chardetng</cite> は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">大文字と小文字</anchor>の使い分けが自然なものを加点し不自然なものを減点しています。
<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="291" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;291</anchor-internal></src></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>ですべて<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:">KOI-8</anchor> や<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘブライ文字</anchor>と混同しやすいとされ、
<cite>ced</cite> や <cite>chardetng</cite> が特殊処理を入れています。
<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="291" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;291</anchor-internal>, <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="284" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;284</anchor-internal></src></p><refs xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><ul xmlns="http://www.w3.org/1999/xhtml"><li><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> 
<cite xml:lang="en">chardetng/src/lib.rs at main · hsivonen/chardetng · GitHub</cite>, <time>2025-11-24T08:24: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://github.com/hsivonen/chardetng/blob/main/src/lib.rs#L154">https://github.com/hsivonen/chardetng/blob/main/src/lib.rs#L154</anchor-external></li></ul><figure xmlns="http://www.w3.org/1999/xhtml" class="quote"><figcaption><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> <cite xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">compact_enc_det</anchor>/compact_enc_det/compact_enc_det.cc at master · google/compact_enc_det · GitHub</cite>, <time>2025-11-24T07:39:23.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/google/compact_enc_det/blob/master/compact_enc_det/compact_enc_det.cc#L1770">https://github.com/google/compact_enc_det/blob/master/compact_enc_det/compact_enc_det.cc#L1770</anchor-external></figcaption><blockquote><p>// Greek all-caps is confusable with KOI8x all-lower and Hebrew.</p></blockquote></figure><ul xmlns="http://www.w3.org/1999/xhtml"><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> 
<cite xml:lang="en">Countermeasures for various misdetections. · hsivonen/<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">chardetng</anchor>@0973b4b · GitHub</cite>, <time>2025-11-24T08:50:10.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/hsivonen/chardetng/commit/0973b4b67da81b9be2f643d0da70536d616aec06">https://github.com/hsivonen/chardetng/commit/0973b4b67da81b9be2f643d0da70536d616aec06</anchor-external></li></ul></refs></section><section><h1>ASCII 文字と非 ASCII 文字の隣接</h1><p><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> 
<cite>chardetng</cite> は<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>を減点しています。
<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="299" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;299</anchor-internal>, <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="252" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;252</anchor-internal></src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="518" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[518]</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>の抑制になりそうです。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="519" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[519]</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:">漢字</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="297" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[297]</anchor-end> 
<cite>chardetng</cite> は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">語長</anchor>が23<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">超</anchor>なら<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">タイ文字</anchor>以外を減点しています。
<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="296" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;296</anchor-internal></src></p><p><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> <cite>chardetng</cite> は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">EUC-KR</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>が5<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">超</anchor>なら減点
(<code>EUC_KR_LONG_WORD_PENALTY</code>) しています。 <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="296" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;296</anchor-internal></src></p><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> 
他の実装にはあまり見られないので有効性は不明瞭です。</p><p><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:">johab</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:">3</n>
字くらい) との乖離の検知が有効なようです。</p><refs xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><ul xmlns="http://www.w3.org/1999/xhtml"><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> 
<cite xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">chardetng</anchor>/src/lib.rs at main · hsivonen/chardetng · GitHub</cite>, <time>2025-11-24T08:46: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/hsivonen/chardetng/blob/main/src/lib.rs#L755">https://github.com/hsivonen/chardetng/blob/main/src/lib.rs#L755</anchor-external></li></ul></refs></section><section><h1>書字方向</h1><p><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:">ISO-8859-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:">論理順</anchor>の区別が必要となる場合があります。</p><p><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:">ヘブライ文字</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>が異なるものが5字10種あります。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ISO/IEC 8859-8</anchor> や <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Windows-1255</anchor> はそれらに別の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ビット組合せ</anchor>を充てています。
<cite>UnivCharDet</cite> は<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:">bigram</anchor>
の評価によってどちらか判定しています。</p><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> 
<cite>chardetng</cite> は<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>の使われ方で判定しているようです。
<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="252" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;252</anchor-internal></src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="557" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[557]</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><refs xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><ul xmlns="http://www.w3.org/1999/xhtml"><li><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> 
<cite xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">chardetng</anchor>: A More Compact Character Encoding Detector for the Legacy Web</cite>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Henri Sivonen</anchor>, <time>2020-06-08T16:23:51.000Z</time>, <time>2025-12-03T05:01:28.298Z</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://hsivonen.fi/chardetng/">https://hsivonen.fi/chardetng/</anchor-external></li></ul></refs></section><section><h1>越南語</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="561" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[561]</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>が使われていました。
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>越南語の文字コード</anchor> </sw-see></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="562" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[562]</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:">欧米</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:">ASCII英数字</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:">bigram</anchor> の出現頻度だと区別が付き辛いこともあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="563" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[563]</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>などを除くと、
3, 4つ前後の<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:">非ASCII文字</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="564" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[564]</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="565" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[565]</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:">非ASCII文字</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="566" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[566]</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>であるもの
<weak xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">(現在の <anchor>Unicode</anchor> の一般的な利用法はこちら。)</weak>
と、
<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="567" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[567]</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="568" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[568]</anchor-end> 
<cite>chardetng</cite> は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> と符号化モデルが異なる
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">windows-1258</anchor> 
用のデータを <cite>Wikipedia</cite> の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> 用データから生成するためあれこれ操作しているようです。
<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="252" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;252</anchor-internal></src>
しかし、少なくても <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Web</anchor> において <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">windows-1258</anchor> が大規模に利用された形跡がなく、
当該操作で製作されたデータの有用性は不明瞭です。
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>windows-1258</anchor> </sw-see></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="569" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[569]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Internet Archive</anchor> に残る初期の <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:">HTML文書</anchor>での実験によると、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">越南語</anchor>版 <cite>Wikipedia</cite> の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor>
記事から作った言語モデルで
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">viscii</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">x-viet-vps</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">x-viet-tcvn3</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">x-viet-vni</anchor>
(とその他欧米の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>) の区別は不可能ではないものの、
不安を感じる精度であります。 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">viscii</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">x-viet-vps</anchor> は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">合成済み文字</anchor>なのでこのままでよく、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">x-viet-tcvn3</anchor>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">x-viet-vni</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="570" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[570]</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="565" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;565</anchor-internal>) などに改良の余地はあります。
どこまでを言語モデルの改良により、どこからを他の手法の組み合わせによるべきかも探求の余地があることでしょう。</p></section><section><h1>半角カナ</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="571" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[571]</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>の元凶として嫌われてきました。
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>半角カナ</anchor> </sw-see>
<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="572" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[572]</anchor-end> 
<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:">Shift_JIS</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="573" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[573]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Shift_JIS</anchor> の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">半角カナ</anchor>は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">EUC-JP</anchor> の2バイト文字と<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="574" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[574]</anchor-end> 
<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:">半角カナ</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="575" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[575]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Latin1</anchor> の記号を <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Shift_JIS</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="576" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[576]</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="577" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[577]</anchor-end> 
<cite>UnivCharDet</cite> の系譜の判定器は入力に<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:">8ビット符号</anchor>と誤認することがあります。 <cite>UnivCharDet</cite> は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">半角カナ</anchor>を判定に使わないので、2バイト文字がなければ他の<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="578" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[578]</anchor-end> 
<cite>chardetng</cite> は<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:">半角カナ</anchor>だけの文字列のテストを用意していますから、この問題を認識し対策していることがわかります。実際に <cite>UnivCharDet</cite> の系譜の判定器よりこの種の判定は高精度です。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="579" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[579]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Shift_JIS</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:">Latin1</anchor> の記号等の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バイト</anchor>と重なっています。 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Web</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:">Latin1</anchor> 文字が頻出します (<anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="265" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;265</anchor-internal>)。 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Latin1</anchor> 側で特徴的なパターンに加点するだけでなく、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Shift_JIS</anchor> 側で不自然なパターンに減点する対策が有効です。 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Latin1</anchor> の記号が配置されている <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0xA<var xmlns="http://www.w3.org/1999/xhtml">x</var></n> の領域には <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Shift_JIS</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:">AA</anchor> などで出現し得ることには配慮しつつも、減点要素にできます。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="581" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[581]</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="582" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[582]</anchor-end> 
いくつかある入力欄の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>で記述されているはずの<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="583" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[583]</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:">8ビット符号</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="584" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[584]</anchor-end> 言語モデルはどう作るのがいいでしょうか。<ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="585" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[585]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">半角カナ</anchor>がどう使われるか考えてみると、大別して、 (1) 通常の日本語表記のうち片仮名部分 (2) <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">人名</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">振り仮名</anchor>など発音表記 (3) <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">箇条書き</anchor>などの記号 (4) 通常の日本語の文や語句だが片仮名表記、 (5) <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">AA</anchor> 等の構成要素、 (6) <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> </sw-see> このうち (3) (5) は言語モデル法で扱うのは無理です。 (1) は <cite>Wikipedia</cite> などから<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">片仮名</anchor>部分を抜き出せば作れそうです。 (2) (4) が (1) と同じ言語モデルで対応可能なのかどうかは自明ではありません。 (2) (4) (6) は<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="586" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[586]</anchor-end> (1) - (6) の用途の言語モデルは、合わせて1つ作るのが良いのでしょうか、それともいくつか作るのが良いのでしょうか。合わせることはできるのでしょうか。</li></ul></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="587" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[587]</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="588" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[588]</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:">Shift_JIS</anchor> の判定はどう組み合わせるのが良いのでしょう。<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">半角カナ</anchor>のみと <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Shift_JIS</anchor> 全体とを別の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号</anchor>であるかのように扱うのが良いのか、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Shift_JIS</anchor> の判定の一部として<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="622" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[622]</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:">ワープロ</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="623" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[623]</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="624" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[624]</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:">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>の実用当時の使われ方と同じかどうかは不安があります。変換器は生成しないけれども実用されたバイトの並びが存在するかもしれませんし、バイトの並び方に実用とは異なる偏りが生じる可能性もあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="628" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[628]</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:">TSCII</anchor> や <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">TAB</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="625" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[625]</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>体系も含めて検討されています。 <sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>チベット文字の文字コード</anchor> </sw-see></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="626" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[626]</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>なのか、<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> </sw-see></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="627" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[627]</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:">Zawgyi</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>となるのが独特な点です。
<sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>ビルマ文字の文字コード</anchor> </sw-see></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="629" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[629]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Zawgyi</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:">SNS</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:">Zawgyi</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="630" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[630]</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>を識別する研究の事例があります。 <sw-see xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"> <anchor>クメール文字の文字コード</anchor> </sw-see> <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="631" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[631]</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>の類縁関係など今後の調査研究が期待される領域は多く、人間の作業を補助する機械的手段は有効と思われます。</p></section></section><section><h1>発展的手法</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="632" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[632]</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="633" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[633]</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:">Transformer</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:">GPU</anchor> 計算資源を用いた大規模学習を必要とするほどの商業的需要がこの分野にあるかといえば否定的で、歴史やアーカイブの研究者の関心も高くないのが現状です。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="634" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[634]</anchor-end> 
より<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:">Shift_JIS</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>側の知識が不可欠となります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="635" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[635]</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:">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:">フォント</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><section><h1>出現頻度等による実装</h1><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> 出現頻度等による実装:</p><refs xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><ul xmlns="http://www.w3.org/1999/xhtml"><li><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><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UniversalCharDet</anchor></cite> の系譜</li><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"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">GitHub</anchor> - chomechome/charamel: 🌏 Truly Universal Encoding Detection in Python 🌎</cite>, <time>2025-05-19T12:46:16.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/chomechome/charamel">https://github.com/chomechome/charamel</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">GitHub - jawah/charset_normalizer: Truly universal encoding detector in pure Python</cite>, <time>2025-05-19T12:51:46.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/jawah/charset_normalizer">https://github.com/jawah/charset_normalizer</anchor-external></li><li><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">Charset Detection | ICU Documentation</cite>, <time>2025-04-15T18:50:10.000Z</time>, <time>2025-05-19T13:56:04.594Z</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://unicode-org.github.io/icu/userguide/conversion/detection.html">https://unicode-org.github.io/icu/userguide/conversion/detection.html</anchor-external></li><li><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> 
<cite xml:lang="en">GitHub - hsivonen/shift_or_euc: Detects among the Japanese legacy encodings</cite>, <time>2025-05-19T13:59: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/hsivonen/shift_or_euc">https://github.com/hsivonen/shift_or_euc</anchor-external><ul><li><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>の判定</li></ul></li><li>
<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> <cite xml:lang="en">google/compact_enc_det: compact_enc_det - Compact Encoding Detection</cite>
(<time>2016-07-30 15:05:47 +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="https://github.com/google/compact_enc_det">https://github.com/google/compact_enc_det</anchor-external><ul><li><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> 
<cite xml:lang="en">GitHub - google/compact_enc_det: compact_enc_det - Compact Encoding Detection</cite>, <time>2025-05-19T14:08:52.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/google/compact_enc_det/">https://github.com/google/compact_enc_det/</anchor-external></li></ul></li><li>
<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> 
<cite xml:lang="en-US">Encode::Guess::Educated - do something - metacpan.org</cite>, <time>2025-05-20T15:01: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://metacpan.org/pod/Encode::Guess::Educated">https://metacpan.org/pod/Encode::Guess::Educated</anchor-external></li><li><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> 
<cite xml:lang="en">GitHub - vlm/zip-fix-filename-encoding: Fix cyrillic character encoding of filenames inside zip archives</cite>, <time>2025-05-16T10:03:38.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/vlm/zip-fix-filename-encoding">https://github.com/vlm/zip-fix-filename-encoding</anchor-external><ul><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> 
<cite xml:lang="en">zip-fix-filename-encoding/src/runzip.c at master · vlm/zip-fix-filename-encoding · GitHub</cite>, <time>2025-05-24T14:05:58.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/vlm/zip-fix-filename-encoding/blob/master/src/runzip.c">https://github.com/vlm/zip-fix-filename-encoding/blob/master/src/runzip.c</anchor-external></li><li><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> 
<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></li><li><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> <cite>Wayback Machine</cite>, <time>2025-06-02T11:58:14.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://web.archive.org/web/20250601053528/https://shoshia.tripod.com/pub/webconv.zip">https://web.archive.org/web/20250601053528/https://shoshia.tripod.com/pub/webconv.zip</anchor-external><ul><li><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> <code>GEO-CONV.PL</code><ul><li><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> <code>&amp;analyze</code><ul><li><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-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="64" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;64</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>の変換器で、
(おそらく改変されていない)この関数は<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:">Stefan Mashkevich</anchor>
が<time>1998-11-26</time>に開発したものです。
KOI8, DOS866, WIN1251, ISO8859-5, MAC に対応しています。</li></ul></li></ul></li></ul></li><li><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> 
<cite xml:lang="en">Universal online Cyrillic decoder - recover your texts</cite>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Petko Yotov</anchor>, <time>2025-06-04T07:48:52.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://2cyr.com/decode/">https://2cyr.com/decode/</anchor-external></li><li><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> 
<cite xml:lang="en-US">Encode::Detect::CJK - A Charset Detector, optimized for EastAsia charset and website content - metacpan.org</cite>, <time>2025-06-25T08:14:27.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://metacpan.org/pod/Encode::Detect::CJK">https://metacpan.org/pod/Encode::Detect::CJK</anchor-external></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="647" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[647]</anchor-end> 
<cite xml:lang="ja">エンコーディング自動検出の「その先」を、バイト列が教えてくれた</cite>, <time>2026-02-26T04:17:34.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://zenn.dev/dress_code/articles/chardet-high-byte-ratio">https://zenn.dev/dress_code/articles/chardet-high-byte-ratio</anchor-external></li></ul></refs><hr></hr><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> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">universalchardet</anchor> は、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Mozilla</anchor> が <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>に移植されて使われています。</p><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>に対応しています:</p><p>utf-8 utf-16be utf-16le iso-2022-cn big5 x-euc-tw gb18030 hz-gb-2312
iso-2022-jp shift_jis euc-jp iso-2022-kr euc-kr 
<code>iso-8859-5</code> 
koi8-r
<code>windows-1251</code>
x-mac-cyrillic ibm866 ibm855 iso-8859-7 
<code>tis-620</code>
windows-1253
iso-8859-8 windows-1255 windows-1252</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="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[6]</anchor-end> 
データだけで未実装:
<code xmlns="http://www.w3.org/1999/xhtml">iso-8859-2</code>
<code xmlns="http://www.w3.org/1999/xhtml">windows-1250</code></comment-p><hr></hr><p><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> 
<dfn><cite>compact_enc_det</cite></dfn> (<dfn><cite>ced</cite></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="91" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;91</anchor-internal></src>
は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Google</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="277" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[277]</anchor-end> 
<cite>Google Chrome</cite> で採用されています。 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Google</anchor> 社内の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">検索</anchor>や <cite>Gmail</cite>
などでも使われていると言われています。</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:">Google検索</anchor>で使われる
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Google</anchor> 社内の世界最大規模の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Webページ</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> 
ただ逆に言えば<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">オープンソース</anchor>とはいえ <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Google</anchor> 社員以外がこれを改善する改変を行うことは困難で、
そのまま使うか、他のソフトウェアの改善のヒントに使うくらいしかできません。</p><hr></hr><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> 
<dfn><cite>Charamel</cite></dfn>
は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Python</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>
が標準で対応するすべての<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号化</anchor>に対応したと謳っています。
<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="36" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;36</anchor-internal></src></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:">符号化</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="85" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[85]</anchor-end> 
付属の試験データ <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="31" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;31</anchor-internal></src>
は実際の <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:">非ASCII文字</anchor>が1つも含まれないデータしかない<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号化</anchor>もあり、
試験データとして精査されたものとは思えません。</p><ed xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">
<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> 
<cite xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">Expose apparent_encoding_confidence. by martinblech · Pull Request #1796 · psf/requests · GitHub</cite>, <time xmlns="http://www.w3.org/1999/xhtml">2025-10-19T13:06: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/psf/requests/pull/1796">https://github.com/psf/requests/pull/1796</anchor-external></ed></section><section><h1>符号構造のみによる実装</h1><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><refs xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><ul xmlns="http://www.w3.org/1999/xhtml"><li>
<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> 
<cite>null</cite>, <time>2008-05-10T18:15:22.000Z</time>, <time>2025-05-24T14:10:44.885Z</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://openlab.ring.gr.jp/Jcode/Jcode.pm#:~:text=sub%20getcode">http://openlab.ring.gr.jp/Jcode/Jcode.pm#:~:text=sub%20getcode</anchor-external></li><li>
<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> 
<cite xml:lang="en-US">Encode::Guess - Guesses encoding from data - metacpan.org</cite>, <time>2025-05-20T14:53:40.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://metacpan.org/pod/Encode::Guess">https://metacpan.org/pod/Encode::Guess</anchor-external></li><li>
<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> 
<cite xml:lang="en-US">Encode::HanDetect - Cross-encoding, cross-variant Chinese decoder - metacpan.org</cite>, <time>2025-06-25T08:00:21.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://metacpan.org/pod/Encode::HanDetect">https://metacpan.org/pod/Encode::HanDetect</anchor-external><ul><li><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> <cite xml:lang="en-US">HanDetect.pm - metacpan.org</cite>, <time>2003-06-27T04:53:28.000Z</time>, <time>2025-06-25T08:15:33.569Z</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://metacpan.org/module/Lingua::ZH::HanDetect/source">https://metacpan.org/module/Lingua::ZH::HanDetect/source</anchor-external></li></ul></li><li>
<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> 
<cite xml:lang="ja">文字エンコーディング判定スクリプト - t_komuraの日記</cite>, <time>2025-05-21T12:18: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://t-komura.hatenadiary.org/entry/20091220/1261305552">https://t-komura.hatenadiary.org/entry/20091220/1261305552</anchor-external></li><li>
<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> 
<cite xml:lang="en-US">Encode::Multibyte::Detect - detect multibyte encoding - metacpan.org</cite>, <time>2025-06-25T08:18: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://metacpan.org/pod/Encode::Multibyte::Detect">https://metacpan.org/pod/Encode::Multibyte::Detect</anchor-external></li><li>
<anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="602" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[602]</anchor-end> 
<cite xml:lang="ja">Common Lisp と 日本語 と 文字コード</cite>, <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Masayuki Onjo</anchor>, <time>2009-07-13T13:12:16.000Z</time>, <time>2025-12-05T15:30:49.195Z</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://lispuser.net/commonlisp/japanese.html#sec-2.1">https://lispuser.net/commonlisp/japanese.html#sec-2.1</anchor-external><ul><li>
<anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="603" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[603]</anchor-end> 
<cite>download</cite>, <time>2008-08-20T09:01:26.000Z</time>, <time>2025-12-05T15:31:34.509Z</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.honeyplanet.jp/download.html#libguess">http://www.honeyplanet.jp/download.html#libguess</anchor-external></li><li>
<anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="601" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[601]</anchor-end> 
<cite xml:lang="en">GitHub - zqwell/guess: common lisp porting of libguess-1.0 that is a character set detection library.</cite>, <time>2025-12-05T15:29:02.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/zqwell/guess">https://github.com/zqwell/guess</anchor-external></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="604" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[604]</anchor-end> 
<cite xml:lang="en">GitHub - kaniini/libguess: character set guessing library</cite>, <time>2025-12-05T15:35: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://github.com/kaniini/libguess">https://github.com/kaniini/libguess</anchor-external></li></ul></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="560" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[560]</anchor-end> 
<cite xml:lang="en">Some Node utility functions for aggregating byte information about Buffers · GitHub</cite>, <time>2025-12-30T10:14:30.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://gist.github.com/rossj/6e31df6933636c2c7fb1bcc6ac97c72e">https://gist.github.com/rossj/6e31df6933636c2c7fb1bcc6ac97c72e</anchor-external></li></ul></refs><p><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> <cite>LV Homepage (in Japanese)</cite>, <time>2025-06-25T14:34:54.000Z</time>, <time>2001-01-19T05:51:42.277Z</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/20010119052900/http://www.mt.cs.keio.ac.jp/person/narita/lv/index_ja.html">https://web.archive.org/web/20010119052900/http://www.mt.cs.keio.ac.jp/person/narita/lv/index_ja.html</anchor-external></p><blockquote><p>現在の自動選択の方法は簡単なものです. ファイルを先頭から読み込んでいって, 8ビット目が立っている文字があった場合, 『その行』の中で euc-japan で使用される領域のみを使っていれば euc-japan, そうでなければ shift-jis です. つまり,『漢字らしきものを含む最初の一行』で判断しています. 8ビット目が立っている文字が見つからなければ いつまでも自動選択のままの状態が続き, 判断が必要になったときに判断します. shift-jis の片仮名のみを使用した場合や, 運の悪いときは, 誤って euc-japan と認識されます.</p></blockquote><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> 
<cite xml:lang="en">Add UTF-7 to replacement encoding list? / Encoding sniffing · Issue #68 · whatwg/encoding</cite>, <time>2025-06-17T03:18: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://github.com/whatwg/encoding/issues/68">https://github.com/whatwg/encoding/issues/68</anchor-external></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> 
<cite xml:lang="en">Encoding: make it clear sniffing for UTF-8 is not acceptable by annevk · Pull Request #14455 · web-platform-tests/wpt · GitHub</cite>, <time>2025-06-17T03:20:29.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/web-platform-tests/wpt/pull/14455">https://github.com/web-platform-tests/wpt/pull/14455</anchor-external></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> <cite xml:lang="ja">Escape Codec Library: ecl.js</cite>, <time>2012-04-16T04:12:06.000Z</time>, <time>2025-11-19T14:41:59.833Z</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.junoe.jp/downloads/itoh/enc_js.shtml">https://www.junoe.jp/downloads/itoh/enc_js.shtml</anchor-external></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> <cite xml:lang="ja">ISO-2022-JPとSJISとEUCJP(とUTF-8)をざっくり判別するアルゴリズム - うならぼ</cite>, <time>2025-11-19T14:38:09.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://unarist.hatenablog.com/entry/2017/02/28/205401">https://unarist.hatenablog.com/entry/2017/02/28/205401</anchor-external></p></section></section></section><section><h1>品質検査</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="590" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[590]</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="591" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[591]</anchor-end> 
ところが判定精度は評価が困難です。外部的な <code>charset</code> 指定や<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">データ形式</anchor>で定められた <code>&lt;meta charset&gt;</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><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="592" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[592]</anchor-end> 
対象となる分野の試験データを各種満遍なく大量に確保できれば良いのですが、どのように集めれば「満遍なく」と言えるのかすらも簡単には答えられません。そして、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UTF-8</anchor> 化が進んでいる現在では対象データを探すのはどんどん難しくなっています。いっとき確保できたとしても、大量のデータを永続的に、しかも権利関係のトラブルなく開発関係者間で保持し続ける難しさも、継続的な開発の障害となります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="593" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[593]</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:">Internet Archive</anchor> の過去のサイトから実際のデータを試験データとして確保できます。ただし、古い <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Webサイト</anchor>の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">URL</anchor> を見つけて、人手で正しい<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字コード</anchor>を確認して「正解」データを整備する必要があります。古いサイトだけでなく実稼働サイトも試験データとすることで幅広い時代の言語に対応可能か検査したいところですが、実サイトは継続性に不安が残ることと、更新によって内容が変わってしまう可能性が常にあることに気をつけなければなりません。 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Internet Archive</anchor> に最新の複製を保存しつつ「正解」データを作るのが良いでしょう。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="594" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[594]</anchor-end> 
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ZIPファイル</anchor>の場合、一般公開されずに流通しているものが多いと思われますが、それらを収集して試験データとして利用することは無理だと思った方が良いでしょう。公開ファイルは <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Webページ</anchor>と同じ要領で <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Internet Archive</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:">ZIPファイル</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:">ZIPファイル</anchor>も未だに大量に生成され続けています。</p><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="599" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[599]</anchor-end> 
各種の判定器の実装は、最低限の動作検証のための短い試験データを用意していたり、注釈やドキュメントに実例を示していたりすることがあります。このようなデータは実利用例そのものではないにせよ、各実装者の取り組んだ問題をコンパクトに表現したものであり、きっかけとなった実際の課題を反映しているはずです。実世界の事例そのものだけでなく、こうしたものも試験データとして有益と考えられます。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="600" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[600]</anchor-end> 
ただし、こうしたものは極端に短く単体での出現は非現実的とも考えられますから、それに過度に適応するのも考えものです。</p><hr></hr><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="595" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[595]</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><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="596" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[596]</anchor-end> 
また、 <cite>Wikipedia</cite> の各言語の <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="597" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[597]</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="598" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[598]</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="607" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[607]</anchor-end> 
各種判定器のソースコードをよく見ると、判定条件や状態機械の遷移条件などが間違っているのではないかと思われる事例もちらほら見られます。その性質上、境界値などのちょっとした不具合も全体の複雑さに埋もれて露見しにくくなります。多少であれば総合的な影響は少ないものの、短い入力や特殊な文章などに対する反応が悪くなるおそれがありますから、いろいろな試験データで動作を確認することが重要です。</p><section><h1>頻度解析等の手法のためのテストデータ</h1><refs xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><ul xmlns="http://www.w3.org/1999/xhtml"><li><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> 
<cite xml:lang="en">gecko-dev/extensions/universalchardet/tests at master · mozilla/gecko-dev · GitHub</cite>, <time>2025-05-17T09:04:18.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/mozilla/gecko-dev/tree/master/extensions/universalchardet/tests">https://github.com/mozilla/gecko-dev/tree/master/extensions/universalchardet/tests</anchor-external><ul><li><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:">MPL</anchor> 2</li></ul></li><li><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> <cite xml:lang="en">juniversalchardet/data at master · seratch/juniversalchardet · GitHub</cite>, <time>2025-05-18T03:30:23.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/seratch/juniversalchardet/tree/master/data">https://github.com/seratch/juniversalchardet/tree/master/data</anchor-external><ul><li><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> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">MPL</anchor> 1.1 / <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">GPL</anchor> 2+ / <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">LGPL</anchor> 2.1+</li></ul></li><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">juniversalchardet/src/test/resources at main · albfernandez/juniversalchardet · GitHub</cite>, <time>2025-05-18T03:36:18.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/albfernandez/juniversalchardet/tree/main/src/test/resources">https://github.com/albfernandez/juniversalchardet/tree/main/src/test/resources</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> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">MPL</anchor> 1.1 / <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">GPL</anchor> 2+ / <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">LGPL</anchor> 2.1+</li><li><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-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="9" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;9</anchor-internal> を含み、更に追加</li></ul></li><li><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> 
<cite xml:lang="en">ude/src/Tests/Data at master · errepi/ude · GitHub</cite>, <time>2025-05-18T03:40:02.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/errepi/ude/tree/master/src/Tests/Data">https://github.com/errepi/ude/tree/master/src/Tests/Data</anchor-external><ul><li><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:">MPL</anchor> 1.1 / <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">GPL</anchor> 2+ / <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">LGPL</anchor> 2.1+」、
「Wikipedia と同じ」、
「The Project Gutenberg と同じ」
が混在</li><li><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-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="9" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;9</anchor-internal> を含み、更に追加</li></ul></li><li><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> 
<cite xml:lang="ja">test · master · uchardet / uchardet · GitLab</cite>, <time>2025-05-18T04:21:47.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/uchardet/uchardet/-/tree/master/test?ref_type=heads">https://gitlab.freedesktop.org/uchardet/uchardet/-/tree/master/test?ref_type=heads</anchor-external><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:">MPL</anchor> 1.1 / <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">GPL</anchor> 2+ / <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">LGPL</anchor> 2.1+</li></ul></li><li><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> 
<cite xml:lang="en">rust-chardet/tests/data at master · thuleqaid/rust-chardet · GitHub</cite>, <time>2025-05-18T05:01:25.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/thuleqaid/rust-chardet/tree/master/tests/data">https://github.com/thuleqaid/rust-chardet/tree/master/tests/data</anchor-external><ul><li><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> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">LGPL</anchor> 3</li></ul></li><li><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 xml:lang="en">chardet/tests at main · chardet/chardet · GitHub</cite>, <time>2025-05-18T05:10:41.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/chardet/chardet/tree/main/tests">https://github.com/chardet/chardet/tree/main/tests</anchor-external><ul><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> 不自由なものを含む<ul><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> 
<cite xml:lang="en">problematic licensing of /tests? · Issue #231 · chardet/chardet</cite>, <time>2025-05-19T06:27:37.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/chardet/chardet/issues/231">https://github.com/chardet/chardet/issues/231</anchor-external></li><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> 
<cite xml:lang="en">Documentation licensed only to non-commercial and personal use found · Issue #271 · chardet/chardet</cite>, <time>2025-05-19T06:24:05.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/chardet/chardet/issues/271">https://github.com/chardet/chardet/issues/271</anchor-external></li></ul></li></ul></li><li><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> 
<cite xml:lang="en">GitHub - Ousret/char-dataset: Public dataset used to challenge Charset-Normalizer</cite>, <time>2025-05-19T08:37:52.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/Ousret/char-dataset">https://github.com/Ousret/char-dataset</anchor-external><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> ライセンス不明</li></ul></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 xml:lang="en">charamel/tests/fixtures at master · chomechome/charamel · GitHub</cite>, <time>2025-05-19T11:59:39.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/chomechome/charamel/tree/master/tests/fixtures">https://github.com/chomechome/charamel/tree/master/tests/fixtures</anchor-external><ul><li><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 xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Apache 2.0</anchor> となっているが、出所の怪しげなファイルもある</li><li><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 xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Git LFS</anchor></li><li><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> 機械的に変換したファイルが多い?</li></ul></li><li><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> 
<cite xml:lang="en">compact_enc_det/compact_enc_det/compact_enc_det_unittest.cc at master · google/compact_enc_det · GitHub</cite>, <time>2025-05-21T06:26:33.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/google/compact_enc_det/blob/master/compact_enc_det/compact_enc_det_unittest.cc">https://github.com/google/compact_enc_det/blob/master/compact_enc_det/compact_enc_det_unittest.cc</anchor-external><ul><li><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:">Apache 2.0</anchor></li><li><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:">C++</anchor> ソースコードに埋め込まれている</li></ul></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="605" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[605]</anchor-end> 
<cite xml:lang="en">libguess/src/tests/testbench at master · kaniini/libguess · GitHub</cite>, <time>2025-12-05T15:33:34.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/kaniini/libguess/tree/master/src/tests/testbench">https://github.com/kaniini/libguess/tree/master/src/tests/testbench</anchor-external><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="606" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[606]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">BSD3</anchor></li></ul></li></ul></refs></section></section><section><h1>関連</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></p></section><section><h1>メモ</h1><p><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> 
<cite xml:lang="en">How to reliably guess the encoding between MacRoman, CP1252, Latin1, UTF-8, and ASCII - Stack Overflow</cite>, <time>2025-10-18T08:36: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://stackoverflow.com/questions/4198804/how-to-reliably-guess-the-encoding-between-macroman-cp1252-latin1-utf-8-and">https://stackoverflow.com/questions/4198804/how-to-reliably-guess-the-encoding-between-macroman-cp1252-latin1-utf-8-and</anchor-external></p><ul><li><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> 
<cite xml:lang="ja">mb_detect_encoding() は文字コード判定として使用できるか(その1) - t_komuraの日記</cite>, <time>2025-05-21T12:15:39.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://t-komura.hatenadiary.org/entry/20090615/1245078430">https://t-komura.hatenadiary.org/entry/20090615/1245078430</anchor-external><ul><li><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> 
<cite xml:lang="ja">mb_detect_encoding() は文字コードの妥当性検証として使用できるか(その2) - t_komuraの日記</cite>, <time>2025-05-21T12:15:09.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://t-komura.hatenadiary.org/entry/20090621/1245595484">https://t-komura.hatenadiary.org/entry/20090621/1245595484</anchor-external></li><li><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> 
<cite xml:lang="ja">mb_detect_encoding() は文字コードの妥当性検証として使用できるか(その3) - t_komuraの日記</cite>, <time>2025-05-21T12:17:54.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://t-komura.hatenadiary.org/entry/20090705/1246802467">https://t-komura.hatenadiary.org/entry/20090705/1246802467</anchor-external></li></ul></li></ul><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> <cite xml:lang="en"><strong>[</strong>ptexenc<strong>]</strong> 入力ファイルの文字コードの自動判定 · Issue #142 · texjporg/tex-jp-build</cite>, <time>2025-05-21T12:13:06.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/texjporg/tex-jp-build/issues/142">https://github.com/texjporg/tex-jp-build/issues/142</anchor-external></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> <cite xml:lang="en">21990 – When a rare EUC-JP character is present, explicitly (and correctly) labelled EUC-JP document is mistreated as Shift_JIS</cite>, <time>2025-11-16T05:48:11.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://bugs.webkit.org/show_bug.cgi?id=21990">https://bugs.webkit.org/show_bug.cgi?id=21990</anchor-external></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> 
<cite xml:lang="en">16482 – Hook up ICU's encoding detector and add a boolean param to Settings and WebPreferences</cite>, <time>2025-11-16T05:50:12.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://bugs.webkit.org/show_bug.cgi?id=16482">https://bugs.webkit.org/show_bug.cgi?id=16482</anchor-external></p></section></body></html>