2013年12月19日木曜日

大人の水彩画塗り絵のように加工する件。

前回のつづきとして、
水彩塗り絵っぽくする画像処理を考えます。
水彩塗り絵っぽくとは具体的に言うと、
・縁取りがしてある
・色が全体的に薄い
・色数が少ない
だいたい、こんなとこでしょう。
ただし、『水彩独特の筆のタッチ』とかは考慮しません。
それは、GUIアプリならば考慮できますが、自動ではなかな難しそうです。
機会があったらやってみますが。。。

ということで、縁取りは前回もやったので、
今回は、
(1)色を薄くする
(2)色数を少なくする
ということをしてみます。

具体的には、どうすればいいんでしょうね。。
ちなみに、何も参考にせずにこれを書いてるわけですが、
色は、とりあえずRGBで考えるとすると、
FF0000なんていうのは、真っ赤になっちゃいますから、
これを、FF8080あたりになるようなロジックです。
じゃぁどうするかというと、とりあえず、RGBそれぞれの成分に関して、、

0x20~0x50程度を足す。
1.2倍~2倍程度の倍率をかける。
0xffを超えるものは、0xffで頭打ちにする。

っとまぁ、この程度のことしてみた結果が以下です。
でも、まぁ、この程度でも結構いけます。
問題は、その
パラメータをヒストグラムあたりみて、自動的に設定する
ロジックですねーー。

【元画像】


【変換画像】



【SRC。こんな程度。】
RR = ((RR + 0x30) * 4)/3; if(RR > 0xff) RR = 0xff;
GG = ((GG + 0x30) * 4)/3; if(GG > 0xff) GG = 0xff;
BB = ((BB + 0x30) * 4)/3; if(BB > 0xff) BB = 0xff;
RR = ((int)(RR / 32))*32+31;
GG = ((int)(GG / 32))*32+31;
BB = ((int)(BB / 32))*32+31;



2013年12月15日日曜日

漫画カメラの画像処理のしくみを勝手に推測する件。

【漫画カメラ】っていうのがありまして。
ちょっと前に、輪郭抽出+アルファという記事で、
『どーゆーロジックなんだろ?』
と書きまして、その後、推測してみたわけですが、
今回は、この検証です。

●元画像がこれです。

●最終的にモノクロ画像なので、まずこれをグレイスケールにします。
グレイスケールはですね、R,G,Bに係数をかけて足し合わせて求めます。
Gray = R * 0.3 + G * 0.59 + B * 0.11;
こんな感じです。アバウトな計算でよいときは、整数計算にします。
即ち、GRAY=((R * 19660 + G * 38666 + B * 7209) >> 16) & 0xff; です。
まぁこれだと、絶対に出現しない階調が出現しちゃいますけどねー。
で、結果がこれです。
この画像のなかで、黒っぽい部分と、そのグレイだけど黒っぽい部分を抽出します。
それが、以下です。
この例では、0x38以下を黒にして表示しています。
この例では、0x70以下を黒にして表示しています
次に、斜線の画像を用意します。
まぁ画像と同じ大きさにすればよいです。
それがこれ。
そしてこの画像を、さっきのグレイっぽい画像でマスクをします。
そうすると、こうなります。
次は、輪郭の抽出です。
これは、ソーベルフィルタってやつを使います。
もちろん、これで抽出した値をどう使うかが問題となりますが、
簡単に言えば、『閾値を設定して、黒か白かにしてしまう』
ということです。

実際に抽出してみたのが、これです。

ということで、全部出揃いました。
ここで、
(1)黒抽出画像
(2)グレイ抽出マスク斜線画像
(3)輪郭抽出画像。
この3つを合成したのが、これです。
もちろん、【漫画カメラ】とまったく同じにはなりませんが、
そこらへんは、前処理とか、ヒストグラムを平均化するとか、閾値のとりかたとか、いくつかのパラメータの違いだと思われます。

もちろん、実際のプログラムでは、わざわざ画像を作ってから処理するわけではなく、
メモリやCPUコストを小さく抑えるべく、ひとつのLOOPの中で全て処理します。

まぁ、あたりまえですが\( ̄(エ) ̄ )/\( ̄(エ) ̄ )/

2013年12月9日月曜日

ベクトル図形のANDをとってみる件。(2)

つづきです。
では、順を追ってみましょう。
まず最初に、直線を登録(setLine)しているので、
こっから、頂点と交点、即ち、直線の始点/終点/直線同士の交点を求めます。
交点の求め方とかは、ここらへんを参考にどうぞ。
そして、今度はそのY座標だけをArrayに入れて、SORTしてみます。
そうすると、こういう結果になります。
# 0 : 20.0000 - 10.0000  
# 1 : 40.0000 - 10.0000  
# 2 : 60.0000 - 20.0000  
# 3 : 36.3636 - 20.9091  
# 4 : 50.0000 - 30.0000  
# 5 : 10.0000 - 40.0000  
# 6 : 30.0000 - 40.0000  
# 7 : 60.0000 - 40.0000  
# 8 : 45.0000 - 40.0000  
# 9 : 40.0000 - 50.0000 
# 0 : 10.0000
# 1 : 20.0000
# 2 : 20.9091
# 3 : 30.0000
# 4 : 40.0000
# 5 : 50.0000

図で言えば、こういうことです。
ここで、Y座標は6コあることがわかります。
このY座標で水平な線を引き、
全ての登録した直線に対して、その直線で分割してしまいます。
ただし、水平な線は含みません。
ようするに、こういうことです。
データにすると、こういうふうになっています。
ここで、いくつかの値を一緒に登録しています。
(1)【tag】。分断する前の直線を一意に識別するための番号。
(2)【bup】。直線が、上を向いているか(終点のY座標>始点のY場表)どうか。
(3)【hnum】。その直線が、どの段(直線の中点がどのY座標の間にあるか)にあるか。
※全て、あとで使います。

# 0  tag:1  bup:1  bHz:0 hnum:1 x1:20.0 y1:10.0 x2:16.7 y2:20.0 x:18.3 y:15.0
# 1  tag:4  bup:0  bHz:0 hnum:1 x1:35.0 y1:20.0 x2:20.0 y2:10.0 x:27.5 y:15.0
# 2  tag:5  bup:1  bHz:0 hnum:1 x1:40.0 y1:10.0 x2:36.7 y2:20.0 x:38.3 y:15.0
# 3  tag:8  bup:0  bHz:0 hnum:1 x1:60.0 y1:20.0 x2:40.0 y2:10.0 x:50.0 y:15.0
# 4  tag:1  bup:1  bHz:0 hnum:2 x1:16.7 y1:20.0 x2:16.4 y2:20.9 x:16.5 y:20.5
# 5  tag:4  bup:0  bHz:0 hnum:2 x1:36.4 y1:20.9 x2:35.0 y2:20.0 x:35.7 y:20.5
# 6  tag:5  bup:1  bHz:0 hnum:2 x1:36.7 y1:20.0 x2:36.4 y2:20.9 x:36.5 y:20.5
# 7  tag:7  bup:0  bHz:0 hnum:2 x1:60.0 y1:20.9 x2:60.0 y2:20.0 x:60.0 y:20.5
# 8  tag:1  bup:1  bHz:0 hnum:3 x1:16.4 y1:20.9 x2:13.3 y2:30.0 x:14.8 y:25.5
# 9  tag:5  bup:1  bHz:0 hnum:3 x1:36.4 y1:20.9 x2:33.3 y2:30.0 x:34.8 y:25.5
# 10  tag:4  bup:0  bHz:0 hnum:3 x1:50.0 y1:30.0 x2:36.4 y2:20.9 x:43.2 y:25.5
# 11  tag:7  bup:0  bHz:0 hnum:3 x1:60.0 y1:30.0 x2:60.0 y2:20.9 x:60.0 y:25.5
# 12  tag:1  bup:1  bHz:0 hnum:4 x1:13.3 y1:30.0 x2:10.0 y2:40.0 x:11.7 y:35.0
# 13  tag:5  bup:1  bHz:0 hnum:4 x1:33.3 y1:30.0 x2:30.0 y2:40.0 x:31.7 y:35.0
# 14  tag:3  bup:0  bHz:0 hnum:4 x1:45.0 y1:40.0 x2:50.0 y2:30.0 x:47.5 y:35.0
# 15  tag:7  bup:0  bHz:0 hnum:4 x1:60.0 y1:40.0 x2:60.0 y2:30.0 x:60.0 y:35.0
# 16  tag:2  bup:1  bHz:0 hnum:5 x1:10.0 y1:40.0 x2:40.0 y2:50.0 x:25.0 y:45.0
# 17  tag:3  bup:0  bHz:0 hnum:5 x1:40.0 y1:50.0 x2:45.0 y2:40.0 x:42.5 y:45.0

これで、準備が整いました。
これから、ANDとかORの演算をすることになります。

次回につづきますが、きっと、ちょっとわかる人は、この図を見ればわかります。


つづく。



2013年12月8日日曜日

ベクトル図形のANDをとってみる件。

●図形を演算する話。
ベクタ画像を合成(演算)する件。のつづきです。
簡単に実装してみますです。
こぅいぅときゎ、まず、どう使いたいかをcodingしてみます。
とりあえず、こうしました。
aPolies A;
//1つめ
A.setLine(20,10,10,40);
A.setLine(10,40,40,50);
A.setLine(40,50,50,30);
A.setLine(50,30,20,10);
//2つめ
A.setLine(40,10,30,40);
A.setLine(30,40,60,40);
A.setLine(60,40,60,20);
A.setLine(60,20,40,10);
A.execute();
A.test();
で、test()の結果が以下です。
# moveTo [5] 36.36 20.91
# lineTo [5] 30.00 40.00
# lineTo [0] 45.00 40.00
# lineTo [3] 50.00 30.00
# lineTo [4] 36.36 20.91
それぞれのデータをグラフにすると、以下です。



