タイル画像のズームについて

概要

地理院タイルの画像を並べて表示し、ズームイン/ズームアウトの機能を実装したときの整理。マウスカーソルを置いた位置を固定して、そこを中心にズームイン/ズームアウトをするのにちょっと手間取った。

基本の考え方

共通する考え方は以下の通り。

  1. マウスクリック位置を記録する
  2. 拡大/縮小対象のタイルを拡大/縮小し、マウス位置もそれに合わせて変換
  3. 変換後の位置がマウス位置に重なるよう、タイルを平行移動

なお地理院タイルではタイルそのものを表す「タイル座標」を定義しているが、ピクセルの座標との区別を明確にするため、ここでは「タイルアドレス」と表現し、ピクセル単位の座標を「ピクセル座標」と表現する。

ズームインの場合

ズームインの場合、マウス位置がタイルの左側か右側か、上側か下側かによって拡大するタイルやスライドの方向・量が異なる。以下ではxとyがともに左・上、右・下のケースで整理しているが、xとyは独立に判定してよい。

マウス位置がタイルの幅/高さの半分未満の時

下図の緑色のタイルが現在表示されているタイルでタイルの幅をw、高さをhとする。また黒い点(x, y)をマウス位置とする。位置(x, y)はタイル左上の点からのオフセットで表しているが、タイルを表示するcanvasなどの座標に相当する。

タイルアドレスをr/cとして、マウス位置がタイルの幅/高さの半分より左/上の場合を考える。拡大するタイルはr/cに対して青いタイル2r/2cで、拡大前の幅w/2、高さh/2が2倍になり、元のタイルと同じサイズになる。

拡大後のタイルでは、マウス位置(x, y)にあった地上の位置はタイルの拡大につれて(2x, 2y)となる。マウス位置(x, y)は拡大後のタイル上でも同じ。

拡大後の地上の位置を元の位置に合わせるためタイルをスライドさせる。スライド量は(2x, 2y)と(x, y)の差(x, y)で、スライド方向は左上の方向。

マウス位置がタイルの幅/高さの半分以上の時

元のタイルr/cに対して拡大するタイルは2r+1/2c+1となる。また、拡大するタイル内での地上位置のオフセットは(x – w/2, y – h/2)となる。

タイルを拡大すると、地上の位置のオフセットは(2x – w, 2y – h)となる。マウス位置は(x, y)のまま。

地上の位置をマウス位置に合わせるためタイルをスライドさせる。スライド量は(x, y)と(2x – w, 2y – h)の差で(w – x, h – y)。スライド方向は右下の方向。

ズームアウトの場合

ズームインの場合、タイルアドレスが偶数か奇数かによって縮小するタイルやスライドの方向・量が異なる。以下ではxとyがともに偶数/基数のケースで整理しているが、xとyは独立に判定してよい。

タイルアドレスが偶数の場合

緑色のタイルが現在表示されているタイルで、アドレスが偶数の場合、縮小するタイルは右/下方向に広がった青いタイルr/c。その幅・高さは2w、2cから半分のw、cとなる。サイズが半分になる前の地上位置のオフセットは、(x, y)。

ここではタイルのサイズを上の図の2倍のサイズで描いている。タイル縮小後の元の位置は、タイル幅/高さが1/2になるのに伴って(x/2, y/2)となる。マウス位置(x, y)は元のまま。

地上の位置をマウス位置に合わせるためタイルをスライドさせる。スライド量は(x, y)と(x/2, y/2)の差で(x/2, y/2)。スライド方向は右下の方向。

タイルアドレスが奇数の場合

緑色のタイルが現在表示されているタイルで、アドレスが奇数の場合縮小するタイルは左/上方向に広がった青いタイルr/c。縮小するタイル上での縮小前の地上位置のオフセットは(x + w, y +h)

ここではタイルのサイズを上の図の2倍のサイズで描いている。タイル縮小後の元の位置は、タイル幅/高さが1/2になるのに伴って((x + w)/2, (y + h)/2)となる。マウス位置(x, y)は元のまま。

