[ 更新履歴 ] 2019/2/14 : β1.00 , 2019/3/24 : β 4.40 , 2019/4/4 : Ver 1.00
2019/5/11 : 番号翻訳テーブルを [ 2019/5/7 版 ] に差替えました
2020/7/20 : 番号翻訳テーブルを [ 2020/6/1 版 ] に差替えました
2022/8/2 : 番号翻訳テーブルを [ 2022/7/1 版 ] に差替えました
電話番号翻訳 テーブル を JSON ファイルから読込み ⇒ TelephoneCheck_withJSON.js ( ベース バージョン )
〃 を ソースコード 内に収録 ⇒ TelephoneCheck.js ( 派生 バージョン )
>>> [ Page 1 ] <<<
( 電話番号の 編集 & 検証 ツール )
1. 電話番号 編集/検証 ツール [ TelephoneCheck ] について
2. 固定電話の電話番号について
3. 番号翻訳テーブル ( JSON ファイル ) の構造
[ 番号翻訳テーブル 番号翻訳シュミレーター ]
--- [ Page 2 ] ---
4. TelephonCheck ツール 関数 リファレンス
[ 仕 様 ] [ ValidateTelephone ] [ FormatTelephone ] [ GetTypeTelephone ] [ InitTelephone ] [ PhoneNumber ]
5. ダウンロード / 使用条件 / 更新履歴 他
--- [ Page 3 ] ---
6. 多言語 移植について / 言語別 留意事項
[ JAVA , PHP , Perl , Python , Ruby , VBA/VB6 , VB.net ]
------------------------------------------
[ デバッグ用 テストツール ] [ カラー表示 ソース コード ] [ 移植時 言語仕様 把握 ポイント 一覧 ( PDF , A3 ) ]
[ この場所へのリンク ]
[ この場所への リンク ]
1. 電話番号 編集/検証 ツール [ TelephoneCheck ] について
この TelephoneCheck ツール は、日本の電話番号について、
( a ) 電話番号の妥当性チェック ( 局番の割り当て有無, 電話番号の長さ ) を行なう。
( b ) 局番に応じた 区切り編集を施す。
( c ) 区切り編集された電話番号の 「区切り位置」 等の チェック を行なう。
という機能を提供します。 番号翻訳テーブル という 形態の 局番収録データ により、日本全国
の 市外局番+市内局番 を正しく反映した 区切り編集 が可能です。
現在、電話番号の 「チェック および 区切り編集」 で広く使われている手法は主に下記の 1&2 ですが、
このTelephoneCheck ツールは、それとは全く異なる第3の手法を採用しています。
--- ( 1 ) テーブル検索 ---
( a ) 全ての局番データを単純にテーブル化する
「局番(6桁, '0'+市外局番+市内局番)+市外局番桁数」というセットで全ての局番のデータを
テーブル内に収録してあれば、電話番号の上6桁固定でテーブル検索を1回すれば事足ります。
局番テーブルを用意する側でも、市外局番を調べる側でも共に単純な作業/処理で片付きます。
問題は局番テーブルのデータ数が2万4千件程になるということでしょう。バックボーンにしっかり
としたデータベースを備えているならば可能ですが、JavaScript だけで対応しようとするには荷が
重いでしょう。
( b ) 市外局番だけでテーブル化する
市外局番だけであれば380件程ですので、ソースコード内に収録する事も可能でしょう。ただし、
単純に市外局番のリストを並べただけでは正しく検索する事はできません。
市外局番のリストを桁数( 2, 3, 4, 5 桁)ごとにテーブル分割して収録し、5 ⇒ 4 ⇒ 3 ⇒ 2 桁の
順で[前方一致検索] を繰り返し試すという手順で該当する市外局番を探し出します。
但し、下記の例のように「同じ数字の並び」であっても、市内局番の割り当て方によって市外局番
が異なる(即ち、市外局番の桁数が異なる)という地域が数多く存在します。その為、「市外局番だけ」
というテーブルデータでは100%正しい結果を得ることはできません。
[ 09934xxxxx ] ⇒ 0993-40-FGHJ , 0993-41-FGHJ , 099-343-FGHJ
099-345-FGHJ , 099-347-FGHJ , 0993-49-FGHJ
「上記のような地域のみ市内局番まで含める」というような何らかの配慮が必要になります。
--- ( 2 ) 正規表現の利用 ---
「正規表現」 を駆使して局番の判定&電話番号の分割を行なう というものです。 しかし、電話番号
には地域 ( 局番 ) によって区切り位置 ( 市外局番-市内局番 ) が様々である為、正規表現で完璧
に仕上げようとするのは非常に困難です。
近辺の地域限定ならいざ知らず、日本全国全ての地域 ( 局番 ) を完璧にカバーする定義を自力で
作り上げるのは無理を通り越して無謀と言っても良いでしょう。幸いにして、フリーで利用できるツールが
公開されていますので、それを利用することをお薦めします。
( a ) Google 製の libphonenumber ライブラリ
電話番号編集ツールとしてはもっとも有名なものでしょう。日本全国のみならず世界中の電話番号を
網羅しています。勿論、上記の [ 09934xxxxx ] のような地域も完璧にフォローされています。
libphonenumber ライブラリ で使われている正規表現を見てみると非常に複雑で細かい記述となって
いるのが見て取れます。
( 下記 GitHub の metadata.js , 日本の定義は 3815行目〜 ( 2019/4/30 現在) , [ 日本部分の抜粋 ] )
https://github.com/googlei18n/libphonenumber/tree/master/javascript/i18n/phonenumbers
( libphonenumber デモツール : 外部サイト , Country には JP , locale は省略 )
( b ) Cleave.js 等
Cleave.js 等、他にも幾つか電話番号の フォーマット を行なえる製品があります。但し、それらも中で
libphonenumber ライブラリ を利用していますので、正規表現ツールとしては libphonenumber 一択
と言えるでしょう。
--- ( 3 ) AddinBox製 TelephoneCheck ツール が採用している『電話番号翻訳』 ---
この TelephoneCheck ツール は、今までの 「テーブル検索/正規表現 を駆使する」 という手法とは
全く異なり、「電話番号翻訳テーブル という 局番 データ を使って 電話番号翻訳を行なう」 という
アプローチ で電話番号 の フォーマット を行ないます。
尚、電話番号翻訳という手法は、電話交換機が電話番号から通話路を決定するルーティング処理で
使っている手法です。それ故に非常に高速に処理できるという特徴を持っています。
後述しますが、電話番号翻訳テーブルは「リンクチェーンテーブル」の構造をしており、電話番号の各桁
の数字を基にリンクチェーンを辿ります。殆どの電話番号では上3桁("0"の次から)迄で完了できるでしょう。
つまり、テーブル内の3要素にアクセスするだけで完了します(1要素ごとにテーブル内を探し回るような
ことはなく、リンクチェーンによるダイレクトアクセスとなります)。この仕組みは後述の「番号翻訳シュミレータ」
で実感できるでしょう(上記の [ 09934xxxxx ] 地域を試してみると良いですよ)。
「大量のテーブルデータの中を探し回る『テーブル検索』手法」や「重い解釈エンジンを通す『正規表現』
手法」と比べて処理の負担が小さい軽量高速な手法といえます。ちなみに、番号翻訳テーブルのデータ数
は携帯電話等を含めても140件弱で済んでいますので、ソースコード内にそのまま収録しても邪魔になり
ません(実際にソースコードを確認してみてください)。
この TelephoneCheck ツールは、元々Excel アドイン 「kt電話郵便アドイン」 の [ ktTelEdit 関数 ] に実装して
きた機能です( 2004年10月 リリース ) 。
それを JavaScript & JSON (番号翻訳テーブル) という スタイルで JavaScript ツール として移植しました。
( TeleponeCheck_withJSON.js )
その後、JSON (番号翻訳テーブル) の内容 を 必要最小限 に 縮小加工 して ソースコード 内に収録した派生
バージョン を作成しました ( TelephoneCheck.js )。
この TelephoneCheck ツールでは FormatTelephone 他 幾つかの関数を提供していますが、通常の使用
では PhoneNumber 関数ひとつで充分です。
更に、派生バージョン を基にして 他の言語 への移植版 も リリース しています。
2019年4月 現在 … JAVA , PHP , Perl , Python , Ruby , VBA/VB6 , VB.net
[ この場所への リンク ]
2. 固定電話の電話番号について
固定電話番号( NTT ) の様式は以下のように、計10桁の番号として定義されています。
昔は「東京・大阪および一部地域で9桁」や「市内局番なし(0+市外局番5桁+加入者番号4桁」
といった地域もありましたが、現在は全国で下記様式の『10桁』に統一されています。
全国の「市外局番+市内局番」データは下記の総務省HPに Excel ファイルとして公開されており、
毎月初に最新データで更新されています。
https://www.soumu.go.jp/main_sosiki/joho_tsusin/top/tel_number/number_shitei.html
1〜9 のファイルの合計で約 7,000KB(約43,000件)のデータサイズがあります。
私の公開ソフト(kt電話郵便アドイン)では、このデータを基にして電話番号のハイフン編集を行なう
ktTelEdit 関数を提供しています。ただし、上記のような 7,000KBもの変換用データを実装している
訳ではありません。ktTelEdit関数の為に組み込んであるデータは僅か「36KB( xls ファイル換算 )」
です。Excelデータとして 「125行×10列」程度です。
kt電話郵便アドインでは、全国の局番データ(市外局番+市内局番)を、電話交換機 などで使われて
いる 【 番号翻訳テーブル ( 傘型構造) 】 という形態(下図イメージ、傘1つが1行分のデータ)に加
工して収録しており、更に最適化処理も施すことにより前述のコンパクトなサイズを実現しています。
番号翻訳テーブルの構造上の特性により、最大でも5個目の傘型(殆どは3個目の傘型)で検索を完了
します(Next テーブルへのインデックス付きですから、’配列全体から検索’を5回という事ではなく、単に
配列要素(傘型)に5回アクセスするだけです)。
この番号翻訳テーブルによる翻訳動作は
後述の 翻訳シュミレーター で確認できます。
『傘型に5回以内のアクセスで完了』という
仕組みが実感できます。
今回、この軽量コンパクトな市外局番データをWEBシステムでも利用できるように『JSONデータ(約8KB)』
としてリリースする事にしました。
[ この場所への リンク ]
3. 番号翻訳テーブル( JSONファイル : AreaCode4JSON.json )の構造
番号翻訳テーブル とは、電話交換機が電話番号から
通話路を決定するルーティング処理で使っている 「電話
番号 解析用のデータ 構造」 です。
AreaCode4JSON.json は固定電話の全国の局番
( 市外局番+市内局番 ) を、この傘型構造の データ
に編集/収録した ファイルです。
併せて、携帯電話 等の局番 も収録しています。
( 「サポート している電話番号」 参照 )
( 番号翻訳処理の動作は翻訳シュミレーター で確認できます )
JSONファイルは、JavaScript では jQuery を利用することで読み込むことができます。
(勿論、JavaScript 以外の言語でも利用可能です)
尚、JSON ファイル未使用版 ( TelephoneCheck.js ) および 多言語移植版では、この番号翻訳
テーブル を必要最小限の内容に編集して ソースコード 内に収録しています。
[ AreaCode4JSON.json : カラー表示 ソースコード ]
----- データ構造 -----
AreaCodeList._Comment.1
. .2
. :
. :
.Update : 公開日 ( YYYY-MM-DD )
.AreaCode[ 0 ].Number : 局番データ ( 文字列 )
. .Tree[ 0 ] : 展開情報 ( 数値 )
. .Tree[ 1 ]
:
. .Tree[ 9 ]
----- 凡例 ----- ( 配列のインデックスは Zero オリジン です )
_Comment : コメント
Update : 総務省HPにてリリースされた日付
AreaCode : 傘型レコードの配列
Number : 個々の傘型レコードが指し示す「局番」の範囲
尚、「Number」は可読性の為に記述している情報であり、
実際の番号翻訳処理(テーブル検索処理)では使用していません。
Tree : 0〜9の10個固定の配列。
Number の「次の桁」の番号に対応しています。
ゼロ : 空き番号
正数 : 継続する次の傘型レコードのインデックスです(リンク先の存在は保証済)。
負数 : 番号翻訳 完了
[ -2 〜 -5 ] : 固定電話の市外局番の桁数決定。
符号反転した値が市外局番の桁数(先頭の 0 を含む)です。
[ -102 〜 -110 ] : 携帯電話 等の局番で決定。
符号反転して「100 減算」した値が、携帯電話などを表す TelType 値です。
TelType 値 : 1:固定電話(10桁) , 2:携帯電話(070/080/090,11桁) , 3:着信課金(0120,10桁),
4:着信課金(0800,11桁), 5:IP電話(050,11桁), 6:M2M(020x,11桁,x≠4),
7:ポケベル(0204,11桁), 8:FMC(0600,11桁), 9:情報料徴収(0990,10桁), 10:統一番号(0570,10桁)
----- データ例 -----
AreaCode[0].Tree[4] ⇒ Number"0"+"4" , 40番レコード(Number"04")に継続
AreaCode[5].Tree[4] ⇒ Number"0137"+"4" , 市外局番5桁( 01374-E-FGHJ )で決定
AreaCode[5].Tree[8] ⇒ Number"0137"+"8" , 市外局番4桁( 0137-8E-FGHJ )で決定
AreaCode[2].Tree[0] ⇒ Number"012"+"0" , TelType=3 : 着信課金( 0120-DEF-GHJ )で決定
殆どの区域では局番の途中で市外局番桁数を決定できますが、
下記の 09934E-FGHJ 区域 (099-34E or 0993-4E)のように、
市内局番の最後の桁まで見ないと決定できない区域もあります。
0993-40-FGHJ
0993-41-FGHJ
099-343-FGHJ
099-345-FGHJ
099-347-FGHJ
0993-49-FGHJ
{
"AreaCodeList":{
"_Comment":{
"1":"全国市外局番 番号翻訳テーブル for Json (2019/3/1 版)",
"2":"固定電話に加えて携帯/着信課金等の局番も収録されています。",
"3":"総務省HP「電気通信番号の利用・指定」公開データより作成",
"4":"http://www.soumu.go.jp/main_sosiki/joho_tsusin/top/tel_number/",
"5":"作成:AddinBox(角田) http://addinbox.sakura.ne.jp/Excel_Tips29.htm",
"Update":"2019-03-01",
"AreaCode":[
{"Number":"0","Tree":[0,1,22,39,40,51,65,66,77,109]},
{"Number":"01","Tree":[0,-3,2,4,7,10,15,19,20,21]},
{"Number":"012","Tree":[-103,0,0,-4,-4,-4,3,0,0,0]},
{"Number":"0126","Tree":[0,0,-4,-4,-4,-4,-4,-5,0,0]},
{"Number":"013","Tree":[0,0,0,-4,-4,-4,-4,5,-4,6]},
{"Number":"0137","Tree":[0,0,-5,0,-5,-4,-4,-5,-4,0]},
{"Number":"0139","Tree":[0,0,-5,-4,-4,-4,-4,-5,-5,0]},
{"Number":"014","Tree":[0,0,-4,-4,-4,8,9,0,0,0]},
{"Number":"0145","Tree":[0,0,-4,-4,-4,0,-5,-5,0,0]},
:
:
{"Number":"099","Tree":[-109,-5,-3,120,123,-4,124,-4,-3,0]},
{"Number":"0993","Tree":[0,0,-4,121,122,-4,-4,-4,-4,0]},
{"Number":"09933","Tree":[0,-3,-4,-4,-4,-4,-4,-4,-4,-4]},
{"Number":"09934","Tree":[-4,-4,0,-3,0,-3,0,-3,0,-4]},
{"Number":"0994","Tree":[-3,0,-4,-4,-4,-4,-4,-3,-3,-4]},
{"Number":"0996","Tree":[0,0,-4,-4,-4,-4,-4,-4,-4,-5]}
{"Number":"020","Tree":[0,-106,-106,-106,-107,-106,-106,-106,-106,-106]},
{"Number":"050","Tree":[0,-105,-105,-105,-105,-105,-105,-105,-105,-105]},
{"Number":"060","Tree":[-108,0,0,0,0,0,0,0,0,0]},
{"Number":"070","Tree":[0,-102,-102,-102,-102,-102,-102,-102,-102,-102]},
{"Number":"080","Tree":[-104,-102,-102,-102,-102,-102,-102,-102,-102,-102]},
{"Number":"090","Tree":[0,-102,-102,-102,-102,-102,-102,-102,-102,-102]}
]
}
}
----- 番号翻訳テーブルの検索方法(市外局番桁数 等の決定方法) by JavaScript -----
番号翻訳処理の動作は 下記の 翻訳シュミレーター で確認できます。
JSON ファイルの読み込みでは jQuery を使用します。
後述の JavaScritソースコード 並びに サンプルツールの HTMLコードも併せて参照してください。
var JsonTBL; // JSON データの読込エリア ← JSON未使用版での定義は JS ファイル を参照
var AreaCodeLength; // 市外局番の桁数
var cnt;
var num;
var LinkValue;
var TelType;
// JSONファイルの読込 ( jQuery を利用 )
$.ajaxSetup({async: false});
var jqXHR = $.getJSON(JSONファイルのパス, function() {
});
$.ajaxSetup({async: true});
jqXHR.done(function(JsonTBL) {
// 番号翻訳テーブルから局番情報(市外局番の桁数 or [携帯番号 等]のType情報)を取得する。
// [電話番号] は10/11桁なので、番号翻訳テーブルの構造上、[検索継続]の状態でループ終了する事は無い。
var idx = 0;
for (cnt = 1; cnt <= 5; cnt++) { // 番号翻訳テーブルはA〜Eコードの5段
num = Number(電話番号.substr(cnt, 1)); // 電話番号の2桁目以降(1桁目は'0')を順次取り出す
LinkValue = JsonTBL.AreaCodeList.AreaCode[idx].Tree[num];
if (LinkValue == 0) { // 番号翻訳 終了(固定電話 未使用局番)
TelType = 1;
AreaCodeLength = 0;
break;
} else {
if (LinkValue < 0) { // 番号翻訳 終了
if (LinkValue > -100) {
// 固定電話の市外局番桁数(符号反転値) 実際の収録値[ -2 〜 -5 ]
TelType = 1;
AreaCodeLength = LinkValue * (-1); // 市外局番 桁数決定(先頭の "0" 含む)
} else {
// 携帯電話 等のTelType値(符号反転値 - 100) 実際の収録値[ -102 〜 -110 ]
TelType = (LinkValue * (-1)) - 100;
}
break;
} else { // プラス値
idx = LinkValue; // 検索継続(収録値は NextIndex)
}
}
}
});
// 以降、TelType に応じた桁区切りで編集する
// 固定電話(TelType=1)では市外局番桁数(AreaCodeLength)に従って編集する
市外局番の桁数 ⇒ AreaCodeLength ( 先頭の "0" 含む )
市内局番の桁数 ⇒ 6 - AreaCodeLength ( = 10 - 市外局番の桁数 - 加入者番号の桁数(4) )
加入者番号の桁数 ⇒ 4 固定
(補) JSONファイル未使用版では jQuery による JSONファイル読込処理 部分(赤字部分)が不要になります。
[ この場所への リンク ]
--------------------------------------------------------------------------
>>> [ Page 1 ] <<<
( 電話番号の 編集 & 検証 ツール )
1. 電話番号 編集/検証 ツール [ TelephoneCheck ] について
2. 固定電話の電話番号について
3. 番号翻訳テーブル ( JSON ファイル ) の構造 [ 番号翻訳テーブル 翻訳シュミレーター ]
--- [ Page 2 ] ---
4. TelephonCheck ツール 関数 リファレンス
5. ダウンロード / 使用条件 / 更新履歴 他
--- [ Page 3 ] ---
6. 多言語 移植について / 言語別 留意事項
--------------
[ デバッグ用 テストツール ] [ カラー表示 ソース コード ] [ 移植時 言語仕様 把握 ポイント 一覧 ( PDF , A3 ) ]
--------------------------------------------------------------------------
|
||
角田 桂一 Mail:addinbox@h4.dion.ne.jp CopyRight(C) 2019 Allrights Reserved. |