実際には、7つのステップを踏んで、この座標を割り出しています。 それが、以下ですね。
# 0 : 20.0000 - 10.0000
# 1 : 40.0000 - 10.0000
# 2 : 60.0000 - 20.0000
# 3 : 36.3636 - 20.9091
# 4 : 50.0000 - 30.0000
# 5 : 10.0000 - 40.0000
# 6 : 30.0000 - 40.0000
# 7 : 60.0000 - 40.0000
# 8 : 45.0000 - 40.0000
# 9 : 40.0000 - 50.0000
------------------------
# 0 : 10.0000
# 1 : 20.0000
# 2 : 20.9091
# 3 : 30.0000
# 4 : 40.0000
# 5 : 50.0000
------------------------
# 0  tag:1  bup:1  bHorizon:0  x1:20.0 y1:10.0 x2:10.0 y2:40.0 x:15.0 y:25.0
# 1  tag:2  bup:1  bHorizon:0  x1:10.0 y1:40.0 x2:40.0 y2:50.0 x:25.0 y:45.0
# 2  tag:3  bup:0  bHorizon:0  x1:40.0 y1:50.0 x2:50.0 y2:30.0 x:45.0 y:40.0
# 3  tag:4  bup:0  bHorizon:0  x1:50.0 y1:30.0 x2:20.0 y2:10.0 x:35.0 y:20.0
# 4  tag:5  bup:1  bHorizon:0  x1:40.0 y1:10.0 x2:30.0 y2:40.0 x:35.0 y:25.0
# 5  tag:6  bup:1  bHorizon:1  x1:30.0 y1:40.0 x2:60.0 y2:40.0 x:45.0 y:40.0
# 6  tag:7  bup:0  bHorizon:0  x1:60.0 y1:40.0 x2:60.0 y2:20.0 x:60.0 y:30.0
# 7  tag:8  bup:0  bHorizon:0  x1:60.0 y1:20.0 x2:40.0 y2:10.0 x:50.0 y:15.0
------------------------
# 0  tag:1  bup:1  bHz:0 hnum:1 x1:20.0 y1:10.0 x2:16.7 y2:20.0 x:18.3 y:15.0
# 1  tag:4  bup:0  bHz:0 hnum:1 x1:35.0 y1:20.0 x2:20.0 y2:10.0 x:27.5 y:15.0
# 2  tag:5  bup:1  bHz:0 hnum:1 x1:40.0 y1:10.0 x2:36.7 y2:20.0 x:38.3 y:15.0
# 3  tag:8  bup:0  bHz:0 hnum:1 x1:60.0 y1:20.0 x2:40.0 y2:10.0 x:50.0 y:15.0
# 4  tag:1  bup:1  bHz:0 hnum:2 x1:16.7 y1:20.0 x2:16.4 y2:20.9 x:16.5 y:20.5
# 5  tag:4  bup:0  bHz:0 hnum:2 x1:36.4 y1:20.9 x2:35.0 y2:20.0 x:35.7 y:20.5
# 6  tag:5  bup:1  bHz:0 hnum:2 x1:36.7 y1:20.0 x2:36.4 y2:20.9 x:36.5 y:20.5
# 7  tag:7  bup:0  bHz:0 hnum:2 x1:60.0 y1:20.9 x2:60.0 y2:20.0 x:60.0 y:20.5
# 8  tag:1  bup:1  bHz:0 hnum:3 x1:16.4 y1:20.9 x2:13.3 y2:30.0 x:14.8 y:25.5
# 9  tag:5  bup:1  bHz:0 hnum:3 x1:36.4 y1:20.9 x2:33.3 y2:30.0 x:34.8 y:25.5
# 10  tag:4  bup:0  bHz:0 hnum:3 x1:50.0 y1:30.0 x2:36.4 y2:20.9 x:43.2 y:25.5
# 11  tag:7  bup:0  bHz:0 hnum:3 x1:60.0 y1:30.0 x2:60.0 y2:20.9 x:60.0 y:25.5
# 12  tag:1  bup:1  bHz:0 hnum:4 x1:13.3 y1:30.0 x2:10.0 y2:40.0 x:11.7 y:35.0
# 13  tag:5  bup:1  bHz:0 hnum:4 x1:33.3 y1:30.0 x2:30.0 y2:40.0 x:31.7 y:35.0
# 14  tag:3  bup:0  bHz:0 hnum:4 x1:45.0 y1:40.0 x2:50.0 y2:30.0 x:47.5 y:35.0
# 15  tag:7  bup:0  bHz:0 hnum:4 x1:60.0 y1:40.0 x2:60.0 y2:30.0 x:60.0 y:35.0
# 16  tag:2  bup:1  bHz:0 hnum:5 x1:10.0 y1:40.0 x2:40.0 y2:50.0 x:25.0 y:45.0
# 17  tag:3  bup:0  bHz:0 hnum:5 x1:40.0 y1:50.0 x2:45.0 y2:40.0 x:42.5 y:45.0
------------------------
# 0  tag:5  bup:1  bHz:0 hnum:3 x1:36.4 y1:20.9 x2:33.3 y2:30.0 check:1
# 1  tag:4  bup:0  bHz:0 hnum:3 x1:50.0 y1:30.0 x2:36.4 y2:20.9 check:1
# 2  tag:0  bup:0  bHz:1 hnum:3 x1:33.3 y1:30.0 x2:50.0 y2:30.0 check:0
# 3  tag:5  bup:1  bHz:0 hnum:4 x1:33.3 y1:30.0 x2:30.0 y2:40.0 check:1
# 4  tag:3  bup:0  bHz:0 hnum:4 x1:45.0 y1:40.0 x2:50.0 y2:30.0 check:1
# 5  tag:0  bup:0  bHz:1 hnum:4 x1:30.0 y1:40.0 x2:45.0 y2:40.0 check:1
# 6  tag:0  bup:0  bHz:1 hnum:3 x1:50.0 y1:30.0 x2:33.3 y2:30.0 check:0
------------------------
# 0  tag:5  bup:1  bHz:0 hnum:3 x1:36.4 y1:20.9 x2:33.3 y2:30.0 check:1
# 1  tag:5  bup:1  bHz:0 hnum:4 x1:33.3 y1:30.0 x2:30.0 y2:40.0 check:1
# 2  tag:0  bup:0  bHz:1 hnum:4 x1:30.0 y1:40.0 x2:45.0 y2:40.0 check:1
# 3  tag:3  bup:0  bHz:0 hnum:4 x1:45.0 y1:40.0 x2:50.0 y2:30.0 check:1
# 4  tag:4  bup:0  bHz:0 hnum:3 x1:50.0 y1:30.0 x2:36.4 y2:20.9 check:1
------------------------
# moveTo [5] 36.36 20.91
# lineTo [5] 30.00 40.00
# lineTo [0] 45.00 40.00
# lineTo [3] 50.00 30.00
# lineTo [4] 36.36 20.91
つづく。

2013年11月30日土曜日

輪郭抽出+アルファ

輪郭を抽出してるらしきことはわかるけど、微妙な斜線、どーいうロジックなんだろ(* ̄∇ ̄*)

2013年9月27日金曜日

ベクタ画像を合成(演算)する件。

なぜかはよくわからないけど、図形を演算するロジック、
そう、イラストレータで言えば、『パスファインダ』、
これ↓である。
この機能を作りたかったのだが、どうにもこうにもそれらしい情報が、
ネットを見てもほとんどないのである。
で、かろうじて合ったのはここ。
http://www7b.biglobe.ne.jp/~garaku/Boolean.html
途中まではわかりやすいのだが、途中以降はよくわからないので、自分流にやってみた。
でも、そもそもなんでこんな基本的なことが出てないんだろうと言う疑問はさておき、
とりあえず、題材を元にロジックをかいてみよう。

【1】題材はこれ。
ピンクの図形と、薄緑の図形。

【2】ベクトル方向
もちろん、緑図形が抜けているのはベクトルの廻りが逆だから。
今回は、右回りを基本とする。
基本というか、最外郭が右回りという前提である。
【3】Y座標の算定
全てのベクトルを見たとき、次の点のY座標を抽出する。
図では横線として表示。
●ベクトルの始点
●ベクトルの終点
●ベクトル同士の交点
-----------------
そして、各ベクトルを横線で分割する。
【4】ベクトルに値を設定
上向きを+1、下向きを-1とする。
--------------------
次に、横線の間の各段(横線の数-1)ごとに、
左側から、値を集計し、記入す。
最後は0になるはず。
0にならなかったら、図形が閉じていないのだ。


【5】今回は、図形をORしてみる。

次に、横線の間の各段(横線の数-1)ごとに、
左側からベクトルをみて、+1(↑)と0(↓)を抽出し、それらのベクトルが離れている場合は右回りになるように、三角形または四角形を作成する。

【6】図形を分割したんだよ。
上記の【5】の作業で作成された、三角形と四角形は、←の図のようになる。
ここからいらないと思われる水平のベクトルを削除していくのだ。
【7】ちょっと説明が難しいので、簡単な例を。
←の図は四角形が3つだが、上の四角形の底辺(=下の四角形の上辺)の位置の水平のベクトルを考えてみる。
【8】左回り図形になってしまったが、、、
頂点を左から番号をふると、6コある。

【9】頂点が6コということは、間は5コということである。
これの、偶数番目の間にあるベクトルを削除するのである。
上の四角形の底辺のベクトルは、4と3と2なので、2を削除する。
左下の四角形の上面のベクトルは、1と2なので、2を削除する。
右下の四角形の上面のベクトルは、4と5なので、4を削除する。
【10】ちなみに、頂点がダブったときも、頂点は2コあるということにする。
【11】残ったベクトルをつなぎ合わせると、左図のような図形ができあがる。
【12】【6】に戻って、同様の処理を行う。
【13】水平のベクトルはこのようになる。
【14】右上部分を拡大すると、こんな感じ。
よって、上部の三角形の底辺は、
1-2-3-4-5-6-7-8なので、2-3,4-5,6-7のベクトルは削除される。
また、1と2、3と4、5と6、7と8は同じ点なので、最終的にはこの三角形の底辺の部分の水平のベクトルは全て削除される。
【15】残ったベクトルをつなぎ合わせると、このようになる。
※点線部はないよ。

あとは、冗長点の削除をすればよいですね。
つづく。

2013年6月25日火曜日

家紋とかをスキャンする方法。

家紋とかをスキャンして使う方法ですが、、
どうしてもなかなかどうしてキレイなデジタルデータにするのは大変です。
ということで、比較的にラクにできる方法です。
但し、イラレとフォトレッタッチ系のS/Wを使います。

まず、普通にSCANします。
でも、JPEGでしか取れなかったりするのが、最大の問題なのです。


ゴミを取り除き、メリハリをしっかりさせます。
それには、明るさやコントラストの調整、ガンマ補正とかをしてやります。



明るさとコントラストの補正後。



ガンマ補正の後



