文字として符号化された文字やバイト

文字として符号化された文字やバイト

種別

[8] 文字記号としてバイト文字符号化する

Unicode の制御文字

[22] Unicode制御文字エスケープシーケンスに関係して上位層プロトコルという語を使っています。 ISO/IEC 10646におけるエスケープシーケンス, 制御文字

[23] 上位層プロトコルとは二階建て8ビット符号における第2層の8ビット符号に当たるものになります。

二階建ての8ビット符号

[1] フォント依存符号化で非常によくある形態は、

... で構成されます。

[11] 8ビット符号バイト [ 0, 255 ] と文字写像であることは第一級符号化文字集合と同じです。

[12] ところが第一級8ビット符号の実装とは違ってフォント依存符号化応用プラットフォームが直接支援するものではないため、 他の第一級8ビット符号で代用されます。ほとんどの場合はそれが windows-1252 です。ここでは windows-1252符号化文字は重要ではなく、 それがバイトUnicode符号位置写像であることだけが意味を持ちます。

[13] 実際にファイルとして保存される HTMLRTF などの文書形式のデータは、 windows-1252 に従ったバイト列で構成されており、必要に応じて文書形式によって定義される Unicode符号位置を表すエスケープ表現を含むことがあります。

[14] 応用の内部では、これらのデータはUnicode符号位置の列として保持されます (参照符号化モデル)。 ただし、この Unicode符号位置はあくまでバイトの表現であり、 本来の Unicode文字の意味で使われているものではありません。

[15] 応用フォントを使って文字を表示します。フォント依存符号化の一般的な TrueType フォントは、実際には8ビット符号ではなく、 Unicode符号位置からグリフへの写像集合 (cmap) です。

[16] つまりフォント依存符号化は第一層として windows-1252バイトバイトたるUnicode文字の対応関係を定め、 第二層として当該符号がバイトたるUnicode文字文字との対応関係を定める2階層の構造であり、 しかも第一層の結果はただの文字列ではなく文書形式に依存する構文や escape を含んでいることがあります。

[17] HTML では Latin1 文字参照が使われていることがありますが、 本来の Latin1文字ではなく、フォントがその符号位置に割り当てている文字を表します。

[18] 同様に RTF では windows-1252文字を表す命令が使われていることがありますが、 本来の文字ではなくフォント文字を表します。

二階建ての多バイト符号

[19] 二階建ての8ビット符号と同様の要領で多バイト符号が使われることがあります。

[20] 8ビット符号の場合と違って第二層は EUC-CNBig5EUC-KR などの一般的な多バイト符号のことが多いです。

[21] 欧米東南アジアのような東アジア以外で20世紀末から21世紀初頭 (平成時代前半) 頃に使われた著述ソフトウェア (Webサイト提供サービス付属のものを含みます。) が生成した HTML文書でこの種のものがちらほら見られます。

上位層文字コードの container format としての文書形式

[24] フォント依存符号化では HTML (font) や HTML + CSS (font-family) や RTF や各種ワープロ文書形式などが、 フォント名の指定を通して実質的な文字コードの切り替え機能を持った一種の container format として使われます。

[25] フォント依存符号化が多く使われた地域や言語文字コードの変換の実装では、 こうした形式が文字コードの種別と組み合わさった入出力の不可分の性質として扱われることがあります。 本来 HTML はただのテキストファイルですが、 タグ等が文字コードの切り替え機能を持った複合的な構造として扱う必要があるのです。 文字コードの混在

[26] 特に重要になるのは、

のような状況を扱わなければならないことです。

[31] HTML + CSS のように外部ファイルにフォント情報が分離されていることもあるので、 注意が必要です。

[32] もし CSS が失われてしまって HTML のみが残っているとすると、 要素ごとに文字コードの判定を行って修復する必要が出てきます。

階層化されたデータにおける文字コードの判定

[33] 文字コードの判定の操作は、

... が考えられ、それぞれ実装手法や配慮するべき点が異なってきます。

