文字コード関連

リンク

METAタグでの設定

  • HTMLの記述で以下のように設定します。
    <HTML>
    <HEAD>
    <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Shift_JIS">
    <TITLE></TITLE>
    </HEAD>
    <BODY>
    </BODY>
    </HTML>
  • ルールとして「HEADタグ内に書く」「-METAタグ指定より前に日本語を使わない」こと。
    TITLEタグなどに日本語を使うと、文字を認識する前に表示するため文字化けになりかねません。
    指定するまではASCIIコード以外の文字を使わないことが望ましい。
  • 文字コードによって charset= 以降を書き換えます。
    • シフトJIS(Windows系列など)
      <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Shift_JIS">
      • charset=x-sjis は古い書式なので文字化けします。
      • charset=Shift-JIS も間違いです。
        区切りはハイフン "-" ではなくアンダーバー "_" です。
    • EUC
      <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=euc-jp">
      • charset=x-euc-jp は古い書式なので文字化けします。
    • UTF-8
      <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
      文字コードcharset補足
      ACSIIコードus-ascii半角英数記号のみ
      シフトJISShift_JISWindows系で主に使われる
      x-sjis古い書式なので使うべきではない
      日本語EUCEUC-JPUNIX系で主に使われる
      x-euc-jp古い書式なので使うべきではない
      UTF-8UTF-8普及し始めている
      JISISO-2022-JP主にメールで使われる

よくある間違い

  1. ダブルクオートで囲む範囲の間違い。
    以下は間違いです
    • 囲む範囲の間違い
      <META HTTP-EQUIV="Content-Type" CONTENT="text/html;" charset="euc-jp">
      charsetはMETAタグのパラメータではなく、CONTENTパラメータの内容の一部です。
      <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=euc-jp">
      上の青文字の部分のようにすべてCONTENTパラメータの内容として一括して囲む必要があります。
    • 囲んでいない
      <META HTTP-EQUIV="Content-Type" CONTENT=text/html; charset=euc-jp>
      ダブルクオートで囲まれていないため CONTENT= CHARSET= という別のパラメータとして解釈されてしまいます。
    • 閉じ忘れ
      <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=euc-jp>
      CONTENTの内容が不明になります。おそらくまともに識別できないため文字化けします。
  2. 文字コード名の間違い
    • ハイフン "-" とアンダーバー "_" の間違えている
      EUC_JP Shift-JIS UTF_8 ISO_2022_JP
      以上の文字コード名はすべてハイフンとアンダーバーを間違えています。
      おかしな名前で文字コードを指定すれば当然、おかしな動作をするため
      指定しないほうがマシという状況にもなりかねません。
    • 古い書式を使っている
      <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=x-sjis">
      <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=x-euc-jp">
      Shift_JISやEUC-JPではなくx-sjis x-euc-jpでないと正しく認識できないブラウザもあります。
      しかし、それは10年くらい前に使われていたとても古いブラウザです。
      x-sjis x-euc-jp を使い続けると現行のブラウザで文字化けを起こすことになります。

ASCIIコード

  • 1バイト文字コード。0x00〜0x7f の 7bit で表わすため7bitコードとも言う。
    ほとんどの文字コードがこれを参考にしている。
    0x00〜0x1f に制御文字、0x20〜0x7e に英数字と記号、
    0x7f にDELを表わす制御文字の合計128文字で成り立っている。
    0x20 の半角スペース(空白文字)は解釈次第では制御文字になる。

JISコード

  • 主に JIS X 0202 を指す。

JIS X 0201 (ANKコード)

  • Alphabetic Numeric and Kanaを意味するANKからわかるように
    半角英数字と半角記号、半角カナで構成される1バイト(7bit,8bit)文字集合。
    かなり大雑把に言うとANKコードはASCIIコード+半角カナ。
    • 7ビット:0x00(0000 0000)〜0x7f(0111 1111)の7ビットで表わす範囲。
      ASCIIコードの範囲である英数字などを表わす、ローマ字モードとして扱う
      ただし、バックスラッシュが円記号、チルダがオーバーラインとして定義されている。
    • 8ビット:0x80(1000 0000)〜0xff(1111 1111)の8bitで表わす範囲。
      このうち 0xa1〜0xdf の範囲に半角カナ文字が割り当てられたカナモードとして扱う。