いきなりガンマ補正すると、JPEGのにじみが増大しますよ!^^;^^;


で、これを、イラストレータで、アウトラインをとってしまうのです。
いや、これがまたなかなかしっかりとれるのです。




ということで、あとは拡縮するなり、AIファイルを解像度指定してフォトショで読み込むなりすれば、
必要な精度でPNGとかを取り込むことができましたとさ。

どんとはらい。^^V





2013年5月15日水曜日

C++・de・json


int leng = Z["doc"]["info"]["inputWizard"]["subjects"].length();
これでもC++である。^^V
こーゆークラスを書いたりすると、小躍りせざるを得ない^^;^^;

2013年4月12日金曜日

UTF32とサロゲートペアとUTF8とCIDの対応

UniJIS-UTF32-HのCMapを元に作成。
これからこれを使っていろいろテストしてみますです。
行末は一応、、、UTF8のコードのまま貼り付けてみました。
{
 "surro":[
   {"code":"0002000b","utf16":"\ud840\udc0b","utf8":"f0a0808b","cid":13839} // 𠀋
  ,{"code":"00020089","utf16":"\ud840\udc89","utf8":"f0a08289","cid":17233} // 𠂉
  ,{"code":"0002008a","utf16":"\ud840\udc8a","utf8":"f0a0828a","cid":14108} // 𠂊
  ,{"code":"000200a2","utf16":"\ud840\udca2","utf8":"f0a082a2","cid":17240} // 𠂢
  ,{"code":"000200a4","utf16":"\ud840\udca4","utf8":"f0a082a4","cid":17243} // 𠂤
  ,{"code":"000200b0","utf16":"\ud840\udcb0","utf8":"f0a082b0","cid":14209} // 𠂰
  ,{"code":"000200f5","utf16":"\ud840\udcf5","utf8":"f0a083b5","cid":20057} // 𠃵
  ,{"code":"00020158","utf16":"\ud840\udd58","utf8":"f0a08598","cid":20075} // 𠅘
  ,{"code":"000201a2","utf16":"\ud840\udda2","utf8":"f0a086a2","cid":13857} // 𠆢
  ,{"code":"00020213","utf16":"\ud840\ude13","utf8":"f0a08893","cid":17259} // 𠈓
  ,{"code":"0002032b","utf16":"\ud840\udf2b","utf8":"f0a08cab","cid":17282} // 𠌫
  ,{"code":"00020371","utf16":"\ud840\udf71","utf8":"f0a08db1","cid":17291} // 𠍱
  ,{"code":"00020381","utf16":"\ud840\udf81","utf8":"f0a08e81","cid":17289} // 𠎁
  ,{"code":"000203f9","utf16":"\ud840\udff9","utf8":"f0a08fb9","cid":17295} // 𠏹
  ,{"code":"0002044a","utf16":"\ud841\udc4a","utf8":"f0a0918a","cid":17297} // 𠑊
  ,{"code":"00020509","utf16":"\ud841\udd09","utf8":"f0a09489","cid":17299} // 𠔉
  ,{"code":"0002053f","utf16":"\ud841\udd3f","utf8":"f0a094bf","cid":14188} // 𠔿
  ,{"code":"000205b1","utf16":"\ud841\uddb1","utf8":"f0a096b1","cid":20080} // 𠖱
  ,{"code":"000205d6","utf16":"\ud841\uddd6","utf8":"f0a09796","cid":17308} // 𠗖
  ,{"code":"00020611","utf16":"\ud841\ude11","utf8":"f0a09891","cid":14294} // 𠘑
  ,{"code":"00020628","utf16":"\ud841\ude28","utf8":"f0a098a8","cid":14105} // 𠘨
  ,{"code":"000206ec","utf16":"\ud841\udeec","utf8":"f0a09bac","cid":20083} // 𠛬
  ,{"code":"0002074f","utf16":"\ud841\udf4f","utf8":"f0a09d8f","cid":17312} // 𠝏
  ,{"code":"000207c8","utf16":"\ud841\udfc8","utf8":"f0a09f88","cid":20128} // 𠟈
  ,{"code":"00020807","utf16":"\ud842\udc07","utf8":"f0a0a087","cid":17319} // 𠠇
  ,{"code":"0002083a","utf16":"\ud842\udc3a","utf8":"f0a0a0ba","cid":17321} // 𠠺
  ,{"code":"000208b9","utf16":"\ud842\udcb9","utf8":"f0a0a2b9","cid":17327} // 𠢹
  ,{"code":"0002090e","utf16":"\ud842\udd0e","utf8":"f0a0a48e","cid":13523} // 𠤎
  ,{"code":"0002097c","utf16":"\ud842\udd7c","utf8":"f0a0a5bc","cid":17331} // 𠥼
  ,{"code":"00020984","utf16":"\ud842\udd84","utf8":"f0a0a684","cid":14109} // 𠦄
  ,{"code":"0002099d","utf16":"\ud842\udd9d","utf8":"f0a0a69d","cid":17332} // 𠦝
  ,{"code":"00020a64","utf16":"\ud842\ude64","utf8":"f0a0a9a4","cid":13755} // 𠩤
  ,{"code":"00020ad3","utf16":"\ud842\uded3","utf8":"f0a0ab93","cid":17337} // 𠫓
  ,{"code":"00020b1d","utf16":"\ud842\udf1d","utf8":"f0a0ac9d","cid":17340} // 𠬝
  ,{"code":"00020b9f","utf16":"\ud842\udf9f","utf8":"f0a0ae9f","cid":13803} // 𠮟
  ,{"code":"00020bb7","utf16":"\ud842\udfb7","utf8":"f0a0aeb7","cid":13706} // 𠮷
  ,{"code":"00020d45","utf16":"\ud843\udd45","utf8":"f0a0b585","cid":17359} // 𠵅
  ,{"code":"00020d58","utf16":"\ud843\udd58","utf8":"f0a0b598","cid":20090} // 𠵘
  ,{"code":"00020de1","utf16":"\ud843\udde1","utf8":"f0a0b7a1","cid":17373} // 𠷡
  ,{"code":"00020e64","utf16":"\ud843\ude64","utf8":"f0a0b9a4","cid":17388} // 𠹤
  ,{"code":"00020e6d","utf16":"\ud843\ude6d","utf8":"f0a0b9ad","cid":17380} // 𠹭
  ,{"code":"00020e95","utf16":"\ud843\ude95","utf8":"f0a0ba95","cid":17379} // 𠺕
  ,{"code":"00020f5f","utf16":"\ud843\udf5f","utf8":"f0a0bd9f","cid":17391} // 𠽟
  ,{"code":"00021201","utf16":"\ud844\ude01","utf8":"f0a18881","cid":17414} // 𡈁
  ,{"code":"0002123d","utf16":"\ud844\ude3d","utf8":"f0a188bd","cid":13953} // 𡈽
  ,{"code":"00021255","utf16":"\ud844\ude55","utf8":"f0a18995","cid":17415} // 𡉕
  ,{"code":"00021274","utf16":"\ud844\ude74","utf8":"f0a189b4","cid":17421} // 𡉴
  ,{"code":"0002127b","utf16":"\ud844\ude7b","utf8":"f0a189bb","cid":17417} // 𡉻
  ,{"code":"000212d7","utf16":"\ud844\uded7","utf8":"f0a18b97","cid":17429} // 𡋗
  ,{"code":"000212e4","utf16":"\ud844\udee4","utf8":"f0a18ba4","cid":17428} // 𡋤
  ,{"code":"000212fd","utf16":"\ud844\udefd","utf8":"f0a18bbd","cid":17435} // 𡋽
  ,{"code":"0002131b","utf16":"\ud844\udf1b","utf8":"f0a18c9b","cid":16816} // 𡌛
  ,{"code":"00021336","utf16":"\ud844\udf36","utf8":"f0a18cb6","cid":17437} // 𡌶
  ,{"code":"00021344","utf16":"\ud844\udf44","utf8":"f0a18d84","cid":17438} // 𡍄
  ,{"code":"000213c4","utf16":"\ud844\udfc4","utf8":"f0a18f84","cid":17449} // 𡏄
  ,{"code":"0002146d","utf16":"\ud845\udc6d","utf8":"f0a191ad","cid":17462} // 𡑭
  ,{"code":"0002146e","utf16":"\ud845\udc6e","utf8":"f0a191ae","cid":16821} // 𡑮
  ,{"code":"000215d7","utf16":"\ud845\uddd7","utf8":"f0a19797","cid":17472} // 𡗗
  ,{"code":"00021647","utf16":"\ud845\ude47","utf8":"f0a19987","cid":17480} // 𡙇
  ,{"code":"000216b4","utf16":"\ud845\udeb4","utf8":"f0a19ab4","cid":16838} // 𡚴
  ,{"code":"00021706","utf16":"\ud845\udf06","utf8":"f0a19c86","cid":17492} // 𡜆
  ,{"code":"00021742","utf16":"\ud845\udf42","utf8":"f0a19d82","cid":17493} // 𡝂
  ,{"code":"000218bd","utf16":"\ud846\udcbd","utf8":"f0a1a2bd","cid":16833} // 𡢽
  ,{"code":"000219c3","utf16":"\ud846\uddc3","utf8":"f0a1a783","cid":17525} // 𡧃
  ,{"code":"00021a1a","utf16":"\ud846\ude1a","utf8":"f0a1a89a","cid":7825} // 𡨚
  ,{"code":"00021c56","utf16":"\ud847\udc56","utf8":"f0a1b196","cid":17539} // 𡱖
  ,{"code":"00021d2d","utf16":"\ud847\udd2d","utf8":"f0a1b4ad","cid":17544} // 𡴭
  ,{"code":"00021d45","utf16":"\ud847\udd45","utf8":"f0a1b585","cid":17545} // 𡵅
  ,{"code":"00021d62","utf16":"\ud847\udd62","utf8":"f0a1b5a2","cid":17547} // 𡵢
  ,{"code":"00021d78","utf16":"\ud847\udd78","utf8":"f0a1b5b8","cid":17546} // 𡵸
  ,{"code":"00021d92","utf16":"\ud847\udd92","utf8":"f0a1b692","cid":17556} // 𡶒
  ,{"code":"00021d9c","utf16":"\ud847\udd9c","utf8":"f0a1b69c","cid":17552} // 𡶜
  ,{"code":"00021da1","utf16":"\ud847\udda1","utf8":"f0a1b6a1","cid":17551} // 𡶡
  ,{"code":"00021db7","utf16":"\ud847\uddb7","utf8":"f0a1b6b7","cid":17559} // 𡶷
  ,{"code":"00021de0","utf16":"\ud847\udde0","utf8":"f0a1b7a0","cid":17561} // 𡷠
  ,{"code":"00021e33","utf16":"\ud847\ude33","utf8":"f0a1b8b3","cid":17562} // 𡸳
  ,{"code":"00021e34","utf16":"\ud847\ude34","utf8":"f0a1b8b4","cid":16845} // 𡸴
  ,{"code":"00021f1e","utf16":"\ud847\udf1e","utf8":"f0a1bc9e","cid":17575} // 𡼞
  ,{"code":"00021f76","utf16":"\ud847\udf76","utf8":"f0a1bdb6","cid":17582} // 𡽶
  ,{"code":"00021ffa","utf16":"\ud847\udffa","utf8":"f0a1bfba","cid":17585} // 𡿺
  ,{"code":"0002217b","utf16":"\ud848\udd7b","utf8":"f0a285bb","cid":17599} // 𢅻
  ,{"code":"00022218","utf16":"\ud848\ude18","utf8":"f0a28898","cid":19105} // 𢈘
  ,{"code":"0002231e","utf16":"\ud848\udf1e","utf8":"f0a28c9e","cid":17605} // 𢌞
  ,{"code":"000223ad","utf16":"\ud848\udfad","utf8":"f0a28ead","cid":17608} // 𢎭
  ,{"code":"00022609","utf16":"\ud849\ude09","utf8":"f0a29889","cid":15443} // 𢘉
  ,{"code":"000226f3","utf16":"\ud849\udef3","utf8":"f0a29bb3","cid":17632} // 𢛳
  ,{"code":"0002285b","utf16":"\ud84a\udc5b","utf8":"f0a2a19b","cid":17647} // 𢡛
  ,{"code":"000228ab","utf16":"\ud84a\udcab","utf8":"f0a2a2ab","cid":17653} // 𢢫
  ,{"code":"0002298f","utf16":"\ud84a\udd8f","utf8":"f0a2a68f","cid":17657} // 𢦏
  ,{"code":"00022ab8","utf16":"\ud84a\udeb8","utf8":"f0a2aab8","cid":17667} // 𢪸
  ,{"code":"00022b46","utf16":"\ud84a\udf46","utf8":"f0a2ad86","cid":17680} // 𢭆
  ,{"code":"00022ba6","utf16":"\ud84a\udfa6","utf8":"f0a2aea6","cid":17683} // 𢮦
  ,{"code":"00022c1d","utf16":"\ud84b\udc1d","utf8":"f0a2b09d","cid":17682} // 𢰝
  ,{"code":"00022c24","utf16":"\ud84b\udc24","utf8":"f0a2b0a4","cid":17686} // 𢰤
  ,{"code":"00022de1","utf16":"\ud84b\udde1","utf8":"f0a2b7a1","cid":17710} // 𢷡
  ,{"code":"00022e42","utf16":"\ud84b\ude42","utf8":"f0a2b982","cid":20124} // 𢹂
  ,{"code":"00022feb","utf16":"\ud84b\udfeb","utf8":"f0a2bfab","cid":20130} // 𢿫
  ,{"code":"000231b6","utf16":"\ud84c\uddb6","utf8":"f0a386b6","cid":17744} // 𣆶
  ,{"code":"000231c3","utf16":"\ud84c\uddc3","utf8":"f0a38783","cid":17742} // 𣇃
  ,{"code":"000231c4","utf16":"\ud84c\uddc4","utf8":"f0a38784","cid":16888} // 𣇄
  ,{"code":"000231f5","utf16":"\ud84c\uddf5","utf8":"f0a387b5","cid":17743} // 𣇵
  ,{"code":"00023372","utf16":"\ud84c\udf72","utf8":"f0a38db2","cid":17761} // 𣍲
  ,{"code":"000233d0","utf16":"\ud84c\udfd0","utf8":"f0a38f90","cid":17768} // 𣏐
  ,{"code":"000233d2","utf16":"\ud84c\udfd2","utf8":"f0a38f92","cid":17764} // 𣏒
  ,{"code":"000233d3","utf16":"\ud84c\udfd3","utf8":"f0a38f93","cid":17763} // 𣏓
  ,{"code":"000233d5","utf16":"\ud84c\udfd5","utf8":"f0a38f95","cid":17770} // 𣏕
  ,{"code":"000233da","utf16":"\ud84c\udfda","utf8":"f0a38f9a","cid":17772} // 𣏚
  ,{"code":"000233df","utf16":"\ud84c\udfdf","utf8":"f0a38f9f","cid":17774} // 𣏟
  ,{"code":"000233e4","utf16":"\ud84c\udfe4","utf8":"f0a38fa4","cid":17769} // 𣏤
  ,{"code":"000233fe","utf16":"\ud84c\udffe","utf8":"f0a38fbe","cid":15422} // 𣏾
  ,{"code":"0002344a","utf16":"\ud84d\udc4a","utf8":"f0a3918a","cid":17782} // 𣑊
  ,{"code":"0002344b","utf16":"\ud84d\udc4b","utf8":"f0a3918b","cid":17784} // 𣑋
  ,{"code":"00023451","utf16":"\ud84d\udc51","utf8":"f0a39191","cid":17783} // 𣑑
  ,{"code":"00023465","utf16":"\ud84d\udc65","utf8":"f0a391a5","cid":17788} // 𣑥
  ,{"code":"000234e4","utf16":"\ud84d\udce4","utf8":"f0a393a4","cid":17814} // 𣓤
  ,{"code":"0002355a","utf16":"\ud84d\udd5a","utf8":"f0a3959a","cid":17815} // 𣕚
  ,{"code":"00023594","utf16":"\ud84d\udd94","utf8":"f0a39694","cid":17827} // 𣖔
  ,{"code":"000235c4","utf16":"\ud84d\uddc4","utf8":"f0a39784","cid":16905} // 𣗄
  ,{"code":"00023638","utf16":"\ud84d\ude38","utf8":"f0a398b8","cid":17843} // 𣘸
  ,{"code":"00023639","utf16":"\ud84d\ude39","utf8":"f0a398b9","cid":17841} // 𣘹
  ,{"code":"0002363a","utf16":"\ud84d\ude3a","utf8":"f0a398ba","cid":15393} // 𣘺
  ,{"code":"00023647","utf16":"\ud84d\ude47","utf8":"f0a39987","cid":17842} // 𣙇
  ,{"code":"0002370c","utf16":"\ud84d\udf0c","utf8":"f0a39c8c","cid":17863} // 𣜌
  ,{"code":"0002371c","utf16":"\ud84d\udf1c","utf8":"f0a39c9c","cid":17854} // 𣜜
  ,{"code":"0002373f","utf16":"\ud84d\udf3f","utf8":"f0a39cbf","cid":16914} // 𣜿
  ,{"code":"00023763","utf16":"\ud84d\udf63","utf8":"f0a39da3","cid":16916} // 𣝣
  ,{"code":"00023764","utf16":"\ud84d\udf64","utf8":"f0a39da4","cid":17867} // 𣝤
  ,{"code":"000237e7","utf16":"\ud84d\udfe7","utf8":"f0a39fa7","cid":17875} // 𣟧
  ,{"code":"000237ff","utf16":"\ud84d\udfff","utf8":"f0a39fbf","cid":17874} // 𣟿
  ,{"code":"00023824","utf16":"\ud84e\udc24","utf8":"f0a3a0a4","cid":17880} // 𣠤
  ,{"code":"0002383d","utf16":"\ud84e\udc3d","utf8":"f0a3a0bd","cid":17885} // 𣠽
  ,{"code":"00023a98","utf16":"\ud84e\ude98","utf8":"f0a3aa98","cid":17897} // 𣪘
  ,{"code":"00023c7f","utf16":"\ud84f\udc7f","utf8":"f0a3b1bf","cid":17910} // 𣱿
  ,{"code":"00023cbe","utf16":"\ud84f\udcbe","utf8":"f0a3b2be","cid":14293} // 𣲾
  ,{"code":"00023cfe","utf16":"\ud84f\udcfe","utf8":"f0a3b3be","cid":13904} // 𣳾
  ,{"code":"00023d00","utf16":"\ud84f\udd00","utf8":"f0a3b480","cid":17925} // 𣴀
  ,{"code":"00023d0e","utf16":"\ud84f\udd0e","utf8":"f0a3b48e","cid":18394} // 𣴎
  ,{"code":"00023d40","utf16":"\ud84f\udd40","utf8":"f0a3b580","cid":17942} // 𣵀
  ,{"code":"00023dd3","utf16":"\ud84f\uddd3","utf8":"f0a3b793","cid":17945} // 𣷓
  ,{"code":"00023df9","utf16":"\ud84f\uddf9","utf8":"f0a3b7b9","cid":17944} // 𣷹
  ,{"code":"00023dfa","utf16":"\ud84f\uddfa","utf8":"f0a3b7ba","cid":17943} // 𣷺
  ,{"code":"00023f7e","utf16":"\ud84f\udf7e","utf8":"f0a3bdbe","cid":17983} // 𣽾
  ,{"code":"0002404b","utf16":"\ud850\udc4b","utf8":"f0a4818b","cid":20168} // 𤁋
  ,{"code":"00024096","utf16":"\ud850\udc96","utf8":"f0a48296","cid":17998} // 𤂖
  ,{"code":"00024103","utf16":"\ud850\udd03","utf8":"f0a48483","cid":18003} // 𤄃
  ,{"code":"000241c6","utf16":"\ud850\uddc6","utf8":"f0a48786","cid":18015} // 𤇆
  ,{"code":"000241fe","utf16":"\ud850\uddfe","utf8":"f0a487be","cid":18018} // 𤇾
  ,{"code":"000242ee","utf16":"\ud850\udeee","utf8":"f0a48bae","cid":14282} // 𤋮
  ,{"code":"000243bc","utf16":"\ud850\udfbc","utf8":"f0a48ebc","cid":18039} // 𤎼
  ,{"code":"000243d0","utf16":"\ud850\udfd0","utf8":"f0a48f90","cid":7838} // 𤏐
  ,{"code":"00024629","utf16":"\ud851\ude29","utf8":"f0a498a9","cid":18049} // 𤘩
  ,{"code":"000246a5","utf16":"\ud851\udea5","utf8":"f0a49aa5","cid":18055} // 𤚥
  ,{"code":"000247f1","utf16":"\ud851\udff1","utf8":"f0a49fb1","cid":16970} // 𤟱
  ,{"code":"00024896","utf16":"\ud852\udc96","utf8":"f0a4a296","cid":18077} // 𤢖
  ,{"code":"00024a4d","utf16":"\ud852\ude4d","utf8":"f0a4a98d","cid":18104} // 𤩍
  ,{"code":"00024b56","utf16":"\ud852\udf56","utf8":"f0a4ad96","cid":18117} // 𤭖
  ,{"code":"00024b6f","utf16":"\ud852\udf6f","utf8":"f0a4adaf","cid":18119} // 𤭯
  ,{"code":"00024c16","utf16":"\ud853\udc16","utf8":"f0a4b096","cid":18124} // 𤰖
  ,{"code":"00024d14","utf16":"\ud853\udd14","utf8":"f0a4b494","cid":13995} // 𤴔
  ,{"code":"00024e04","utf16":"\ud853\ude04","utf8":"f0a4b884","cid":20058} // 𤸄
  ,{"code":"00024e0e","utf16":"\ud853\ude0e","utf8":"f0a4b88e","cid":18158} // 𤸎
  ,{"code":"00024e37","utf16":"\ud853\ude37","utf8":"f0a4b8b7","cid":18162} // 𤸷
  ,{"code":"00024e6a","utf16":"\ud853\ude6a","utf8":"f0a4b9aa","cid":18167} // 𤹪
  ,{"code":"00024e8b","utf16":"\ud853\ude8b","utf8":"f0a4ba8b","cid":18170} // 𤺋
  ,{"code":"00024ff2","utf16":"\ud853\udff2","utf8":"f0a4bfb2","cid":20059} // 𤿲
  ,{"code":"0002504a","utf16":"\ud854\udc4a","utf8":"f0a5818a","cid":18181} // 𥁊
  ,{"code":"00025055","utf16":"\ud854\udc55","utf8":"f0a58195","cid":18183} // 𥁕
  ,{"code":"00025122","utf16":"\ud854\udd22","utf8":"f0a584a2","cid":18185} // 𥄢
  ,{"code":"000251a9","utf16":"\ud854\udda9","utf8":"f0a586a9","cid":18190} // 𥆩
  ,{"code":"000251cd","utf16":"\ud854\uddcd","utf8":"f0a5878d","cid":18193} // 𥇍
  ,{"code":"000251e5","utf16":"\ud854\udde5","utf8":"f0a587a5","cid":18192} // 𥇥
  ,{"code":"0002521e","utf16":"\ud854\ude1e","utf8":"f0a5889e","cid":18195} // 𥈞
  ,{"code":"0002524c","utf16":"\ud854\ude4c","utf8":"f0a5898c","cid":18197} // 𥉌
  ,{"code":"0002542e","utf16":"\ud855\udc2e","utf8":"f0a590ae","cid":18209} // 𥐮
  ,{"code":"0002548e","utf16":"\ud855\udc8e","utf8":"f0a5928e","cid":17005} // 𥒎
  ,{"code":"000254d9","utf16":"\ud855\udcd9","utf8":"f0a59399","cid":18217} // 𥓙
  ,{"code":"0002550e","utf16":"\ud855\udd0e","utf8":"f0a5948e","cid":17009} // 𥔎
  ,{"code":"000255a7","utf16":"\ud855\udda7","utf8":"f0a596a7","cid":18229} // 𥖧
  ,{"code":"0002567f","utf16":"\ud855\ude7f","utf8":"f0a599bf","cid":14075} // 𥙿
  ,{"code":"00025771","utf16":"\ud855\udf71","utf8":"f0a59db1","cid":17018} // 𥝱
  ,{"code":"000257a9","utf16":"\ud855\udfa9","utf8":"f0a59ea9","cid":18248} // 𥞩
  ,{"code":"000257b4","utf16":"\ud855\udfb4","utf8":"f0a59eb4","cid":18249} // 𥞴
  ,{"code":"00025874","utf16":"\ud856\udc74","utf8":"f0a5a1b4","cid":7670} // 𥡴
  ,{"code":"000259c4","utf16":"\ud856\uddc4","utf8":"f0a5a784","cid":17024} // 𥧄
  ,{"code":"000259cc","utf16":"\ud856\uddcc","utf8":"f0a5a78c","cid":20112} // 𥧌
  ,{"code":"000259d4","utf16":"\ud856\uddd4","utf8":"f0a5a794","cid":18268} // 𥧔
  ,{"code":"00025ad7","utf16":"\ud856\uded7","utf8":"f0a5ab97","cid":13922} // 𥫗
  ,{"code":"00025ae3","utf16":"\ud856\udee3","utf8":"f0a5aba3","cid":18277} // 𥫣
  ,{"code":"00025ae4","utf16":"\ud856\udee4","utf8":"f0a5aba4","cid":18276} // 𥫤
  ,{"code":"00025af1","utf16":"\ud856\udef1","utf8":"f0a5abb1","cid":18278} // 𥫱
  ,{"code":"00025bb2","utf16":"\ud856\udfb2","utf8":"f0a5aeb2","cid":18293} // 𥮲
  ,{"code":"00025c4b","utf16":"\ud857\udc4b","utf8":"f0a5b18b","cid":18302} // 𥱋
  ,{"code":"00025c64","utf16":"\ud857\udc64","utf8":"f0a5b1a4","cid":18303} // 𥱤
  ,{"code":"00025da1","utf16":"\ud857\udda1","utf8":"f0a5b6a1","cid":17033} // 𥶡
  ,{"code":"00025e2e","utf16":"\ud857\ude2e","utf8":"f0a5b8ae","cid":18318} // 𥸮
  ,{"code":"00025e56","utf16":"\ud857\ude56","utf8":"f0a5b996","cid":18319} // 𥹖
  ,{"code":"00025e62","utf16":"\ud857\ude62","utf8":"f0a5b9a2","cid":18322} // 𥹢
  ,{"code":"00025e65","utf16":"\ud857\ude65","utf8":"f0a5b9a5","cid":18320} // 𥹥
  ,{"code":"00025ec2","utf16":"\ud857\udec2","utf8":"f0a5bb82","cid":18327} // 𥻂
  ,{"code":"00025ed8","utf16":"\ud857\uded8","utf8":"f0a5bb98","cid":18325} // 𥻘
  ,{"code":"00025ee8","utf16":"\ud857\udee8","utf8":"f0a5bba8","cid":18329} // 𥻨
  ,{"code":"00025f23","utf16":"\ud857\udf23","utf8":"f0a5bca3","cid":18330} // 𥼣
  ,{"code":"00025f5c","utf16":"\ud857\udf5c","utf8":"f0a5bd9c","cid":18332} // 𥽜
  ,{"code":"00025fd4","utf16":"\ud857\udfd4","utf8":"f0a5bf94","cid":18339} // 𥿔
  ,{"code":"00025fe0","utf16":"\ud857\udfe0","utf8":"f0a5bfa0","cid":18338} // 𥿠
  ,{"code":"00025ffb","utf16":"\ud857\udffb","utf8":"f0a5bfbb","cid":18345} // 𥿻
  ,{"code":"0002600c","utf16":"\ud858\udc0c","utf8":"f0a6808c","cid":18344} // 𦀌
  ,{"code":"00026017","utf16":"\ud858\udc17","utf8":"f0a68097","cid":18352} // 𦀗
  ,{"code":"00026060","utf16":"\ud858\udc60","utf8":"f0a681a0","cid":18355} // 𦁠
  ,{"code":"000260ed","utf16":"\ud858\udced","utf8":"f0a683ad","cid":18365} // 𦃭
  ,{"code":"00026222","utf16":"\ud858\ude22","utf8":"f0a688a2","cid":13691} // 𦈢
  ,{"code":"0002626a","utf16":"\ud858\ude6a","utf8":"f0a689aa","cid":14189} // 𦉪
  ,{"code":"00026270","utf16":"\ud858\ude70","utf8":"f0a689b0","cid":18385} // 𦉰
  ,{"code":"00026286","utf16":"\ud858\ude86","utf8":"f0a68a86","cid":18386} // 𦊆
  ,{"code":"0002634c","utf16":"\ud858\udf4c","utf8":"f0a68d8c","cid":20311} // 𦍌
  ,{"code":"00026402","utf16":"\ud859\udc02","utf8":"f0a69082","cid":18398} // 𦐂
  ,{"code":"0002667e","utf16":"\ud859\ude7e","utf8":"f0a699be","cid":18416} // 𦙾
  ,{"code":"000266b0","utf16":"\ud859\udeb0","utf8":"f0a69ab0","cid":14100} // 𦚰
  ,{"code":"0002671d","utf16":"\ud859\udf1d","utf8":"f0a69c9d","cid":18430} // 𦜝
  ,{"code":"000268dd","utf16":"\ud85a\udcdd","utf8":"f0a6a39d","cid":18444} // 𦣝
  ,{"code":"000268ea","utf16":"\ud85a\udcea","utf8":"f0a6a3aa","cid":18446} // 𦣪
  ,{"code":"00026951","utf16":"\ud85a\udd51","utf8":"f0a6a591","cid":13646} // 𦥑
  ,{"code":"0002696f","utf16":"\ud85a\udd6f","utf8":"f0a6a5af","cid":18450} // 𦥯
  ,{"code":"00026999","utf16":"\ud85a\udd99","utf8":"f0a6a699","cid":14134} // 𦦙
  ,{"code":"000269dd","utf16":"\ud85a\udddd","utf8":"f0a6a79d","cid":18452} // 𦧝
  ,{"code":"00026a1e","utf16":"\ud85a\ude1e","utf8":"f0a6a89e","cid":18455} // 𦨞
  ,{"code":"00026a58","utf16":"\ud85a\ude58","utf8":"f0a6a998","cid":18459} // 𦩘
  ,{"code":"00026a8c","utf16":"\ud85a\ude8c","utf8":"f0a6aa8c","cid":18463} // 𦪌
  ,{"code":"00026ab7","utf16":"\ud85a\udeb7","utf8":"f0a6aab7","cid":18466} // 𦪷
  ,{"code":"00026aff","utf16":"\ud85a\udeff","utf8":"f0a6abbf","cid":17063} // 𦫿
  ,{"code":"00026c29","utf16":"\ud85b\udc29","utf8":"f0a6b0a9","cid":17478} // 𦰩
  ,{"code":"00026c73","utf16":"\ud85b\udc73","utf8":"f0a6b1b3","cid":18506} // 𦱳
  ,{"code":"00026c9e","utf16":"\ud85b\udc9e","utf8":"f0a6b29e","cid":20206} // 𦲞
  ,{"code":"00026cdd","utf16":"\ud85b\udcdd","utf8":"f0a6b39d","cid":18515} // 𦳝
  ,{"code":"00026e40","utf16":"\ud85b\ude40","utf8":"f0a6b980","cid":17089} // 𦹀
  ,{"code":"00026e65","utf16":"\ud85b\ude65","utf8":"f0a6b9a5","cid":18528} // 𦹥
  ,{"code":"00026f94","utf16":"\ud85b\udf94","utf8":"f0a6be94","cid":18544} // 𦾔
  ,{"code":"00026ff8","utf16":"\ud85b\udff8","utf8":"f0a6bfb8","cid":18553} // 𦿸
  ,{"code":"000270f4","utf16":"\ud85c\udcf4","utf8":"f0a783b4","cid":17103} // 𧃴
  ,{"code":"0002710d","utf16":"\ud85c\udd0d","utf8":"f0a7848d","cid":18571} // 𧄍
  ,{"code":"00027139","utf16":"\ud85c\udd39","utf8":"f0a784b9","cid":18574} // 𧄹
  ,{"code":"000273da","utf16":"\ud85c\udfda","utf8":"f0a78f9a","cid":18611} // 𧏚
  ,{"code":"000273db","utf16":"\ud85c\udfdb","utf8":"f0a78f9b","cid":18610} // 𧏛
  ,{"code":"000273fe","utf16":"\ud85c\udffe","utf8":"f0a78fbe","cid":18617} // 𧏾
  ,{"code":"00027410","utf16":"\ud85d\udc10","utf8":"f0a79090","cid":18620} // 𧐐
  ,{"code":"00027449","utf16":"\ud85d\udc49","utf8":"f0a79189","cid":18624} // 𧑉
  ,{"code":"00027614","utf16":"\ud85d\ude14","utf8":"f0a79894","cid":18638} // 𧘔
  ,{"code":"00027615","utf16":"\ud85d\ude15","utf8":"f0a79895","cid":18637} // 𧘕
  ,{"code":"00027631","utf16":"\ud85d\ude31","utf8":"f0a798b1","cid":18640} // 𧘱
  ,{"code":"00027684","utf16":"\ud85d\ude84","utf8":"f0a79a84","cid":17117} // 𧚄
  ,{"code":"00027693","utf16":"\ud85d\ude93","utf8":"f0a79a93","cid":18645} // 𧚓
  ,{"code":"0002770e","utf16":"\ud85d\udf0e","utf8":"f0a79c8e","cid":18650} // 𧜎
  ,{"code":"00027723","utf16":"\ud85d\udf23","utf8":"f0a79ca3","cid":18652} // 𧜣
  ,{"code":"00027752","utf16":"\ud85d\udf52","utf8":"f0a79d92","cid":18656} // 𧝒
  ,{"code":"00027985","utf16":"\ud85e\udd85","utf8":"f0a7a685","cid":18672} // 𧦅
  ,{"code":"000279b4","utf16":"\ud85e\uddb4","utf8":"f0a7a6b4","cid":20133} // 𧦴
  ,{"code":"00027a84","utf16":"\ud85e\ude84","utf8":"f0a7aa84","cid":18684} // 𧪄
  ,{"code":"00027bb3","utf16":"\ud85e\udfb3","utf8":"f0a7aeb3","cid":18699} // 𧮳
  ,{"code":"00027bbe","utf16":"\ud85e\udfbe","utf8":"f0a7aebe","cid":18701} // 𧮾
  ,{"code":"00027bc7","utf16":"\ud85e\udfc7","utf8":"f0a7af87","cid":18702} // 𧯇
  ,{"code":"00027c3c","utf16":"\ud85f\udc3c","utf8":"f0a7b0bc","cid":20220} // 𧰼
  ,{"code":"00027cb8","utf16":"\ud85f\udcb8","utf8":"f0a7b2b8","cid":18708} // 𧲸
  ,{"code":"00027d73","utf16":"\ud85f\udd73","utf8":"f0a7b5b3","cid":20060} // 𧵳
  ,{"code":"00027da0","utf16":"\ud85f\udda0","utf8":"f0a7b6a0","cid":18716} // 𧶠
  ,{"code":"00027e10","utf16":"\ud85f\ude10","utf8":"f0a7b890","cid":18718} // 𧸐
  ,{"code":"00027fb7","utf16":"\ud85f\udfb7","utf8":"f0a7beb7","cid":13898} // 𧾷
  ,{"code":"0002808a","utf16":"\ud860\udc8a","utf8":"f0a8828a","cid":18727} // 𨂊
  ,{"code":"000280bb","utf16":"\ud860\udcbb","utf8":"f0a882bb","cid":18733} // 𨂻
  ,{"code":"00028277","utf16":"\ud860\ude77","utf8":"f0a889b7","cid":17140} // 𨉷
  ,{"code":"00028282","utf16":"\ud860\ude82","utf8":"f0a88a82","cid":18745} // 𨊂
  ,{"code":"000282f3","utf16":"\ud860\udef3","utf8":"f0a88bb3","cid":18747} // 𨋳
  ,{"code":"000283cd","utf16":"\ud860\udfcd","utf8":"f0a88f8d","cid":17146} // 𨏍
  ,{"code":"0002840c","utf16":"\ud861\udc0c","utf8":"f0a8908c","cid":18754} // 𨐌
  ,{"code":"00028455","utf16":"\ud861\udc55","utf8":"f0a89195","cid":18757} // 𨑕
  ,{"code":"0002856b","utf16":"\ud861\udd6b","utf8":"f0a895ab","cid":18770} // 𨕫
  ,{"code":"000286d7","utf16":"\ud861\uded7","utf8":"f0a89b97","cid":18784} // 𨛗
  ,{"code":"000286fa","utf16":"\ud861\udefa","utf8":"f0a89bba","cid":18787} // 𨛺
  ,{"code":"00028946","utf16":"\ud862\udd46","utf8":"f0a8a586","cid":18812} // 𨥆
  ,{"code":"00028949","utf16":"\ud862\udd49","utf8":"f0a8a589","cid":18811} // 𨥉
  ,{"code":"0002896b","utf16":"\ud862\udd6b","utf8":"f0a8a5ab","cid":18817} // 𨥫
  ,{"code":"00028987","utf16":"\ud862\udd87","utf8":"f0a8a687","cid":14253} // 𨦇
  ,{"code":"00028988","utf16":"\ud862\udd88","utf8":"f0a8a688","cid":18824} // 𨦈
  ,{"code":"00028a1e","utf16":"\ud862\ude1e","utf8":"f0a8a89e","cid":18843} // 𨨞
  ,{"code":"00028a29","utf16":"\ud862\ude29","utf8":"f0a8a8a9","cid":18844} // 𨨩
  ,{"code":"00028a43","utf16":"\ud862\ude43","utf8":"f0a8a983","cid":18848} // 𨩃
  ,{"code":"00028a71","utf16":"\ud862\ude71","utf8":"f0a8a9b1","cid":18847} // 𨩱
  ,{"code":"00028a99","utf16":"\ud862\ude99","utf8":"f0a8aa99","cid":18855} // 𨪙
  ,{"code":"00028acd","utf16":"\ud862\udecd","utf8":"f0a8ab8d","cid":18856} // 𨫍
  ,{"code":"00028add","utf16":"\ud862\udedd","utf8":"f0a8ab9d","cid":18863} // 𨫝
  ,{"code":"00028ae4","utf16":"\ud862\udee4","utf8":"f0a8aba4","cid":18862} // 𨫤
  ,{"code":"00028bc1","utf16":"\ud862\udfc1","utf8":"f0a8af81","cid":18874} // 𨯁
  ,{"code":"00028bef","utf16":"\ud862\udfef","utf8":"f0a8afaf","cid":18875} // 𨯯
  ,{"code":"00028cdd","utf16":"\ud863\udcdd","utf8":"f0a8b39d","cid":7641} // 𨳝
  ,{"code":"00028d10","utf16":"\ud863\udd10","utf8":"f0a8b490","cid":18882} // 𨴐
  ,{"code":"00028d71","utf16":"\ud863\udd71","utf8":"f0a8b5b1","cid":18883} // 𨵱
  ,{"code":"00028dfb","utf16":"\ud863\uddfb","utf8":"f0a8b7bb","cid":18885} // 𨷻
  ,{"code":"00028e17","utf16":"\ud863\ude17","utf8":"f0a8b897","cid":14256} // 𨸗
  ,{"code":"00028e1f","utf16":"\ud863\ude1f","utf8":"f0a8b89f","cid":18886} // 𨸟
  ,{"code":"00028e36","utf16":"\ud863\ude36","utf8":"f0a8b8b6","cid":18890} // 𨸶
  ,{"code":"00028e89","utf16":"\ud863\ude89","utf8":"f0a8ba89","cid":18893} // 𨺉
  ,{"code":"00028eeb","utf16":"\ud863\udeeb","utf8":"f0a8bbab","cid":18895} // 𨻫
  ,{"code":"00028ef6","utf16":"\ud863\udef6","utf8":"f0a8bbb6","cid":7673} // 𨻶
  ,{"code":"00028f32","utf16":"\ud863\udf32","utf8":"f0a8bcb2","cid":18897} // 𨼲
  ,{"code":"00028ff8","utf16":"\ud863\udff8","utf8":"f0a8bfb8","cid":18903} // 𨿸
  ,{"code":"000292a0","utf16":"\ud864\udea0","utf8":"f0a98aa0","cid":18917} // 𩊠
  ,{"code":"000292b1","utf16":"\ud864\udeb1","utf8":"f0a98ab1","cid":18918} // 𩊱
  ,{"code":"00029490","utf16":"\ud865\udc90","utf8":"f0a99290","cid":18935} // 𩒐
  ,{"code":"000295cf","utf16":"\ud865\uddcf","utf8":"f0a9978f","cid":18944} // 𩗏
  ,{"code":"0002967f","utf16":"\ud865\ude7f","utf8":"f0a999bf","cid":13849} // 𩙿
  ,{"code":"000296f0","utf16":"\ud865\udef0","utf8":"f0a99bb0","cid":18959} // 𩛰
  ,{"code":"00029719","utf16":"\ud865\udf19","utf8":"f0a99c99","cid":18962} // 𩜙
  ,{"code":"00029750","utf16":"\ud865\udf50","utf8":"f0a99d90","cid":18966} // 𩝐
  ,{"code":"000298c6","utf16":"\ud866\udcc6","utf8":"f0a9a386","cid":18983} // 𩣆
  ,{"code":"00029a72","utf16":"\ud866\ude72","utf8":"f0a9a9b2","cid":19001} // 𩩲
  ,{"code":"00029d4b","utf16":"\ud867\udd4b","utf8":"f0a9b58b","cid":13717} // 𩵋
  ,{"code":"00029ddb","utf16":"\ud867\udddb","utf8":"f0a9b79b","cid":19026} // 𩷛
  ,{"code":"00029e15","utf16":"\ud867\ude15","utf8":"f0a9b895","cid":19036} // 𩸕
  ,{"code":"00029e3d","utf16":"\ud867\ude3d","utf8":"f0a9b8bd","cid":20315} // 𩸽
  ,{"code":"00029e49","utf16":"\ud867\ude49","utf8":"f0a9b989","cid":19038} // 𩹉
  ,{"code":"00029e8a","utf16":"\ud867\ude8a","utf8":"f0a9ba8a","cid":19037} // 𩺊
  ,{"code":"00029ec4","utf16":"\ud867\udec4","utf8":"f0a9bb84","cid":19046} // 𩻄
  ,{"code":"00029edb","utf16":"\ud867\udedb","utf8":"f0a9bb9b","cid":19054} // 𩻛
  ,{"code":"00029ee9","utf16":"\ud867\udee9","utf8":"f0a9bba9","cid":19051} // 𩻩
  ,{"code":"00029fce","utf16":"\ud867\udfce","utf8":"f0a9bf8e","cid":19071} // 𩿎
  ,{"code":"00029fd7","utf16":"\ud867\udfd7","utf8":"f0a9bf97","cid":19071} // 𩿗
  ,{"code":"0002a01a","utf16":"\ud868\udc1a","utf8":"f0aa809a","cid":19077} // 𪀚
  ,{"code":"0002a02f","utf16":"\ud868\udc2f","utf8":"f0aa80af","cid":19075} // 𪀯
  ,{"code":"0002a082","utf16":"\ud868\udc82","utf8":"f0aa8282","cid":19084} // 𪂂
  ,{"code":"0002a0f9","utf16":"\ud868\udcf9","utf8":"f0aa83b9","cid":19083} // 𪃹
  ,{"code":"0002a190","utf16":"\ud868\udd90","utf8":"f0aa8690","cid":17227} // 𪆐
  ,{"code":"0002a2b2","utf16":"\ud868\udeb2","utf8":"f0aa8ab2","cid":20072} // 𪊲
  ,{"code":"0002a38c","utf16":"\ud868\udf8c","utf8":"f0aa8e8c","cid":19109} // 𪎌
  ,{"code":"0002a437","utf16":"\ud869\udc37","utf8":"f0aa90b7","cid":19111} // 𪐷
  ,{"code":"0002a5f1","utf16":"\ud869\uddf1","utf8":"f0aa97b1","cid":19123} // 𪗱
  ,{"code":"0002a602","utf16":"\ud869\ude02","utf8":"f0aa9882","cid":19125} // 𪘂
  ,{"code":"0002a61a","utf16":"\ud869\ude1a","utf8":"f0aa989a","cid":20316} // 𪘚
  ,{"code":"0002a6b2","utf16":"\ud869\udeb2","utf8":"f0aa9ab2","cid":19129} // 𪚲
  ,{"code":"0002f804","utf16":"\ud87e\udc04","utf8":"f0afa084","cid":15388} // 你
  ,{"code":"0002f80f","utf16":"\ud87e\udc0f","utf8":"f0afa08f","cid":7814} // 兔
  ,{"code":"0002f815","utf16":"\ud87e\udc15","utf8":"f0afa095","cid":20061} // 再
  ,{"code":"0002f818","utf16":"\ud87e\udc18","utf8":"f0afa098","cid":7817} // 冤
  ,{"code":"0002f81a","utf16":"\ud87e\udc1a","utf8":"f0afa09a","cid":13954} // 冬
  ,{"code":"0002f822","utf16":"\ud87e\udc22","utf8":"f0afa0a2","cid":13684} // 割
  ,{"code":"0002f828","utf16":"\ud87e\udc28","utf8":"f0afa0a8","cid":13807} // 勺
  ,{"code":"0002f82c","utf16":"\ud87e\udc2c","utf8":"f0afa0ac","cid":14109} // 卉
  ,{"code":"0002f833","utf16":"\ud87e\udc33","utf8":"f0afa0b3","cid":13719} // 卿
  ,{"code":"0002f83f","utf16":"\ud87e\udc3f","utf8":"f0afa0bf","cid":13815} // 周
  ,{"code":"0002f846","utf16":"\ud87e\udc46","utf8":"f0afa186","cid":20062} // 善
  ,{"code":"0002f852","utf16":"\ud87e\udc52","utf8":"f0afa192","cid":13841} // 城
  ,{"code":"0002f862","utf16":"\ud87e\udc62","utf8":"f0afa1a2","cid":13998} // 姬
  ,{"code":"0002f86d","utf16":"\ud87e\udc6d","utf8":"f0afa1ad","cid":14121} // 寃
  ,{"code":"0002f873","utf16":"\ud87e\udc73","utf8":"f0afa1b3","cid":13832} // 将
  ,{"code":"0002f877","utf16":"\ud87e\udc77","utf8":"f0afa1b7","cid":7754} // 屠
  ,{"code":"0002f884","utf16":"\ud87e\udc84","utf8":"f0afa284","cid":7734} // 巽
  ,{"code":"0002f899","utf16":"\ud87e\udc99","utf8":"f0afa299","cid":20063} // 形
  ,{"code":"0002f89a","utf16":"\ud87e\udc9a","utf8":"f0afa29a","cid":13928} // 彫
  ,{"code":"0002f8a6","utf16":"\ud87e\udca6","utf8":"f0afa2a6","cid":20064} // 慈
  ,{"code":"0002f8ac","utf16":"\ud87e\udcac","utf8":"f0afa2ac","cid":13750} // 憲
  ,{"code":"0002f8b2","utf16":"\ud87e\udcb2","utf8":"f0afa2b2","cid":13867} // 成
  ,{"code":"0002f8b6","utf16":"\ud87e\udcb6","utf8":"f0afa2b6","cid":14129} // 拔
  ,{"code":"0002f8d3","utf16":"\ud87e\udcd3","utf8":"f0afa393","cid":7816} // 冕
  ,{"code":"0002f8db","utf16":"\ud87e\udcdb","utf8":"f0afa39b","cid":14140} // 杞
  ,{"code":"0002f8dc","utf16":"\ud87e\udcdc","utf8":"f0afa39c","cid":7695} // 杓
  ,{"code":"0002f8e1","utf16":"\ud87e\udce1","utf8":"f0afa3a1","cid":14291} // 桒
  ,{"code":"0002f8e5","utf16":"\ud87e\udce5","utf8":"f0afa3a5","cid":20065} // 栟
  ,{"code":"0002f8ea","utf16":"\ud87e\udcea","utf8":"f0afa3aa","cid":13679} // 槪
  ,{"code":"0002f8ed","utf16":"\ud87e\udced","utf8":"f0afa3ad","cid":7665} // 櫛
  ,{"code":"0002f8fc","utf16":"\ud87e\udcfc","utf8":"f0afa3bc","cid":13656} // 沿
  ,{"code":"0002f903","utf16":"\ud87e\udd03","utf8":"f0afa483","cid":13768} // 浩
  ,{"code":"0002f90b","utf16":"\ud87e\udd0b","utf8":"f0afa48b","cid":13801} // 滋
  ,{"code":"0002f90f","utf16":"\ud87e\udd0f","utf8":"f0afa48f","cid":13932} // 潮
  ,{"code":"0002f91a","utf16":"\ud87e\udd1a","utf8":"f0afa49a","cid":13916} // 炭
  ,{"code":"0002f920","utf16":"\ud87e\udd20","utf8":"f0afa4a0","cid":7839} // 爨
  ,{"code":"0002f921","utf16":"\ud87e\udd21","utf8":"f0afa4a1","cid":13809} // 爵
  ,{"code":"0002f945","utf16":"\ud87e\udd45","utf8":"f0afa585","cid":13357} // 眞
  ,{"code":"0002f947","utf16":"\ud87e\udd47","utf8":"f0afa587","cid":13854} // 真
  ,{"code":"0002f96c","utf16":"\ud87e\udd6c","utf8":"f0afa5ac","cid":14180} // 絣
  ,{"code":"0002f995","utf16":"\ud87e\udd95","utf8":"f0afa695","cid":13670} // 芽
  ,{"code":"0002f9d0","utf16":"\ud87e\uddd0","utf8":"f0afa790","cid":14068} // 諭
  ,{"code":"0002f9de","utf16":"\ud87e\uddde","utf8":"f0afa79e","cid":20066} // 軔
  ,{"code":"0002f9df","utf16":"\ud87e\udddf","utf8":"f0afa79f","cid":14069} // 輸
  ,{"code":"0002f9f4","utf16":"\ud87e\uddf4","utf8":"f0afa7b4","cid":15269} // 嶲
  ,{"code":"00022b4f","utf16":"\ud84a\udf4f","utf8":"f0a2ad8f","cid":17671} // 𢭏
  ,{"code":"00022b50","utf16":"\ud84a\udf50","utf8":"f0a2ad90","cid":17672} // 𢭐
  ,{"code":"00026ff6","utf16":"\ud85b\udff6","utf8":"f0a6bfb6","cid":18554} // 𦿶
  ,{"code":"00026ff7","utf16":"\ud85b\udff7","utf8":"f0a6bfb7","cid":18555} // 𦿷
  ,{"code":"000285c8","utf16":"\ud861\uddc8","utf8":"f0a89788","cid":18773} // 𨗈
  ,{"code":"000285c9","utf16":"\ud861\uddc9","utf8":"f0a89789","cid":18774} // 𨗉
  ,{"code":"000289ba","utf16":"\ud862\uddba","utf8":"f0a8a6ba","cid":18834} // 𨦺
  ,{"code":"000289bb","utf16":"\ud862\uddbb","utf8":"f0a8a6bb","cid":18835} // 𨦻
 ]
}
WORDでipamj明朝で表示させてみた。。