最下層の判定

[37] 最下層は windows-1251, UTF-8, Shift_JIS などと判定する必要があります。 HTTP charset=""HTML <meta charset> などで適切に指定されている場合は問題になりません。 RTF のように文書形式から確定できる場合も問題になりません。

[39] なお x-user-defined も参照。

[38] 問題は適切な文字コードの指定がないときで、頻度解析等の手法によって決める必要が出てきますが、 文字の出現頻度を使った通常の推定手法で windows-1252Shift_JIS だと判定するのは困難な場合が多いです。

[40] 主要なフォント依存符号化の上層符号の出現頻度等には個別に対応してもいいのかもしれませんが、 すべてのフォント依存符号化に予め対応しておくのは困難です。

[41] <font face> によって既知のフォント依存符号化フォント名の指定がある場合が多いので、 これを prescan 同様の方法で検出し、その場合は windows-1252 と判定することでほとんどは対応可能です。

[42] CSS で指定されている場合は難度が上がります。外部CSSでの指定だと、アーキテクチャー的に判定に利用不能なことも多いと予想されます。 幸い CSSフォントが指定されているような比較的新しい文書だと iso-8859-1, windows-1252, x-user-defined, utf-8 のような charset の指定が入っていることが多く、 頻度解析等の手法による推定は不要かとも思われますが、 十分な量の事例を収集した研究が必要です。

escape された HTML 文書の判定

[43] windows-1252文字文字実体参照数値文字参照で記述された HTML文書がその実、フォント依存符号化8ビット符号だったり、 多バイト符号だったりすることが、 アジアではよくあります。

[44] フォント名が明示されたフォント依存符号化ならフォントを頼りに判定すれば良いのですが、

だったりすることがあります。 >>45 は特に <font face> が一般化する前の古い時代の文書に見られます。

[47] こうしたものは文字参照復号したバイト列に対して文字コードの判定の処理を行って本来の文字コード情報を補う必要があります。

UTF-8 のフォント依存符号化の判定

[48] UTF-8ビルマ文字が使われている場合、 フォント依存符号化 (主に Zawgyi) かどうかを判定する必要があります。 ビルマ文字の文字コード

[49] HTML などフォント名が明示されていればそれを頼りに判定すれば良いのですが、 SNS動画サイトなどでは専用フォントが指定されておらず、 投稿者や時代によって違うことがあります。

[50] また、 Zawgyi外部CSSによるフォント指定が一般化した時代に入ってからも非常によく使われていたので、 HTML文書自体にはフォント情報が入っていないことも多いので注意が必要です。 動的な内容であることも考えられます (>>51)。

動的な内容の処理

[51] フォント依存符号化文字は、 静的な HTML文書に記述されているものだけとは限りません。 JavaScriptDOM 操作によって挿入される文字列のことがあります。

[52] このため一般の HTML文書文字コードの判定文字コードの変換の処理はテキストファイルとしての HTML ソースコードに対して行うのではなく、 Webブラウザーで表示されているある瞬間の DOM木に対して行う必要があります。

外字

[53] ひとくちに外字といっても多種多様なものがあります。 外字 その中には地域や分野で標準的な地位を得ているものもあり、 それを適切に処理するためには外字の種別を判定して適切なフォントを適用する必要があります。

[54] ところが外字にはフォントの指定がないことがほとんどで、 内字の補充という性格上1つの文書中にごくわずかにしか含まれないことが多く、 判定の難易度はかなり高いです。

[55] 外字Web 上でひっそりながら相当数流通している PUA, EUDC にも関わらず、 その全体像は誰も把握しておらず、文字化けするのも当然と思われているところがあり、 Webブラウザー事業者らも冷淡です。これをどう扱うかの研究もほとんど行われていないようです。

[56] 分野によってよく使われており、判定能力があると良さそうなもの:

関連

[9] 関連: 文字コード, 字母, 文字コードの変換, 文字コードの判定, 文字コードの修復

メモ