地上の位置をマウス位置に合わせるためタイルをスライドさせる。スライド量は((x + w)/2, (y + h)/2と(x/2, y/2)の差で((w – x)/2, (h – y)/2)。スライド方向は左上の方向。

 

地理院タイル

概要

国土地理院により、ラスタータイプのタイル地図が「地理院タイル」として提供されている。その仕様についてまとめてみた。

地理院タイルの考え方

地理院タイルは、地球全体をメルカトル投影により正方形化し、それがズームレベルに従って辺長1/2のエリアに分割されていく。

  1. 経緯度表現の全球をメルカトル投影により変換
  2. 投影後の形が正方形になるよう南北を制限
  3. 投影後正方形の地球全図をズームレベル0とする
  4. その後順次、同じ範囲に辺長を1/2の正方形が収まるよう分割

具体のタイル

具体の地理院タイルとタイル座標はタイル座標確認ページで確認できる。最小ズームレベル2で表示すると以下のように横長く表示されるが、正方形の世界全図が経度方向に繰り返されているのがわかる。

たとえば2/1/3のタイルの場合、ズームレベルが2、タイルのx座標、y座標がそれぞれ1、3ということになる。

ズームイン

ズームレベルを日本付近で上げていくと詳細な地図に変化していく。以下は首都圏付近のズームレベル9のタイル。首都圏中心部のタイルは454/201となっている。

最大ズームレベル18のタイルまで準備されている。以下は日本水準原点付近のタイルの例。

日本付近ではズームレベル18まで準備されているが、それ以外の地域で準備されているタイルはズームレベル8まで。以下は与那国島~台湾付近を順次拡大していった様子。

タイル座標

たとえばズームレベル2の場合、タイル座標は0/0~3/3、縦4×横4の16タイルで構成されている。ズームレベルが3になると、タイル座標は0/0~7/7、縦8×横8の64タイルで構成されている。

つまり、ズームレベルがzのとき、タイル座標は0~2z、タイルの枚数は2z×2z=22z枚ということになる。

タイルの取得

以下のURLを指定して、地理院サイトからタイル画像を取得することができる。

{t}は「データID」で、標準地図ならstd、単色地図ならpaleなどのコードが与えられている。{z}はズームレベル、{x}{y}はタイル座標値、{ext}は拡張子で、たとえば標準地図や単色地図ならpng

タイルピクセル

タイルサイズは、ズームレベルに関わらず256ピクセル×256ピクセルとなっている。

たとえばズームレベル2の場合は縦横256×4=1024ピクセルで構成され、ズームレベルが3になると縦横256×8=2048ピクセルでズームレベル2の時の倍のピクセル数となる。

一般にズームレベルzのとき、全球地図の縦・横のタイルピクセル数は256×2zとなり、ズームレベルが1つ上がるごとに倍になっていく。

タイル座標とタイルピクセル位置の関係

タイル座標とタイルピクセル位置の関係は、int(タイルピクセル位置/256)となる。そしてタイルピクセル位置からタイル座標値の256倍を引いた値(タイルピクセル位置を256で割った剰余)は、そのタイルピクセルを含むタイル内でのピクセルのオフセット位置になる。

たとえばズームレベル2の場合、(896, 448)のピクセルが属するタイルは3/1となり、このタイル内でのピクセルのオフセットは(128, 192)となる。

 

QGIS3 – 都道府県区域への融合

概要

国土数値情報で読み込み市区町村単位でマルチパート化したポリゴンを、都道府県単位にまとめる。

複数のポリゴンの接する境界をなくしてひとつながりのポリゴンとするため、Dissolveという処理を行う。

令和4年度の行政区域データでは「無効なジオメトリ」のために処理ができなかったため、これを無視する手順も記録した。

Dissolve処理~無効なGeometryで停止

Dissolve(融合)はメニューの「ベクタ」→「融合(dissolve)」を選択する。

すると以下のようなダイアログが表示される。

ここでポリゴンを融合するキーを選択するため、「基準となる属性」を選んでいく。右にある”…”をクリックするとパラメーター選択の表示になるので、都道府県の属性N03_001にチェックを入れてOKをクリック。

もとのダイアログに戻るので「実行」ボタンをクリック。ところが、この時点で以下のようなエラーが出て処理が停止した。

無効なジオメトリがあるので処理が停止したとのこと。これを確認してみたが、無効な部分を最大に拡大しても特に交差しているなどの形は見られなかった。

無効なジオメトリーの無視設定

ここではプロセッシングツールで無効なジオメトリーを無視するよう設定した。この設定では無効なジオメトリーを修正はせず、無視して実行が続けられる。

都道府県単位の融合結果

上記の設定後にDissolve処理を実行すると、警告は表示されるものの処理は続行されて完了。以下のように都道府県単位にポリゴンがまとめられた。

なお、新たにまとめられた都道府県のポリゴンが入っているレイヤーが作成されるが、一時レイヤーの場合はこれを保存しておく。

属性テーブルを確認すると、以下のように都道府県に対応する47個のオブジェクトにまとめられている。

ただしまとめられたオブジェクトの属性は、たまたま先頭にあったレコードのものが用いられる。このため自治体コードは市区町村のものだったり、NULLであったりする。

 

QGIS3 – 無効なジオメトリ―の無視

Dissolveで停止

QGISで国土数値情報の行政区域を市区町村単位でマルチパート化し、都道府県単位に融合しようとしたところ、以下のような警告が出て処理が停止した。

メニューから「ベクタ」→「ジオメトリツール」→「有効性チェック」で無効な部分を表示させたが、最大限拡大しても交差等の異常は見つけられなかった。

そこで、次の方法で無効なジオメトリ―を無視して処理を続行させるように設定したところ、Dissolveが完了した。

無効なジオメトリーの無視

まず、メニューから「プロセッシング」→「ツールボックス」を選択。

すると画面右側にプロセッシングツールが表示されるので、オプションアイコンをクリック。

オプションの「無効な地物のフィルタリング」が、デフォルトでは「・・・アルゴリズムの実行を停止する」になっているので、これをダブルクリックして「不正なジオメトリの地物を無視」を選択する。

そして再度Dissolveを実行すると、以下のように警告がずらりと表示されるが、処理は進んでいく。

そして都道府県単位での融合が完了した。

無効なジオメトリーの確認

ただし無効なジオメトリーは修正していないので、都道府県境界上にそのような個所があれば、無効な状態のまま残っている可能性がある。

ベクタ→ジオメトリツール→有効性チェックで確認したところ、無効なジオメトリーや「不正なジオメトリの出力レイヤ」と「エラー部分の出力レイヤ」には何も存在しなかった。

 

 

QGIS – 行政区域データ – マルチパート化

概要

同じ基礎自治体(市区町村)に島や飛び地がある場合、複数のポリゴンが同一の市区町村名を持つ。国土数値情報から行政区域データを読み込んだ段階では、これらは別々のオブジェクトとなっている。

一つの市区町村に複数の領域がある場合、市区町村単位でこれをまとめて扱いたい。このようなときは、同じ属性を持つ地物を一つにまとめて扱うマルチポリゴン化を行う。

一つの市区町村に複数の領域がある例

埋立地

碧南市はシンプルな例で、本体のエリアのほかに海上の大きな埋立地がある。これらは属性テーブルでは2つのデータに分かれている。

以下は本体の方。

こちらは埋め立て地の方で属性は全て上と同じだが、異なるIDを持つ別の地物となっている。このような例は、埋め立て地のほか大規模な堤防にも見られる。

島や岩場

日本の海岸によくある例で、沿岸に島・岩が多数あり、それらが同じ市区町村の領域となっている。細かい多数の岩が全て館山市の区域。

飛び地

府中市に接する小金井市の中にある東京自治会館だけ、府中市の飛び地となっている。黄色い区域の周りは小金井市、そのすぐ左・下に府中市の本体がある。

市区町村区域のマルチポリゴン化の概要

上記のような島や飛び地など複数のポリゴンを一つのオブジェクトとしてまとめるために、マルチポリゴン化を行う。

その手順中、マルチポリゴンでまとめるキーの属性を指定するが、市区町村単位でまとめた場合、所属未定地の扱いと同名市区町村が問題となる。

所属未定地・同一区名・政令市の扱いの問題

所属未定地の問題

現状のままで市区町村名をキーにしてマルチポリゴン化すると、全都道府県の「所属未定地」が1つのオブジェクトになってしまう。

たとえば以下のように千葉県に1箇所、所属未定地があることがわかる(ここでは属性名をAliasで付け直している)。

また東京都には多くの境界未定地が存在している。

このままmunicipalityをキーとしてマルチポリゴン化すると、千葉県・東京都その他すべての都道府県の所属未定地が一つにまとめられてしまう。

これを都道府県ごとの所属未定地とするためには、都道府県名(prefecture)と市区町村名(municipality)をつなげた属性を新たに設ければよい。

同名市区町村の問題

同一名称の市区町村は多数あって、たとえば「池田町」は北海道・福井県・長野県・岐阜県に存在する(2022年時点)。また東京都の特別区や政令市の区の名前もここに現れるが、北区や緑区などは複数存在する。

さらに、同一県内に同名の市区町村が存在する場合もある。たとえば神奈川県横浜市と相模原市の両方に緑区があり、横浜市と相模原市のいずれにも南区がある。このためmunicipalityだけでマルチポリゴン化すると、緑区や南区が1つにまとめられてしまう。

この場合はprefecturemunicipalityだけでは不十分で、政令市名が入るcity_or_countyも含める必要がある。

政令市の扱いの問題

地理院のデータでは政令市内の区が一般の市町村と同じに扱われている。この構造でそのままマルチポリゴン化すると政令市が1つの自治体として扱われず、区単位に分けられる。

政令市を区で分けずに他の市区町村と同じように扱いたい場合には、以下のような新たな属性を設け、それをキーとしてマルチポリゴン化する。

  • city_or_countyが政令市の場合、prefecturecity_or_county
  • cyty_or_countyNULLか郡名の場合、prefecturemunicipality
    • ここでは同一都道府県内で政令市の区以外に同名の市区町村名は存在しないことを前提としている

新たな属性の追加

ここでは所属未定地、政令市の扱いについて以下のような仕様とする。

  • 所属未定地は都道府県単位でまとめる
    • 例:北海道所属未定地 など
  • 政令市は区で分けず、一般市区町村と同じ行政区として扱う
    • 例:北海道札幌市、北海道函館市・・・など

この条件でマルチポリゴン化するため、以下の手順で新たな属性を追加する。

  1. レイヤー右クリックでレイヤプロパティダイアログを開く
    1. 左の属性タブ選択
    2. 新規フィールドアイコンでフィールド追加し、フィールド名等を設定
    3. 必要なら属性フォームタブでAilias設定
    4. OKボタンクリック
  2. レイヤー右クリックで属性テーブルを開く
    1. フィールド計算機アイコンでフィールド計算機ダイアログを開く
    2. 既存フィールド更新で、作成したフィールドを選択
    3. フィールドの計算式を入力
    4. プレビューを確認して、よければOKボタンをクリック

以下はフィールド計算機ダイアログの入力状況。計算式でCASE文を使っている。

これを反映した属性テーブルは以下の通り。都道府県名+所属未定地となっていて、政令市と一般市が同列に扱われている。

この段階で編集後の属性テーブルを、「編集内容の保存」アイコンで保存すると、1~2分ほどかけて保存される。その後、プロジェクトを保存しておく。

マルチポリゴン化の実行

マルチポリゴン化を実行するには、メニューから「ベクタ」→「ジオメトリツール」→「シングルパートをマルチパートに集約」と選択していく。

ダイアログが表示され、マルチポリゴン化が実行される。実行は瞬時に終わり、下のプログレスバーは0%だがこの時点で実行は終了している。マルチポリゴン化されたオブジェクトは新たに作成された出力レイヤーに保存される。

出力レイヤーを右クリックして属性テーブルを表示させると、政令市・一般市区町村ごとに1つのレコードとなっている。

先に例示した館山市の海岸部を見てみると、細かな一つ一つの岩が館山市として認識されている。

スクラッチレイヤーの保存

ここまでの状態ではマルチパート化された行政区画があるレイヤーは一時的なスクラッチレイヤーとなっている。継続的にこのレイヤーを使うためには、レイヤーを保存しておく必要がある。

スクラッチレイヤーの場合、レイヤーの右側にアイコンが出るので、それをクリックして、GeoPackageファイルの保存場所を指定して保存する。デフォルトでは、ファイル名がレイヤー名として自動的に初期設定される。

 

QGIS3 – 行政区域データ – 読み込み

概要

QGISに行政区域データを読み込む。データソースは国土地理院による国土数値情報(Digital National Land Information)を用いる。

データのダウンロード

  1. 地理院の国土数値情報ダウンロードサービスに行く
    • デフォルトのデータ形式はShape

スクロールして「2.政策区域」→「行政地域」をたどり、「行政区域(ポリゴン)」をクリック。

ダウンロードしたい地域を選択。今回は「全国」をクリック。

各都道府県・全国のデータごとに各年度のデータが登録されている。3~4年ごとにデータ容量が1.5~2倍に増えていて、最新のR4年度版では700MBを超えている。

ダウンロードしたZIPファイルを展開したところ。容量が2.4GBになっている。

データの読み込み

QGISのメニューで、「レイヤ」→「レイヤを追加」→「ベクタレイヤを追加」を選択。

ダイアログが開くので読み込みの設定。

  • ソースタイプは「ファイル」のまま
  • 文字コードはShift_JIS
  • ファイルの場所を入力
  • 「追加」ボタンをクリック

すぐにレイヤーが追加されて、市区町村単位の行政界が表示される。

内容の確認

地理院サイトの子のデータの説明に以下のクラス図が掲載されている。

レイヤーを右クリックして「属性テーブルを開く」を選択し、属性テーブルを表示させる。

冒頭には各都道府県単位のデータが、都道府県名以外の内容がNULLとして登録されている。

下の方にスクロールすると、振興局名・郡政令都市名・市区町村名と行政区域コードが表れてくる。以下のような対応になっていることがわかる。

  • N03_001:振興局名
  • N03_002:郡政令都市名
  • N03_003:市区町村名
  • N03_004:行政区域コード

一般的な県内の郡・市町村は以下の通り。

項目名の変更

属性テーブルの項目名がそのままではN03_001のような記号表現になっているが、これを変更したいときには、別名(Alias)使うのが簡単。項目名変更の手順はこちらにまとめている。

 

QGIS3 – インストール

ダウンロードとインストール

OSGeo版ではなく、長期リリースのパッケージ版のインストール。

  1. QGISのダウンロードサイトに入り、長期リリース(最も安定)をダウンロード
  2. 約1GBのmsiファイルがダウンロードされるので、これを実行してインストール

動作確認

地理院タイルを表示させて動作確認。

 

QGIS3 – 地理院タイルの表示

概要

国土地理院のベースマップのタイルに接続して表示させる方法。

新規接続

QGISの”XYZ Tiles”で「新規接続」を選択。

XYZ接続のダイアログが表示される。ここで接続先のURLや名前を指定する。

接続先の確認

国土地理院の「地理院タイル」のページに入り、ベースマップの標準地図のリンクをクリック。上部にURLが表示されるのでこれをコピー。

接続先の指定

XYZ接続のダイアログに、コピーしたURLをペーストし、接続名やズームレベルも指定してOKボタンをクリック。

接続が登録されるので、これをレイヤーに追加する。

地理院タイルのベースマップ、標準地図が表示された。

Python3 – WebAPI

概要

PythonでWebAPIによってデータをリクエストして取得する方法をまとめる。ここでは郵便番号配信サービスのzipcloudのAPIを利用する。

流れは以下の通り。

  1. 準備
    1. urllib.requestライブラリーのインポート
    2. APIエンドポイントURLのセット
    3. パラメーターのセット
    4. パラメーターのエンコード
  2. リクエストとレスポンス
    1. Requestオブジェクトの生成
    2. リクエスト実行とResponseオブジェクトの取得
  3. レスポンスオブジェクトのデコード

API仕様

zipcloudサイトの郵便番号検索APIの内容をまとめると以下の通り。

  • リクエストURL:https://zipcloud.ibsnet.co.jp/api/search
  • リクエストパラメーター
    • zipcode~必須~郵便番号(ハイフンなし7桁の数字)
    • callback~オプション~JSONPとして出力する際のコールバック関数名
    • limit~オプション~同一の郵便番号で複数のデータが存在する場合に返される上限件数(デフォルト20)
    • urlパターンの例:https://zipcloud.ibsnet.co.jp/api/search?zipcode=1330051

コード

最初に実行コードの全体を示す。

コード説明

準備

urllib.requestライブラリーのインポート

HTTPリクエストに必要なurllib.requestライブラリーをインポートする。

APIエンドポイントURLのセット

ここではzipcloudのAPIエンドポイントのURLを変数urlにセットする。

リクエストパラメーターのセット

リクエストパラメーターを辞書でセット。ここでは仕様に従ってzipcode'1130051'を与えている。

パラメーターのエンコード

リクエストに備えて、パラメーター文字列をバイト列にエンコード。ここでは一般的なutf-8を指定しているが、郵便番号は半角数字なのでasciishift_jisでも同じ結果となる。その形式は

urllib.parse.urlencode(パラメーター辞書).encode('文字コード')

リクエストとレスポンス

Requestオブジェクトの生成

ベースのURLとエンコードされたパラメーターを与えてRequestオブジェクトを生成する。

urllib.request.Request(URL文字列, data=エンコード後のパラメーター)

リクエスト実行とResponseオブジェクト取得

リクエストはRequestオブジェクトを引数としてurlopenメソッドを実行。戻り値は結果のResponseオブジェクト。

Responseオブジェクトのデコード

取得したままのResponseオブジェクトをそのまま表示しても、クラスの文字列表現となるだけ。

そこで、文字コードを指定してデコードしてやる。ここではutf-8を指定している。

response.read().decode(文字コード)

結果は文字コードで指定されたエンコード方式でデコードされ、レスポンスの文字列が得られる。

zipcloudのレスポンスはJSON形式でインデント整形された文字列となるが、あくまで文字列であり、要素を指定した値の取出しはできない。

JSON文字列の取り扱い

準備

JSON形式の文字列を辞書として読み込んだり、整形表示をしてみる(PythonでのJSONの取り扱い)。

まず、JSONを扱うにはjsonライブラリーが必要。

辞書への展開

JSON形式の文字列をPythonの辞書として取り込む。

json.loads(JSON形式の文字列)

レスポンス内容の取出し

これはzipcloudの仕様になるが、レスポンスのJSONデータのレスポンス部分は入れ子の内側('response'キーに対応)にあるので、これを取り出す。

同じ郵便番号に複数の住所が存在する場合もあるが、ここでは最初の1つだけ取り出している。

JSON形式での整形出力

辞書の内容を再度整形して文字列化する。

json.dumps(辞書, indent=桁数)

ただし、このままではマルチバイト文字が16進にエスケープされてしまう。

エスケープの抑制

json.dumpsでエスケープを抑制することで、もとの文字コードに基づいて処理される。エスケープを抑制するためには引数でensure_ascii=Falseをセットする。

 

ISO-20220-JP/EUC-JP/Shift-JISなど

概要

JIS X 0208の符号化方式として以下の3つを整理する。

  • ISO-2022-JP~JISコード
  • EUC-JP
  • Shift_JIS

ISO-2022-JP

JIS X 0208の符号化

区点番号を16進4桁とし、0x2020を加えて2バイトのバイト列を得る。以下、いくつかの例。

全角文字 区点(10進) 区点(16進) 符号化後
4/2 0x0402 24 22
4/21 0x0415 24 35
16/1 0x1001 30 21
28/79 0x1C4F 3C 6F

エスケープシーケンス

ASCII文字の解釈で始め、ASCIIにエスケープした状態で終了。

以下は文字集合、バッファーとそれに切り替えるためのエスケープシーケンス。

文字集合 バッファー 16進 文字表記
ASCII G0 1B 28 42 ESC ( B
JIS X 0201 G0 1B 28 4A ESC ( J
JIS X 0208 G0 1B 24 42 ESC $ B

以下は、「ABアイあい」という文字列のISO-2022-JPによるエンコーディングの結果。

区/点 バイト表現 変換・制御 バイト列
A 41 41
B 42 42
C 43 43
JIS X 0201 1B 28 4A
B1 B1
B2 B2
JIS X 0208 1B 24 42
4/4 0404 +0x2020 24 24
4/5 0405 +0x2020 24 25
ASCII 1B 28 42

EUC-JP

EUC-JPでは以下のようにエンコードする。

  • ASCIIをGL領域、JIS X 0208をGR領域で扱う
  • ASCIIは最上位ビットが0でそのままのビットパターン
  • JIS X 0208は区点コードに0xA0A0を加えた値となる
  • 半角カタカナ(JIS X 0201)はSS2 (Single Sift 2, 0x8E)で1文字ごとにエスケープ
  • 補助漢字(JIS X 212)はSS3 (Single Shift 3, 0x8F)で1文字ごとにエスケープ

なお、区の最大値は84(0x54)、点の最大値は95(0x5F)なので、0xA0を加えてもオーバーフローしない。

全角文字 区点(10進) 区点(16進) 符号化後
4/2 0x0402 A4 A2
4/21 0x0415 A4 B5
16/1 0x1001 B0 A1
28/79 0x1C4F BC EF

エスケープ

JIS X 0201とJIS X 0212の文字の前、1文字ごとにそれぞれエスケープシーケンス0x8E0x8Fを置く。ASCIIとJIS X 0208は同居しているので、エスケープシーケンスは必要ない。

以下は文字集合、バッファーとそれに切り替えるためのエスケープシーケンス。ただしJIS X 0201とJIS X 0212へのエスケープの実装は任意。

文字集合 バッファー 16進 文字表記
ASCII G0
JIS X 0208 G1
JIS X 0201 G2 8E SS2
JIS X 0212 G3 8F SS3

以下は、「ABアイあい」という文字列のEUC-JPによるエンコーディングの結果。

区/点 バイト表現 変換・制御 バイト列
A 41 41
B 42 42
C 43 43
JIS X 0201 8E
B1 B1
JIS X 0201 8F
B2 B2
JIS X 0208 1B 24 42
4/4 0404 +0xA0A0 A4 A4
4/5 0405 +0xA0A0 A4 A5

Shift_JIS

概要

英数字・半角カナ・漢字をエスケープシーケンスなしで1~2バイトの符号空間で表現する。

  • 半角英数字と半角カタカナは1バイト
  • 日本語の全角文字は2バイト

Shift_JISのシフトは、文字集合を符号空間の空き領域にシフトさせて詰め込んでいることから。

特徴など

  • エスケープシーケンス不要
  • 符号化後の容量が他と比べて小さい
  • JIS X 0208の区点からの変換式が煩雑
  • 2バイト目にASCIIコードと同じ符号が現れるため、文字区切りの判定に制約
    • 一部の文字に0x5Cが現れ、これがASCIIのバックスラッシュ/¥記号に相当するため、ソースコードの処理などで不都合が生じる、など