2013年4月11日木曜日

【直接参照されているモジュールまたはアプリケーションです@FLEX】は解決できるのか。。


どうにも、FLEXのこのWARNINGが気になる。
解決できるんだろうか。。。。

xxxxx は、直接参照されているモジュールまたはアプリケーションです。この場合、xxxxx とすべての依存関係は ***** にリンクされます。これを回避するためにインターフェイスの使用をお勧めします。

2013年4月9日火曜日

FireFoxのPDFビューアが全く使い物にならない件。

FireFoxのPDFビューアが、、それほど難しいPDFでもないハズなのに、全く使い物にならないっす。
●chrome26.0.1410.43 mで表示
 ●FireFox19.0.2で表示

2013年4月3日水曜日

UTF32をCIDに変換するには


UTF32をCIDに変換するには
Acrobatがある人は、
C:/Program Files (x86)/Adobe/Acrobat 9.0/Acrobat/Data/PSDisk/Resource/CMap/UniJISX0213-UTF32-H
C:/Program Files (x86)/Adobe/Acrobat 9.0/Acrobat/Data/PSDisk/Resource/CMap/UniJISX0213-UTF32-V
あたりを見るだけです。
アプリで使うには、CMapを読み込めるようにするのか、あらかじめ変換しておいて内部的にもってしまうのかは、まぁどっちでもいいですね。
とりあえず、私の環境では、、CMapは以下にありました。
C:/Program Files (x86)/Adobe/Adobe Flash CS5/ja_JP/Configuration/Importers/CMap
C:/Program Files (x86)/Adobe/Reader 11.0/Resource/CMap
C:/Program Files (x86)/Adobe/Acrobat 9.0/Resource/CMap
C:/Program Files (x86)/Adobe/Acrobat 9.0/Acrobat/Data/PSDisk/Resource/CMap