JIS X 0202 (ISO/IEC 2022, ISO-2022-JP, JIS漢字)

  • 主に日本でJISコードと呼ばれる文字コード集合。
  • メールの送信時の文字コードとして使われている。
  • エスケープシーケンスで明示することでそれ以降の文字をローマ字/日本語のように切り替えることができる。
    これによって同じ範囲で重複した別の文字でも正しく認識させることができる。
    • ここで言う ESC は文字コード0x1b のエスケープコード。
      例えば ESC$B で JIS X 0208 に切り替え、
      ESC(J で JIS X 0201 の 8ビットコード(半角カナ)に切り替える。
      文字コード意味シーケンス
      ASCII
      ISO/IEC 646 IRV
      半角英数字ESC(B
      JIS X 0201 ローマ字(旧)JISローマ字ESC(H
      JIS X 0201 ローマ字1976JISローマ字ESC(J
      JIS X 0201 半角カナ1976JIS半角カナESC(I
      JIS X 02081978(旧)基本漢字ESC$@
      JIS X 02081983基本漢字ESC$B
      JIS X 02121990JIS補助漢字ESC$(D
      JIS X 0213 第1面2000(旧)JIS拡張漢字ESC$(O
      JIS X 0213 第1面2004JIS拡張漢字ESC$(Q
      JIS X 0213 第2面2004JIS拡張漢字ESC$(P
      シフトイン半角カナの制御0x0f
      シフトアウト半角カナの制御0x0e
  • JIS X 0201、JIS X 0208を内包した ISO 2022-JP が拡張され、
    現在は JIS X 0212、JIS X 0213 も含めたISO-2022-JP-2004 となっている。

JIS X 0208 (JIS基本漢字, 第1・第2水準漢字)

  • 一般的な全角文字の集合。
    −ひらがな、カタカナ、記号、よく使われる第1水準漢字、
    あった方がよい第2水準漢字の一部などが含まれている。

JIS X 0212 (JIS補助漢字)

  • JIS X 0208 であまり使われない文字の集合。
  • 第3水準漢字と一般的ではない記号などが含まれる。

JIS X 0213 (JIS拡張漢字, 第3・第4水準漢字)

  • JIS X 0208 で不足している漢字を補う形の文字集合。
  • 第3水準漢字、第4水準漢字が含まれる。
    一部 JIS X 0212 と重複する漢字もある。

JIS X 0221 (UCS, ISO/IEC 10646)

  • 世界中の文字を16ビットで表わす文字にまとめようという規格。
    Unicode と同じ方向性のため UCS-2 に取り込まれる。
  • #Unicode

Shift JIS (MS漢字コード)

  • マイクロソフト系のOSで使われている文字コード。
  • 半角英数字、半角記号、半角カナによるANKコードを元に
    2バイト漢字にも対応させた文字コード集合。
    空いている 0x80〜9Fまでと、0xE0〜FE の範囲を2バイト漢字の1バイト目に使っている。

文字化けの話

  • 2バイト文字の2バイト目は1バイト文字の 0x00〜7F の範囲と一部重複している。
    エスケープシーケンスに使われる \ (0x5C) との誤認を起こしやすい。
  • \t \n \2 \3 のようにプログラムでは \ に続く1文字は
    特殊な意味を持つもの(エスケープシーケンス)として扱われます。
    \n が改行文字、\t がタブ文字などに置き換えられ、
    特殊な意味を持った \ に続く文字がない場合は \! が ! のように置き換えられるのが一般的です。
    • シフトJIS文字列 "ウソ800" のような文字列は
      文字コード8345835C383030
      1バイト文字?E?\800
      2バイト文字800
      ※表示できない文字は?で代用しています)。
      5C 38 の部分がエスケープシーケンス \8 と解釈されてしまい、8に変換されます。
      結果的に文字列は "ウ・00" のようになります。
      置き換え後
      文字コード834583383030
      1バイト文字?E?800
      2バイト文字?00
    • 文字化けしないためにはデータをEUCやUTF-8などで記述するべきです。
      それでもあえて使うには"ウソ\800" のように2バイト目に問題のある文字の後に \ を挟んで内部的な \\ にします。
      エスケープシーケンス \\ は \ に置き換えられるため文字化けせず正しく表示されます。
      文字コード8345835C5C383030
      1バイト文字?E?\\800
      2バイト文字\800

      置き換え後
      文字コード8345835C383030
      1バイト文字?E?\800
      2バイト文字800
  • \を含む2バイト文字
    文字コード文字コード文字コード
    0x90 0x5C0xE0 0x5C
    0x81 0x5C0x91 0x5C0xE1 0x5C
    0x92 0x5C0xE2 0x5C
    0x83 0x5C0x93 0x5C0xE3 0x5C
    Ы0x84 0x5C0x94 0x5C0xE4 0x5C
    0x95 0x5C0xE5 0x5C
    0x96 0x5C0xE6 0x5C
    0x87 0x5C0x97 0x5C0xE7 0x5C
    0x98 0x5C0xE8 0x5C
    0x89 0x5C0x99 0x5C0xE9 0x5C
    0x8A 0x5C0x9A 0x5C0xEA 0x5C
    0x8B 0x5C0x9B 0x5C
    0x8C 0x5C0x9C 0x5C
    0x8D 0x5C0x9D 0x5C0xED 0x5C
    0x8E 0x5C0x9E 0x5C0xEE 0x5C
    0x8F 0x5C0x9F 0x5C

EUC

  • UNIX系のOSなどで使われている文字コード。
    同じEUCコードでも割り当てる文字が国ごとに異なる。

EUC-JP

  • 日本語EUCと呼ばれるもの。
    1バイト文字の範囲にASCIIコードを含むが、半角カナは2バイト文字で表わす。
    ASCIIコード以外をすべてマルチバイト文字(2〜3バイト)で表わしている。
    Shift JISと違って1バイト文字の範囲と重ならないため、文字化けは起きにくい。

Unicode

  • 全世界の異なる言語を一意で表わすことを前提とした文字コード集合。
  • U+0061 のように表わす。
  • 1文字を2バイトで表わすUCS-2、4バイトで表わすUCS-4などがある。
    これらは既存の文字コード体系との互換性はないが、
    UTF-8などのエンコード方式によってはASCIIコードとの互換性が保たれている。

群・面・区・点

  • オクテット(バイト)ごとに区切られ、群オクテット・面オクテット・区オクテット・点オクテットに分類される。
  • UCS-4では4ビットの群・それぞれ8ビットごとの面・区・点に分類され、
    UCS-2では第0群・第0面に固定された8ビットごとの区・点に分類され、
    Unicodeでは第0群・第0〜16面と、8ビットごとの区・点に分類される。
    文字コード表現範囲実装範囲
    Unicode00〜160〜2550〜2551,114,112同一
    UCS-2000〜2550〜25565,53663,488
    予約領域2,048を除く
    UCS-40〜1270〜2550〜2550〜2552,147,483,6481,114,112
    Unicodeの範囲に限定
    • UCS-2ではUnicodeを表わしきるには不足している。
    • UCS-4ではUnicodeの範囲外となる第0群・第17面以降には永久に文字を追加しないことに決まった。
      つまりかなり余白ができたが、UCS-4の表現範囲はUnicodeの範囲と同じである。
  • それぞれの最初の第0面を基本多言語面(BMP)と呼ぶ。

BMP (基本多言語面, Basic Multilingual Plane)

  • 第0群・第0面に割り当てられた16ビットで主要な文字を表わす文字集合。
    よく使われる文字の大半が割り当てられている。
  • UCS-2はBMPの範囲と同一。

BOM (Byte Order Mark)

  • UTF-16で使われている先頭の識別コード 0xfeff。
    ビッグエンディアンなら 0xfe 0xff のバイト列で保存され、
    逆順のリトルエンディアンなら 0xff 0xfe のバイト列で保存されるので
    BOMが最初に挿入されていることでエンディアンを判別できる。
  • UTF-8にはエンディアン問題がないのだが、0xefbbbf の3バイトのBOMを使うこともできる。
    BOM無しの UTF-8 をUTF-8N と呼ぶこともあるらしい。
    Windowsのメモ帳でUTF-8で保存するとBOMが挿入されるようだ。
  • 単純にUnicodeであることを示すためのヘッダとして用いられることもある。

UCS-2 (Universal Multiple-Octet Coded Character Set in 2 octets)

  • 1文字を2バイト(16ビット)でUnicodeを表わす文字コード集合。
    BMP の文字集合そのものが該当する。
  • ビッグエンディアン、リトルエンディアンの二種類がある。
  • ASCIIコードとの互換性はなく、0〜1Fhの制御文字の範囲も利用している。

UCS-4 (Universal Multiple-Octet Coded Character Set in 4 octets)

  • 1文字を4バイト(32ビット)でUnicodeを表わす文字コード集合。
    UCS-2(BMP)を含み、それに不足している文字が追加されている。
  • ASCIIコードとの互換性はなく、0〜1Fhの制御文字の範囲も利用している。

UTF-8 (Unicode Transformation Format-8, UCS Transformation Format 8)

  • Unicodeを表わすために使われるエンコード方式。
    文字を導き出すための索引のような8ビット列が先頭についている。
  • UCS-2の範囲の文字をカバーしており、ASCIIコードを8ビット、それ以外を16〜32ビットで表わす。
  • Unicode で定義された規格 Unicode Transformation Format-8
    UCS で定義された規格 UCS Transformation Format 8 がありどちらもUTF-8と呼ばれる
    前者は4バイト、後者は6バイトの範囲を扱うように想定されているが、
    2006年に4バイトの範囲しか使わないように規定されたため同じ物と考えてよい。
  • 8ビットを使った索引から文字コードを導き出す。
    0〜7Fhの7ビットまではASCIIコードに対応し、
    80〜FFhはそれぞれ2〜6バイトの日本語や他国語の文字や記号に対応している。
    • コードポイントと呼ばれるこの先頭ビット
      0xxx xxxx がASCIIコード
      110x xxxx が2バイトコード
      1110 xxxx が3バイトコード
      1111 0xxx が4バイトコード
      1111 10xx が5バイトコード
      1111 110x が6バイトコード
      トコード このように先頭ビットが0なら1バイトASCIIコード、
      それ以外は 110x xxx が2バイトのように先頭ビットがバイト数を示している
    • 先頭 10xx xxxx で始まるコードは先頭バイトに続く2〜5バイト分のデータとなる。
      10xx xxxx が2バイト目以降のコード
      最長6バイトの文字を表わすには 1111 110x の後に 10xx xxxx が5バイト続く
      1111 110x 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx 10xx xxxx
  • BOMを先頭3バイトに用いることでUnicodeのUTF-8であることを示す。
    BOMを用いない場合は UTF-8N と呼ばれることがある。

UTF-16

  • Unicodeを表わすために使われるエンコード方式。
    文字を導き出すための索引のような16ビット列が先頭についている。
  • UCS-2の範囲を16ビットで表わし、UCS-2に不足しているUCS-4の範囲の文字を16+16ビットの対で表わすサロゲートペア方式を使っている。
  • ビッグエンディアン、リトルエンディアンで表わすことができ、
    BOMを先頭2バイトに用いてエンディアンを識別する。

UTF-32

  • Unicodeを表わすために使われるエンコード方式。
  • UCS-4(31ビット)の文字を32ビットの固定長で表わす。
    UCS-4と同じと考えてよい。

改行コードの話

  • OSごとに改行文字は異なる。
    複数のOS間でデータをやり取りするためには文字コードの違いの他に
    改行文字の違いも想定する必要がある。
    OS文字コード
    マイクロソフト系OSCR+LF0x0D 0x0A
    マッキントッシュOSCR0x0D
    UNIX系OSLF0x0A

MSのバイナリモードとテキストモード

  • マイクロソフト系OSのファイル操作には「バイナリ」と「テキスト」という2つのモードがある。
    • バイナリモードはファイルをそのままデータとして読み書きする。
      他のOSは基本的にこれ。
    • テキストモードはファイルを読み込む際にファイル内のCR+LFをLFに自動的に変換してデータを受け取る。
      そしてファイルへの書き込み時にはデータ内のLFをCR+LFに変換してファイルに書き込む。
      PerlをWindowsで動かすとデフォルトではテキストモードのため、
      画像や音楽ファイル内の改行文字までも勝手に置き換えてデータを台無しにすることもある。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規新規下位 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-04-14 (木) 16:43:38 (2318d)