2013年4月2日火曜日

LNK4049/LNK4217の私の場合。

いやいや、VisualStudioでのことですが、
LNK4049/LNK4217
ってちょこちょこよくでるわけなんです。
そんで、ググると、結構、情報が出てたりするわけですが、

私の場合はこれでした。ちょっと見つけにくかったです。
それは、
コード生成/ランタイムライブラリの指定が、違ったものをリンクしようとしていた
です。
要するに、自分でstaticでライブラリを作り、新たなプログラムのEXEをそのライブラリとリンクさせる場合に、ライブラリの方のプロパティのランタイムの指定と、EXEの方のプロパティのランタイムライブラリの指定が違っていたためにおこりました。
/MTとか/MDとか、そういうやつですね。
あぁー1時間くらいつかったわ。。(-_-;)(-_-;)


ちなみに、私が探せたのは1件のみ、これです。

PHPでサロゲートペアをJSONで扱うときのバグ。(2)

とりあえず、こういう風に修正。
【PEARのJSON.php】
function bin2hexU16($utf16){
 $ret = sprintf('\u%04s', bin2hex($utf16));
 $n = strlen($ret);
 if($n != 10) return $ret;
 return substr($ret,0,6) . '\u' . substr($ret,6);
}
//旧
//$ascii .= sprintf('\u%04s', bin2hex($utf16));
//新
$ascii .= sprintf('%s', $this->bin2hexU16($utf16));

PHPでサロゲートペアをJSONで扱うときのバグ。

どうにもこうにもダメなのである。
 何がって、PHPでサロゲートペアをJSONで扱う時のバグである。
 以下、サンプルコード。
require_once "JSON.php";
$json["doc"]["info"]["t"] = "𠀋";//0x2000Bが1文字
$jsonstr = json_encode($json);
file_put_contents("c:/tmp/2000C.txt",$jsonstr);
$jjj = new Services_JSON;
$jsonstr = $jjj->encode($json);
file_put_contents("c:/tmp/2000C-PEAR.txt",$jsonstr);
で結果なのだが、、
●json_encodeの場合
{"doc":{"info":{"t":"\ud800\udc0b"}}}
え?d800ってなんだ!?d840じゃないのか!!

●Services_JSONのencodeの場合
{"doc":{"info":{"t":"\ud840dc0b"}}}
え?d840dc0bって8桁じゃないか!?

ってことで、どっちにしてもダメです。
でも、PEARのJSONの方は、明らかに、
sprintf('\u%04s', bin2hex($utf16));
っていう行が発見できるので、8ケタの時は、\uを入れるように、ここを修正すればなんとかなる。

んーー。。やっぱこんなことやる人は、そうそういないってことだよなぁーー。

2013年3月28日木曜日

UTF16化は正しい判断か?

私の作ってるC++の組版系S/Wは、UTF16で動作している。
しかし、今まではWindows系だったので、wchar_tでやっていた。

さて、こつこつとLINUX対応をしているのだが、どうにも美しくできない。
自分で、codingしてみて、はじめて、やっと、【PHP6の内部UTF16化計画頓挫】の意味がわかった気がした。

そもそも、組版というカテゴリの場合、サロゲートペアがあるかぎり、内部は最後にはUTF32でするべきだという結論はかわらない。
問題は、その上の部分だ。
そもそも、今時のUbuntuで、defaultで、strlen("あ")とやると、3が返ってくる。
だからというわけではないが、UTF8で実装するのが素直なとこなのかもしれない。

といったところで、UTF16で書いた部分を、UTF8で書き直してみて、美しいかどうか判定することにする。
やっぱり書いてみないとダメ。

まず書く。
まずcodingする。
まずやってみる。

全てを見通した設計ができほど、私は、頭がイイわけではないのだから。。。(-_-;)


2013年3月22日金曜日

C++でJSONを扱う件(3)

C++でJSONを扱う件(3)
JSONファイルそのものをどうやって読めばいいのかって点ですが。。。
ところで話は変わって、【オブジェクト指向】ってあるじゃないですか。
よく、直感的に、思考に近い形でとか言いますよね。
CODINGは、要するに、object指向かどうかが問題なのではなくて、
頭でわかりやすいかどうかです。
単純なものほどわかりやすいのは至極当然。
よって、TREE構造のものを読み込むことを考えたときに、、
全て展開したTREEを、上から1行ずつ読み込んでいくような、そんな感じで読み込みましょう。

ポイントは、いくつかの文字の判定とその分岐です。
考えるのは、、
【"】【:】【{】【}】【[】【]】【,】
の7つだけです。
といったところで、こんな感じでつくってみました。

//wpは文字列の配列
for(int w=0;wp[w]!=0;w++){
 if(ダブルクォーテーション){
  //-----------------------------
  if(bIn){
   // ここで文字列が終わるので、文字列の特定
  }
  //-----------------------------
  else{
   // 文字列の始まりを憶えて置く
  }
  //-----------------------------
  bIn = ! bIn;
 }
 if(bIn) continue;//次へ
 else if(コロン){     // 【:】
  // キーを確定させる
  // 値の開始位置を覚える
 }
 else if(中カッコ開始){    // 【{】
  // 現在のobjectをPUSHする
  // 現在のobjectの下にobjectを生成してそれを現在のobjectにする
 }
 else if(中カッコ終了){    // 【}】
  //キーと値を調べて、少なくとも値があったら現在のobjectに登録
  //キーは無い場合もある
  //現在のobjectをひとつPOPする
 }
 else if(大カッコ開始){    // 【[】
  // 現在のobjectをPUSHする
  // 現在のobjectの下にobjectを生成してそれを現在のobjectにする
 }
 else if(大カッコ終了){    // 【]】
  //キーと値を調べて、少なくとも値があったら現在のobjectに登録
  //キーは無い場合もある
  //現在のobjectをひとつPOPする
 }
 else if(カンマ){     // 【,】
  //キーと値を調べて、少なくとも値があったら現在のobjectに登録
  //キーは無い場合もある
 }
 //-----------------------------
}
/*
 ポイント
 文字列を判断すること
 キーと値を判断すること
*/
まぁ、昔ながらのよくある方法ですが、文字列の始まりの【"】のところを憶えておき、終わりの【"】の部分に\0を突っ込んで、char*(wchar_t*)で読むっていう算段です。
値については、【"】ではじまるかどうかで、文字列かどうかを判定するわけですね。
もちろん、このLOOPに入る前に、\\と\"をなんらかの方法で退避させ、値をobjectに登録するときに戻してやりますよ。。

たぶん、つづく。。。

2013年3月21日木曜日

C++でJSONを扱う件(2)

C++でJSONを扱う件(2)

STEP2
で、object型ですが、ここでは簡略化して、以下のように考えます。


struct objson{
    objson* parent; //    親
    objson* child;  //    子
    objson* prev;   //    兄
    objson* next;   //    弟
    char*   value;  //    データ部
    char    dat[4]; //    key部
    //その他いろいろあるけど省略
    objson& operator[](const char* c);   //["abc"]とかのため
    operator char*();                    //キャストするため
    void operator=(char* cp);            //代入するため
};

これは、objectのデータ長さが一定ではないためです。
もちろん、構造体のメンバの中に、VARIANT的な値をもつという方法もありますが、ここでは面倒になるのでやりません。
よって、bool/int/doulbeとかであれば、まぁあっても8バイトなわけなので、最初から確保するという荒業もありますが、文字列だとそうはいきません。
よって、こんな風に生成してみます。
int size = sizeof(objson) + strlen(moji) + strlen(key);
char* p = new char[size];
memset(p,0,size);
objson* o = (objson*)p;


keyを設定するには、datへcopy、値を設定するには、valueのポインタを設定してからstrcpyします。
strcpy(o->dat,key);
o->value = &o->dat[strlen(key)+1];
strcpy(o->value,value);

長さを算定してメモリを確保し、それにobjson*でキャストしています。

例えば、メモリ管理を自分で書けば、メモリを連続させたりすることもできるし、不要なnew-deleteを考えなくてもすみます。

ここでは、keyになる文字列と値になる文字列の分を足して、メモリを確保しています。


生成したあとは、parent/child/prev/nextを設定して階層をつくってやれば、
o->child->child->child
なんて指定も可能になります。

つづく。。