C 文字列操作 新しいページはコチラ

提供: yonewiki
移動: 案内, 検索
(文字列の抽出)
60行: 60行:
  
  
<syntaxhighlight lang="cpp" line start="1">
+
<syntaxhighlight2 lang="cpp" line start="1">
 
#include <tchar.h>
 
#include <tchar.h>
 
int main() {
 
int main() {
69行: 69行:
 
}
 
}
 
}
 
}
</syntaxhighlight>
+
</syntaxhighlight2>
 
出力結果
 
出力結果
<syntaxhighlight lang="cpp">
+
<syntaxhighlight2 lang="cpp">
 
  0/ 3:cStr0[ 0]=表示:よねウィキの機能<yonewiki>
 
  0/ 3:cStr0[ 0]=表示:よねウィキの機能<yonewiki>
 
StrCount=21
 
StrCount=21
80行: 80行:
 
  2/ 3:cStr0[ 2]=表示:よねウィキの機能2<yonewiki>
 
  2/ 3:cStr0[ 2]=表示:よねウィキの機能2<yonewiki>
 
StrCount=22
 
StrCount=22
</syntaxhighlight>
+
</syntaxhighlight2>
 
_mb系の関数を利用するには、<nowiki>#include <mbstring.h></nowiki>をインクルードする必要があります。<br />
 
_mb系の関数を利用するには、<nowiki>#include <mbstring.h></nowiki>をインクルードする必要があります。<br />
  
89行: 89行:
  
  
<syntaxhighlight lang="cpp" line start="1">
+
<syntaxhighlight2 lang="cpp" line start="1">
 
#include <tchar.h>
 
#include <tchar.h>
 
#include <mbstring.h>
 
#include <mbstring.h>
112行: 112行:
 
delete[] ppcStr1;
 
delete[] ppcStr1;
 
}
 
}
</syntaxhighlight>
+
</syntaxhighlight2>
 
という具合にして、const char→char→_mabslenで文字列長探索が出来ます。出力結果は以下のとおりです。<br />
 
という具合にして、const char→char→_mabslenで文字列長探索が出来ます。出力結果は以下のとおりです。<br />
<syntaxhighlight lang="cpp">
+
<syntaxhighlight2 lang="cpp">
 
const マルチバイト文字→マルチバイト文字コピー→_mbslen関数2バイト文字認識文字列長探索
 
const マルチバイト文字→マルチバイト文字コピー→_mbslen関数2バイト文字認識文字列長探索
 
  0/ 4:cStr1[ 0]=
 
  0/ 4:cStr1[ 0]=
128行: 128行:
 
StrCount=22
 
StrCount=22
  
</syntaxhighlight>
+
</syntaxhighlight2>
 
_mbstrlen関数を使う場合はコピー操作が必要にならず、const宣言している文字列変数を使っての文字列長探索ができます。<br />
 
_mbstrlen関数を使う場合はコピー操作が必要にならず、const宣言している文字列変数を使っての文字列長探索ができます。<br />
<syntaxhighlight lang="cpp" line start="1">
+
<syntaxhighlight2 lang="cpp" line start="1">
 
#include <tchar.h>
 
#include <tchar.h>
 
#include <mbstring.h>
 
#include <mbstring.h>
141行: 141行:
 
}
 
}
 
}
 
}
</syntaxhighlight>
+
</syntaxhighlight2>
 
出力結果は以下のとおりです。<br />
 
出力結果は以下のとおりです。<br />
<syntaxhighlight lang="cpp">
+
<syntaxhighlight2 lang="cpp">
 
const マルチバイト文字→_mbstrlen関数2バイト文字認識文字列長探索
 
const マルチバイト文字→_mbstrlen関数2バイト文字認識文字列長探索
 
  0/ 4:cStr1[ 0]=
 
  0/ 4:cStr1[ 0]=
157行: 157行:
 
StrCount=22
 
StrCount=22
  
</syntaxhighlight>
+
</syntaxhighlight2>
 
といった具合にいろいろな関数があるので、一つづつ掘り下げて理解しておくのも、必要です。こういう違いがあるということを把握していれば、臨機応変に対応しやすくなるかもです。自分は分かったつもりにならずに、常に謙虚に確かめてみる姿勢ってのは、必要なんじゃないかと思います。そして常に、自分が実施するであろうパターンを網羅して確かめる。だから、あえて文字列の配列の場合にどうやればいいのかを探ります。
 
といった具合にいろいろな関数があるので、一つづつ掘り下げて理解しておくのも、必要です。こういう違いがあるということを把握していれば、臨機応変に対応しやすくなるかもです。自分は分かったつもりにならずに、常に謙虚に確かめてみる姿勢ってのは、必要なんじゃないかと思います。そして常に、自分が実施するであろうパターンを網羅して確かめる。だから、あえて文字列の配列の場合にどうやればいいのかを探ります。
  
187行: 187行:
  
 
で、結局は_tcsncpy_sを使いなさいってことになります。Unicode設定ならワイド文字版で、文字列長に厳しい設定が必要なwcsncpy_sだね。第二引数は配列の大きさ+終端\0のための要素1つ分。バイト数ではないです。動的に生成した変数の場合は配列の大きさが取得できないので、wcslen(_tcslen)のような文字列長取得関数を使って、戻ってきた値に\0の要素のために1を加算した値が良いです。<br />
 
で、結局は_tcsncpy_sを使いなさいってことになります。Unicode設定ならワイド文字版で、文字列長に厳しい設定が必要なwcsncpy_sだね。第二引数は配列の大きさ+終端\0のための要素1つ分。バイト数ではないです。動的に生成した変数の場合は配列の大きさが取得できないので、wcslen(_tcslen)のような文字列長取得関数を使って、戻ってきた値に\0の要素のために1を加算した値が良いです。<br />
<syntaxhighlight lang="cpp" line start="1">
+
<syntaxhighlight2 lang="cpp" line start="1">
 
#include <iostream>
 
#include <iostream>
 
//#include<locale.h> tchar.hがインクルードされていれば、いらない。
 
//#include<locale.h> tchar.hがインクルードされていれば、いらない。
249行: 249行:
 
return 0;
 
return 0;
 
}
 
}
</syntaxhighlight>
+
</syntaxhighlight2>
 
という感じでしたね。無理やり_mbscpy関数を使ってみるとこんな感じですね。unsigned char型は宣言と同時にnew演算子の定義は出来ないようです。const型のcharからはキャストできないから、結局は一度、strcpy_sを使って、char型の文字列に置き換えないといけないです。マルチバイト型の2バイト文字認識操作関数って結局は、char型と同じなので、文字数を数えるときはstrlenで数えないといけない。char型と_mbsxxx関数を行ったり来たりするだけです。<br />
 
という感じでしたね。無理やり_mbscpy関数を使ってみるとこんな感じですね。unsigned char型は宣言と同時にnew演算子の定義は出来ないようです。const型のcharからはキャストできないから、結局は一度、strcpy_sを使って、char型の文字列に置き換えないといけないです。マルチバイト型の2バイト文字認識操作関数って結局は、char型と同じなので、文字数を数えるときはstrlenで数えないといけない。char型と_mbsxxx関数を行ったり来たりするだけです。<br />
 
出力結果は以下のとおり<br />
 
出力結果は以下のとおり<br />
<syntaxhighlight lang="cpp">
+
<syntaxhighlight2 lang="cpp">
 
_tcslen(cStr0[i])=21
 
_tcslen(cStr0[i])=21
 
ppcStr0=表示:よねウィキの機能<yonewiki>,
 
ppcStr0=表示:よねウィキの機能<yonewiki>,
296行: 296行:
 
ppucStr2=表示:よねウィキの機能2<yonewiki>,
 
ppucStr2=表示:よねウィキの機能2<yonewiki>,
 
  cStr1=表示:よねウィキの機能2<yonewiki>,
 
  cStr1=表示:よねウィキの機能2<yonewiki>,
</syntaxhighlight>
+
</syntaxhighlight2>
 
上記に加えて、コピーする文字数を引数とするcpyの前にnが付く関数_tcsncpy_s/wcsncpy_s/strncpy_s/_mbsncpy_sにする場合は<br />
 
上記に加えて、コピーする文字数を引数とするcpyの前にnが付く関数_tcsncpy_s/wcsncpy_s/strncpy_s/_mbsncpy_sにする場合は<br />
<syntaxhighlight lang="cpp">
+
<syntaxhighlight2 lang="cpp">
 
 
 
 
314行: 314行:
 
 
 
 
</syntaxhighlight>
+
</syntaxhighlight2>
 
と、4つの引数をとるように記述します。第4引数が出力する最大文字の配列数です。出力する文字数と考えることもできます。マルチバイト文字の場合には出力する文字数を指定できるのは効果的で、先頭から何バイト目で区切れば日本語文字が分断されないかの判断もしてくれながらの出力となります。この出力する文字数をあえてバイト単位で指定する_mbsnbcpy_sもあります。ただし、コピー先の文字列の配列はstrlenのようなバイト数分で準備する必要があることに注意が必要です。出力文字数を指定する場合は文字列全体の長さではなく、指定した文字数で必要な文字列バイト数を算出しておいて、メモリを確保するように処理を記述するのが良いかもしれません。ここでは強制キャストを使いましたが、もともとの文字列がunsigned charとして定義されているものをコピーするときに_mbs系の文字列コピーを利用するというのが自然な使い方になります。<br />
 
と、4つの引数をとるように記述します。第4引数が出力する最大文字の配列数です。出力する文字数と考えることもできます。マルチバイト文字の場合には出力する文字数を指定できるのは効果的で、先頭から何バイト目で区切れば日本語文字が分断されないかの判断もしてくれながらの出力となります。この出力する文字数をあえてバイト単位で指定する_mbsnbcpy_sもあります。ただし、コピー先の文字列の配列はstrlenのようなバイト数分で準備する必要があることに注意が必要です。出力文字数を指定する場合は文字列全体の長さではなく、指定した文字数で必要な文字列バイト数を算出しておいて、メモリを確保するように処理を記述するのが良いかもしれません。ここでは強制キャストを使いましたが、もともとの文字列がunsigned charとして定義されているものをコピーするときに_mbs系の文字列コピーを利用するというのが自然な使い方になります。<br />
  
336行: 336行:
 
例によって_sのついた連結先文字列の配列サイズを明記する関数に_lのついた個別ロケール設定関数。そして連結させたい文字列の文字数を記述するncatに文字数をバイト数で指定するnbcat。あとはワイド文字のwcsで始まる関数。マルチバイトのstrで始まる関数。マルチバイト2バイト文字対応の_mbsで始まる関数。全部で22種類。引数は文字列コピーと同じですが、コピー先の変数が既に文字列が格納されてる\0で終わる文字列になっていて、処理をした結果、第一引数の文字列先頭アドレスの中身が文字列連結した結果になるという点が異なると覚えれば、連結とコピーは似ていると覚えればよいかと思います。先の文字列コピーのプログラムのコピーcpy系関数の後ろに連結cat系関数を追加して、文字列を2回繰り返されるようにしたサンプルです。所謂(いわゆる)、手抜きです。ただし、連結関数では連結後の文字列の配列大きさを要求されるため、あらかじめ動的に確保する領域が2倍になっていることに注意して下さい。<br />
 
例によって_sのついた連結先文字列の配列サイズを明記する関数に_lのついた個別ロケール設定関数。そして連結させたい文字列の文字数を記述するncatに文字数をバイト数で指定するnbcat。あとはワイド文字のwcsで始まる関数。マルチバイトのstrで始まる関数。マルチバイト2バイト文字対応の_mbsで始まる関数。全部で22種類。引数は文字列コピーと同じですが、コピー先の変数が既に文字列が格納されてる\0で終わる文字列になっていて、処理をした結果、第一引数の文字列先頭アドレスの中身が文字列連結した結果になるという点が異なると覚えれば、連結とコピーは似ていると覚えればよいかと思います。先の文字列コピーのプログラムのコピーcpy系関数の後ろに連結cat系関数を追加して、文字列を2回繰り返されるようにしたサンプルです。所謂(いわゆる)、手抜きです。ただし、連結関数では連結後の文字列の配列大きさを要求されるため、あらかじめ動的に確保する領域が2倍になっていることに注意して下さい。<br />
  
<syntaxhighlight lang="cpp" line start="1">
+
<syntaxhighlight2 lang="cpp" line start="1">
 
#include <iostream>
 
#include <iostream>
 
//#include<locale.h> tchar.hがインクルードされていればいらない。
 
//#include<locale.h> tchar.hがインクルードされていればいらない。
401行: 401行:
 
return 0;
 
return 0;
 
}
 
}
</syntaxhighlight>
+
</syntaxhighlight2>
  
 
出力結果<br />
 
出力結果<br />
<syntaxhighlight lang="cpp">
+
<syntaxhighlight2 lang="cpp">
 
_tcslen(cStr0[i])=21
 
_tcslen(cStr0[i])=21
 
ppcStr0=表示:よねウィキの機能<yonewiki>表示:よねウィキの機能<yonewiki>,
 
ppcStr0=表示:よねウィキの機能<yonewiki>表示:よねウィキの機能<yonewiki>,
448行: 448行:
 
ppucStr2=表示:よねウィキの機能2<yonewiki>表示:よねウィキの機能2<yonewiki>表示:よねウィキの機能2<yonewiki>表示:よねウィキの機能2<yonewiki>,
 
ppucStr2=表示:よねウィキの機能2<yonewiki>表示:よねウィキの機能2<yonewiki>表示:よねウィキの機能2<yonewiki>表示:よねウィキの機能2<yonewiki>,
 
  cStr1=表示:よねウィキの機能2<yonewiki>,
 
  cStr1=表示:よねウィキの機能2<yonewiki>,
</syntaxhighlight>
+
</syntaxhighlight2>
  
 
=='''文字列比較'''==
 
=='''文字列比較'''==
481行: 481行:
  
  
<syntaxhighlight lang="cpp" line start="1">
+
<syntaxhighlight2 lang="cpp" line start="1">
 
#include <iostream>
 
#include <iostream>
 
//#include<locale.h> wchar.hがインクルードされていれば、いらない。
 
//#include<locale.h> wchar.hがインクルードされていれば、いらない。
569行: 569行:
 
return 0;
 
return 0;
 
}
 
}
</syntaxhighlight>
+
</syntaxhighlight2>
  
 
出力結果
 
出力結果
<syntaxhighlight lang="cpp">
+
<syntaxhighlight2 lang="cpp">
 
_tcslen(cStr0[i])=22
 
_tcslen(cStr0[i])=22
 
ppcStr0=表示:よねウィキの機能0<yonewiki>表示:よねウィキの機能0<yonewiki>,
 
ppcStr0=表示:よねウィキの機能0<yonewiki>表示:よねウィキの機能0<yonewiki>,
667行: 667行:
 
i=3, k=3, iCmpResult=0,
 
i=3, k=3, iCmpResult=0,
  
</syntaxhighlight>
+
</syntaxhighlight2>
 
と、こんな感じです。結果を見るとわかるのですが、1,-1,0で結果が表現され、先頭から比較して、一番最初に異なる文字同志を比較したときの結果、文字コードの値が大きかったか小さかったかで、1と-1とに結果が分かれます。これを使って昇順に並べたりすることも出来ます。もちろん0が返ってきたときは、完全一致です。等しかったということになります。<br />
 
と、こんな感じです。結果を見るとわかるのですが、1,-1,0で結果が表現され、先頭から比較して、一番最初に異なる文字同志を比較したときの結果、文字コードの値が大きかったか小さかったかで、1と-1とに結果が分かれます。これを使って昇順に並べたりすることも出来ます。もちろん0が返ってきたときは、完全一致です。等しかったということになります。<br />
  
740行: 740行:
 
比較関数よりは少ないけど、やっぱりマルチバイト版、マルチバイト2バイト文字対応版、ワイド文字版、それに_sをつけた文字列長を指定するセキュア版と個別ロケール指定をする_lのロケール版があります。_l版についてはココまで使い方を触れてこなかったのですが、
 
比較関数よりは少ないけど、やっぱりマルチバイト版、マルチバイト2バイト文字対応版、ワイド文字版、それに_sをつけた文字列長を指定するセキュア版と個別ロケール指定をする_lのロケール版があります。_l版についてはココまで使い方を触れてこなかったのですが、
  
<syntaxhighlight lang="cpp">
+
<syntaxhighlight2 lang="cpp">
 
_locale_t locale;
 
_locale_t locale;
 
locale = _tsetlocale(LC_ALL, _T("Japanese"));
 
locale = _tsetlocale(LC_ALL, _T("Japanese"));
</syntaxhighlight>
+
</syntaxhighlight2>
 
として、localeという変数に_locale_t型の値を_tsetlocaleの返り値として格納しておいたものを関数の最後の引数にします。<br />
 
として、localeという変数に_locale_t型の値を_tsetlocaleの返り値として格納しておいたものを関数の最後の引数にします。<br />
 
コマンドプロンプトで動作確認してるだけの段階でlocale変数を利用しても、文字化けしか起こせないと思うので、テキスト出力とかを覚えてから試してみるといいかもしれません。<br />
 
コマンドプロンプトで動作確認してるだけの段階でlocale変数を利用しても、文字化けしか起こせないと思うので、テキスト出力とかを覚えてから試してみるといいかもしれません。<br />
768行: 768行:
  
 
区切り文字として複数の文字を指定できますが、それぞれ1文字が独立した区切り文字ですので、// のような2文字以上で構成される区切り文字はこの関数だけでは対応できません。新しい手法が必要になります。
 
区切り文字として複数の文字を指定できますが、それぞれ1文字が独立した区切り文字ですので、// のような2文字以上で構成される区切り文字はこの関数だけでは対応できません。新しい手法が必要になります。
<syntaxhighlight lang="cpp" line start="1">
+
<syntaxhighlight2 lang="cpp" line start="1">
 
#include <iostream>
 
#include <iostream>
 
#include <tchar.h>
 
#include <tchar.h>
928行: 928行:
 
   return 0;
 
   return 0;
 
}
 
}
</syntaxhighlight>
+
</syntaxhighlight2>
 
という具合にtcstok_s関数を使えば、並列してトークン処理が進められるようです。第3引数の参照というC++独自の型を使って、44行目 78行目での最初の呼び出し(エスタブリッシュとも表現します。エスタブリッシュショットというと撮影なんかでワンシーンの手前に一枚絵の風景絵を置くことで、時間帯を表現したりする手法を指します。夜景がシーンの前に入れば室内に映像が切り替わっても夜の出来事であるように示唆するものです。)をして、111、114、131行目のように連続して現れるであろう区切り文字を検索します。111,114行目では、もう区切り文字が現れることがないことがわかっているのですが、2個目のトークンを取得するために実行したり、ループ処理を終わらせるために再度、実行したりという手法で使っています。アイデア次第でなんでもありです。最初にカンマ区切りでトークンを取得するのですが、その間で、さらにカンマ区切りトークンの中に必ず一度現れる、スラッシュによるトークン処理を入れこんでいます。区切り文字が違うだけで全く同じ処理です。こういうプログラム記法は普通はしません。通常は、関数のようなサブプログラムにして、関数を呼び出すことで同じ処理になるように記述します。C++の場合は関数でなくても、クラスのメンバ関数にしても良い訳です。結局同じことですが…。<br />
 
という具合にtcstok_s関数を使えば、並列してトークン処理が進められるようです。第3引数の参照というC++独自の型を使って、44行目 78行目での最初の呼び出し(エスタブリッシュとも表現します。エスタブリッシュショットというと撮影なんかでワンシーンの手前に一枚絵の風景絵を置くことで、時間帯を表現したりする手法を指します。夜景がシーンの前に入れば室内に映像が切り替わっても夜の出来事であるように示唆するものです。)をして、111、114、131行目のように連続して現れるであろう区切り文字を検索します。111,114行目では、もう区切り文字が現れることがないことがわかっているのですが、2個目のトークンを取得するために実行したり、ループ処理を終わらせるために再度、実行したりという手法で使っています。アイデア次第でなんでもありです。最初にカンマ区切りでトークンを取得するのですが、その間で、さらにカンマ区切りトークンの中に必ず一度現れる、スラッシュによるトークン処理を入れこんでいます。区切り文字が違うだけで全く同じ処理です。こういうプログラム記法は普通はしません。通常は、関数のようなサブプログラムにして、関数を呼び出すことで同じ処理になるように記述します。C++の場合は関数でなくても、クラスのメンバ関数にしても良い訳です。結局同じことですが…。<br />
  
1,130行: 1,130行:
  
 
というわけで、これくらいできて当然という変換をやってみます。
 
というわけで、これくらいできて当然という変換をやってみます。
<syntaxhighlight lang="cpp" line start="1">
+
<syntaxhighlight2 lang="cpp" line start="1">
 
#include <string>
 
#include <string>
 
#include <stdlib.h>
 
#include <stdlib.h>
1,291行: 1,291行:
 
   }
 
   }
 
}
 
}
</syntaxhighlight>
+
</syntaxhighlight2>
 
上から<br />
 
上から<br />
 
char(LPSTR)→TCHAR(LPTSTR)<br />
 
char(LPSTR)→TCHAR(LPTSTR)<br />
1,328行: 1,328行:
 
更に変換を続けたのものが以下になります。
 
更に変換を続けたのものが以下になります。
  
<syntaxhighlight lang="cpp" line start="1">
+
<syntaxhighlight2 lang="cpp" line start="1">
 
_tsetlocale(LC_ALL, _T("Japanese"));
 
_tsetlocale(LC_ALL, _T("Japanese"));
 
_locale_t locale;
 
_locale_t locale;
1,600行: 1,600行:
 
delete[] sizeReturnValue;
 
delete[] sizeReturnValue;
 
delete[] pnStrArrayElement;
 
delete[] pnStrArrayElement;
</syntaxhighlight>
+
</syntaxhighlight2>
  
 
_bstr_t型からの変換に関するサンプルを追加しました。
 
_bstr_t型からの変換に関するサンプルを追加しました。
1,621行: 1,621行:
 
では引き続き、変換のサンプルを…
 
では引き続き、変換のサンプルを…
  
<syntaxhighlight lang="cpp" line start="1">
+
<syntaxhighlight2 lang="cpp" line start="1">
 
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 
//・CComBSTR→char
 
//・CComBSTR→char
1,816行: 1,816行:
 
//動的確保変数の解放
 
//動的確保変数の解放
 
delete[] psysstring_StrCnv;
 
delete[] psysstring_StrCnv;
</syntaxhighlight>
+
</syntaxhighlight2>
  
 
引き続き、変換のサンプルを記述していきます。残るはCComBSTR、CStringA、CStringW、string、System::String基準の変換ですね。
 
引き続き、変換のサンプルを記述していきます。残るはCComBSTR、CStringA、CStringW、string、System::String基準の変換ですね。
  
<syntaxhighlight lang="cpp" line start="1">
+
<syntaxhighlight2 lang="cpp" line start="1">
 
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 
//・CStringA→char
 
//・CStringA→char
2,011行: 2,011行:
 
//動的確保変数の解放
 
//動的確保変数の解放
 
delete[] psysstring_StrCnv;
 
delete[] psysstring_StrCnv;
</syntaxhighlight>
+
</syntaxhighlight2>
  
<syntaxhighlight lang="cpp" line start="1">
+
<syntaxhighlight2 lang="cpp" line start="1">
 
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 
//・CStringW→char
 
//・CStringW→char
2,206行: 2,206行:
 
//動的確保変数の解放
 
//動的確保変数の解放
 
delete[] psysstring_StrCnv;
 
delete[] psysstring_StrCnv;
</syntaxhighlight>
+
</syntaxhighlight2>
<syntaxhighlight lang="cpp" line start="1">
+
<syntaxhighlight2 lang="cpp" line start="1">
 
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 
//・string→char
 
//・string→char
2,396行: 2,396行:
 
//動的確保変数の解放
 
//動的確保変数の解放
 
delete[] psysstring_StrCnv;
 
delete[] psysstring_StrCnv;
</syntaxhighlight>
+
</syntaxhighlight2>
<syntaxhighlight lang="cpp" line start="1">
+
<syntaxhighlight2 lang="cpp" line start="1">
 
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 
//・SystemString→char
 
//・SystemString→char
2,600行: 2,600行:
 
//動的確保変数の解放
 
//動的確保変数の解放
 
delete[] pstring_StrCnv;
 
delete[] pstring_StrCnv;
</syntaxhighlight>
+
</syntaxhighlight2>
  
 
と、こんな感じです。もっと効率の良い変換があったらごめんなさい。動的に必要最小限のメモリを確保させながらの処理だとこんな感じになるよっていう例になっていると思います。プログラムによっては、配列の大きさを固定したっていいわけです。その方がコーディングや変数管理が楽になる場合もあります。この章に関しては以上です。既に準備されている型の変換なんてのは、変換するための関数が準備されているので、比較的簡単な技術になります。全角半角変換や文字コード変換処理を実際に組む方が難しいかもしれません。それもおいおい記述したいと思います。
 
と、こんな感じです。もっと効率の良い変換があったらごめんなさい。動的に必要最小限のメモリを確保させながらの処理だとこんな感じになるよっていう例になっていると思います。プログラムによっては、配列の大きさを固定したっていいわけです。その方がコーディングや変数管理が楽になる場合もあります。この章に関しては以上です。既に準備されている型の変換なんてのは、変換するための関数が準備されているので、比較的簡単な技術になります。全角半角変換や文字コード変換処理を実際に組む方が難しいかもしれません。それもおいおい記述したいと思います。
2,648行: 2,648行:
  
 
以下、テスト時のエラーログです。ひょっとしたら自分だけなのかもしれませんが、既知のバグみたいな?いやテストだけで出るエラーみたいな感じなので気にしないことにします。え?ホントにそれでいいのか?調べるのも面倒だし、放置。
 
以下、テスト時のエラーログです。ひょっとしたら自分だけなのかもしれませんが、既知のバグみたいな?いやテストだけで出るエラーみたいな感じなので気にしないことにします。え?ホントにそれでいいのか?調べるのも面倒だし、放置。
<syntaxhighlight lang="text">
+
<syntaxhighlight2 lang="text">
 
KNOWN ISSUES
 
KNOWN ISSUES
 
#11217 <http://bugs.icu-project.org/trac/ticket/11217>
 
#11217 <http://bugs.icu-project.org/trac/ticket/11217>
2,670行: 2,670行:
 
[/tsconv/nccbtst/TestSubWithValueCallBack]
 
[/tsconv/nccbtst/TestSubWithValueCallBack]
 
[/tsconv/ncnvtst/TestResetBehaviour]
 
[/tsconv/ncnvtst/TestResetBehaviour]
</syntaxhighlight>
+
</syntaxhighlight2>
 
表:icucheck.bat Win32 Release のテスト結果でのエラー
 
表:icucheck.bat Win32 Release のテスト結果でのエラー
  
2,691行: 2,691行:
  
 
プロジェクトの設定は以上です。以下が実際の変換サンプルになります。これまでのサンプルもそうですが、実際にはサポートクラスを作って、毎回新しく変数定義しているものは、クラスを呼ぶたびにまとめて生成されるようなセットを作るべきです。変換サポートクラスの作り方については、クラスに関する記述を掘り下げるセクションで触れたいと思いますが、ここでは例のごとく直線的なプログラムになっています。
 
プロジェクトの設定は以上です。以下が実際の変換サンプルになります。これまでのサンプルもそうですが、実際にはサポートクラスを作って、毎回新しく変数定義しているものは、クラスを呼ぶたびにまとめて生成されるようなセットを作るべきです。変換サポートクラスの作り方については、クラスに関する記述を掘り下げるセクションで触れたいと思いますが、ここでは例のごとく直線的なプログラムになっています。
<syntaxhighlight lang="cpp" line start="1">
+
<syntaxhighlight2 lang="cpp" line start="1">
 
#include "stdafx.h"
 
#include "stdafx.h"
 
#include <unicode/ucnv.h>
 
#include <unicode/ucnv.h>
2,811行: 2,811行:
 
   return 0;
 
   return 0;
 
}
 
}
</syntaxhighlight>
+
</syntaxhighlight2>
 
という具合に変換すると結果として
 
という具合に変換すると結果として
<syntaxhighlight lang="text">
+
<syntaxhighlight2 lang="text">
 
JIS文字列
 
JIS文字列
 
004a:0049:0053:6587:5b57:5217:
 
004a:0049:0053:6587:5b57:5217:
2,821行: 2,821行:
 
4a:49:53:95:b6:8e:9a:97:f1:
 
4a:49:53:95:b6:8e:9a:97:f1:
  
</syntaxhighlight>
+
</syntaxhighlight2>
 
のようなものが得られます。
 
のようなものが得られます。
  
2,840行: 2,840行:
  
 
ibm-943_P130-1999 7 ★ibm-943_P130-1999 ibm-943 '''Shift_JIS''' cp943 943 ibm-943_VASCII_VSUB_VPUA x-IBM943
 
ibm-943_P130-1999 7 ★ibm-943_P130-1999 ibm-943 '''Shift_JIS''' cp943 943 ibm-943_VASCII_VSUB_VPUA x-IBM943
<syntaxhighlight lang="text" line start="1">
+
<syntaxhighlight2 lang="text" line start="1">
 
UTF-8 14 ★UTF-8 ibm-1208 ibm-1209 ibm-5304 ibm-5305 ibm-13496 ibm-13497 ibm-17592 ibm-17593 windows-65001 cp1208 x-UTF_8J unicode-1-1-utf unicode-2-0-utf-8
 
UTF-8 14 ★UTF-8 ibm-1208 ibm-1209 ibm-5304 ibm-5305 ibm-13496 ibm-13497 ibm-17592 ibm-17593 windows-65001 cp1208 x-UTF_8J unicode-1-1-utf unicode-2-0-utf-8
 
UTF-16 7 ★UTF-16 ISO-10646-UCS-2 ibm-1204 ibm-1205 unicode csUnicode ucs-2
 
UTF-16 7 ★UTF-16 ISO-10646-UCS-2 ibm-1204 ibm-1205 unicode csUnicode ucs-2
3,073行: 3,073行:
 
ibm-16804_X110-1999,swaplfnl 2 ★ibm-16804_X110-1999,swaplfnl ibm-16804-s390
 
ibm-16804_X110-1999,swaplfnl 2 ★ibm-16804_X110-1999,swaplfnl ibm-16804-s390
 
ebcdic-xml-us 1 ★ebcdic-xml-us
 
ebcdic-xml-us 1 ★ebcdic-xml-us
</syntaxhighlight>
+
</syntaxhighlight2>
  
  
3,084行: 3,084行:
  
 
とりあえずは、ICUの方の変換を記載しておきます。大文字、小文字変換の他に日本語ひらがなとカタカナとローマ字の相互変換についてもサンプルを示しました。ICUを使えば、簡単に変換してくれます。完璧ではなさそうなので、一括変換する場合は注意して使う必要はありそうです。
 
とりあえずは、ICUの方の変換を記載しておきます。大文字、小文字変換の他に日本語ひらがなとカタカナとローマ字の相互変換についてもサンプルを示しました。ICUを使えば、簡単に変換してくれます。完璧ではなさそうなので、一括変換する場合は注意して使う必要はありそうです。
<syntaxhighlight lang="cpp" line start="1">
+
<syntaxhighlight2 lang="cpp" line start="1">
 
#pragma once
 
#pragma once
  
3,275行: 3,275行:
 
}
 
}
  
</syntaxhighlight>
+
</syntaxhighlight2>
  
 
出力結果
 
出力結果
<syntaxhighlight lang="text">
+
<syntaxhighlight2 lang="text">
 
★小文字 → 大文字変換
 
★小文字 → 大文字変換
 
ABCDEFGHIJKLMLOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ:
 
ABCDEFGHIJKLMLOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ:
3,317行: 3,317行:
 
アイウエオギャギュギョチャチュチェピャピュピョヴザゼィシケメアイウエオギャギュギョアイウエオアブクデ@;:*+/:
 
アイウエオギャギュギョチャチュチェピャピュピョヴザゼィシケメアイウエオギャギュギョアイウエオアブクデ@;:*+/:
  
</syntaxhighlight>
+
</syntaxhighlight2>
 
ひらがな→ローマ字変換が残念な結果になっているようでして、ひらがなと一緒に記述していたカタカナのギャギュギョをg~ャg~ュg~ョと変換してしまったようです。こんな変換をプログラムで提供することは稀れだと思いますが、ICUのバグのようですので、注意して使いましょう。ひらがなローマ字変換とか変換遊びの範囲まで来てるような気がします。やってみようとするところは凄いと思います。ほかにもたくさんの変換マップがあるようです。テキストエディタで特殊な変換を提供してみるのもおもしろいのかもしれません。使いこなせるユーザの方が少なさそうです。半角全角変換も同じような要領で実施できます。これらの変換は基本的にはUnicodeの中で実施され、その後、Unicodeから違う文字コードへの変換をするといった作業にで文字コードへの対応を実現します。次の項目では、これらの変換と同時に文字コードの変換を行う手法についても触れています。
 
ひらがな→ローマ字変換が残念な結果になっているようでして、ひらがなと一緒に記述していたカタカナのギャギュギョをg~ャg~ュg~ョと変換してしまったようです。こんな変換をプログラムで提供することは稀れだと思いますが、ICUのバグのようですので、注意して使いましょう。ひらがなローマ字変換とか変換遊びの範囲まで来てるような気がします。やってみようとするところは凄いと思います。ほかにもたくさんの変換マップがあるようです。テキストエディタで特殊な変換を提供してみるのもおもしろいのかもしれません。使いこなせるユーザの方が少なさそうです。半角全角変換も同じような要領で実施できます。これらの変換は基本的にはUnicodeの中で実施され、その後、Unicodeから違う文字コードへの変換をするといった作業にで文字コードへの対応を実現します。次の項目では、これらの変換と同時に文字コードの変換を行う手法についても触れています。
  
3,348行: 3,348行:
  
 
<nowiki>***</nowiki>upr***系の関数になります。こちらも_str***に_wcs***、_mbs***と接尾句に****_sや****_lそして****_s_lがつくものの組み合わせが存在しています。
 
<nowiki>***</nowiki>upr***系の関数になります。こちらも_str***に_wcs***、_mbs***と接尾句に****_sや****_lそして****_s_lがつくものの組み合わせが存在しています。
<syntaxhighlight lang="cpp" line start="1">
+
<syntaxhighlight2 lang="cpp" line start="1">
 
#pragma once
 
#pragma once
 
#include "stdafx.h"
 
#include "stdafx.h"
3,436行: 3,436行:
 
   return 0;
 
   return 0;
 
}
 
}
</syntaxhighlight>
+
</syntaxhighlight2>
 
出力結果
 
出力結果
<syntaxhighlight lang="text">
+
<syntaxhighlight2 lang="text">
 
★大文字→小文字変換
 
★大文字→小文字変換
 
abcdefg
 
abcdefg
3,449行: 3,449行:
 
OPQRSTU
 
OPQRSTU
 
VWXYZ
 
VWXYZ
</syntaxhighlight>
+
</syntaxhighlight2>
 
上記のように変換できます。余談になりますが、配列はppcStr[i]のように記述できますが、結局のところ *(ppcStr + i)のように書き直すことができます。配列を宣言したときに、その変数は既にポインタ変数になっているので、宣言したときから、配列変数であることを示すプレフィックス(接頭句)としてpをつけておくのもよいですね。ポインタの配列はppと接頭句が付けられますし、char型ならppcという具合の接頭句の規則を自分は使っています。intはiじゃなくてnを接頭句に使うんですけど。面倒になって接頭句を付け忘れたりもします。そうするとしばらくして、これ何の変数だっけ?という具合になるおじいちゃんぶりを発揮します。たぶん、こうなってくると、「さっき食べたでしょ?おじいちゃん(^_^)。」って言われると、もう断食状態になります。やばいです。人が書いたプログラムと合わせると、また接頭句の規則が乱れて、自分自身では理解ができなくなってくるのです。たぶん自分は大きなプログラムを作るのには向いていませんね。せめて個人的に作っているプログラムの範囲では、規則どおりにやって間違いを減らしたいと思います。チームでやるときは、今までにつちかってきた規則と基盤を胸にきざみつつも応用力が試されます。int nSize[] = {10,20,30};みたいに宣言したときも実はnSizeってのは、この配列の先頭アドレスを保有する変数になってるわけだから、int pnSize[] = {10,20,30};として宣言して、*(pnSize + i) みたいにして、使うのもいいし、pnSize[i]として配列のように使うのもいい。ポインタ変数をあつかってるんだなぁって意識できてるだけマシ。プロになると、まぁそんな細かい事いわなくても自然と意識できるんでしょう。ただ、構造体やらクラスの配列だとpSize[i].mValueとかpSize[i].mFunc()みたいにできるものでも *(pSize + i).xxxとはできず、(*(pSize + i)).mValue のように全体をカッコでくくらないと駄目です。そして、アロー演算子は(*(ポインタ変数)).mValueのようなメンバ変数や関数の参照をおきかえるものでしたから、配列を[]を使わないで表現できることをしっていれば、(pSize + i)->mValueと記述を切り替えるのもたやすいですね。
 
上記のように変換できます。余談になりますが、配列はppcStr[i]のように記述できますが、結局のところ *(ppcStr + i)のように書き直すことができます。配列を宣言したときに、その変数は既にポインタ変数になっているので、宣言したときから、配列変数であることを示すプレフィックス(接頭句)としてpをつけておくのもよいですね。ポインタの配列はppと接頭句が付けられますし、char型ならppcという具合の接頭句の規則を自分は使っています。intはiじゃなくてnを接頭句に使うんですけど。面倒になって接頭句を付け忘れたりもします。そうするとしばらくして、これ何の変数だっけ?という具合になるおじいちゃんぶりを発揮します。たぶん、こうなってくると、「さっき食べたでしょ?おじいちゃん(^_^)。」って言われると、もう断食状態になります。やばいです。人が書いたプログラムと合わせると、また接頭句の規則が乱れて、自分自身では理解ができなくなってくるのです。たぶん自分は大きなプログラムを作るのには向いていませんね。せめて個人的に作っているプログラムの範囲では、規則どおりにやって間違いを減らしたいと思います。チームでやるときは、今までにつちかってきた規則と基盤を胸にきざみつつも応用力が試されます。int nSize[] = {10,20,30};みたいに宣言したときも実はnSizeってのは、この配列の先頭アドレスを保有する変数になってるわけだから、int pnSize[] = {10,20,30};として宣言して、*(pnSize + i) みたいにして、使うのもいいし、pnSize[i]として配列のように使うのもいい。ポインタ変数をあつかってるんだなぁって意識できてるだけマシ。プロになると、まぁそんな細かい事いわなくても自然と意識できるんでしょう。ただ、構造体やらクラスの配列だとpSize[i].mValueとかpSize[i].mFunc()みたいにできるものでも *(pSize + i).xxxとはできず、(*(pSize + i)).mValue のように全体をカッコでくくらないと駄目です。そして、アロー演算子は(*(ポインタ変数)).mValueのようなメンバ変数や関数の参照をおきかえるものでしたから、配列を[]を使わないで表現できることをしっていれば、(pSize + i)->mValueと記述を切り替えるのもたやすいですね。
  
3,460行: 3,460行:
 
以下はICUを利用した全角→半角変換です。
 
以下はICUを利用した全角→半角変換です。
  
<syntaxhighlight lang="cpp" line start="1">
+
<syntaxhighlight2 lang="cpp" line start="1">
 
#pragma once
 
#pragma once
  
3,588行: 3,588行:
 
   retuen 0;
 
   retuen 0;
 
}
 
}
</syntaxhighlight>
+
</syntaxhighlight2>
 
出力結果
 
出力結果
<syntaxhighlight lang="text">
+
<syntaxhighlight2 lang="text">
 
★UnicodeString変数の出力サンプル
 
★UnicodeString変数の出力サンプル
 
あいうえおアイウエオABCDE@;:*+/:
 
あいうえおアイウエオABCDE@;:*+/:
3,609行: 3,609行:
 
あいうえおアイウエオABCDE@;:*+/ 22:
 
あいうえおアイウエオABCDE@;:*+/ 22:
 
3042:3044:3046:3048:304a:ff71:ff72:ff73:ff74:ff75:0041:0042:0043:0044:0045:0040:003b:003a:002a:002b:002f:0000:
 
3042:3044:3046:3048:304a:ff71:ff72:ff73:ff74:ff75:0041:0042:0043:0044:0045:0040:003b:003a:002a:002b:002f:0000:
</syntaxhighlight>
+
</syntaxhighlight2>
 
という感じに変換ができます。ICUの使い方さえわかれば、いろいろできますね。記事を書きながら、自分もようやくわかってきた感じ。ぉぃ。
 
という感じに変換ができます。ICUの使い方さえわかれば、いろいろできますね。記事を書きながら、自分もようやくわかってきた感じ。ぉぃ。
  
3,617行: 3,617行:
  
 
createInstanceで指定できる変換タイプ名は以下のとおりです。
 
createInstanceで指定できる変換タイプ名は以下のとおりです。
<syntaxhighlight lang="text">
+
<syntaxhighlight2 lang="text">
 
Arabic-Latin
 
Arabic-Latin
 
Arabic-Latin/BGN
 
Arabic-Latin/BGN
3,898行: 3,898行:
 
Any-Hebrew
 
Any-Hebrew
 
Any-uz_Cyrl
 
Any-uz_Cyrl
</syntaxhighlight>
+
</syntaxhighlight2>
  
 
=='''文字列の検索と置換・正規表現'''==
 
=='''文字列の検索と置換・正規表現'''==
3,904行: 3,904行:
  
 
以下、ICUのRegexを使った検索と置換の正規表現による処理のサンプルです。
 
以下、ICUのRegexを使った検索と置換の正規表現による処理のサンプルです。
<syntaxhighlight lang="cpp" line start="1">
+
<syntaxhighlight2 lang="cpp" line start="1">
 
#pragma once
 
#pragma once
  
4,107行: 4,107行:
 
   return 0;
 
   return 0;
 
}
 
}
</syntaxhighlight>
+
</syntaxhighlight2>
 
出力結果
 
出力結果
<syntaxhighlight lang="text">
+
<syntaxhighlight2 lang="text">
 
★正規表現検索
 
★正規表現検索
 
★パターンマッチ結果出力
 
★パターンマッチ結果出力
4,204行: 4,204行:
 
★部分一致パターンの置換結果出力
 
★部分一致パターンの置換結果出力
 
リン★とミカ★/ナ★とモ★,ごは★やおか★/おさ★もつま★,progra★と技★
 
リン★とミカ★/ナ★とモ★,ごは★やおか★/おさ★もつま★,progra★と技★
</syntaxhighlight>
+
</syntaxhighlight2>
 
149行目以降に記述した部分一致からのプログラムはやや複雑な表記になっていますが、これはICUに準備された関数だけでは部分一致の処理ができないために自分で工夫をしなければならないことに起因しています。
 
149行目以降に記述した部分一致からのプログラムはやや複雑な表記になっていますが、これはICUに準備された関数だけでは部分一致の処理ができないために自分で工夫をしなければならないことに起因しています。
  
4,253行: 4,253行:
 
http://msdn.microsoft.com/ja-jp/library/vstudio/5zsfy4ab.aspx
 
http://msdn.microsoft.com/ja-jp/library/vstudio/5zsfy4ab.aspx
  
<syntaxhighlight lang="cpp" line start="1">
+
<syntaxhighlight2 lang="cpp" line start="1">
 
#pragma once
 
#pragma once
 
#include "stdafx.h"
 
#include "stdafx.h"
4,397行: 4,397行:
  
  
</syntaxhighlight>
+
</syntaxhighlight2>
 
出力結果 等幅フォントに設定したテキストエディタに張り付けると、もう少し見やすくなります。
 
出力結果 等幅フォントに設定したテキストエディタに張り付けると、もう少し見やすくなります。
  
4,438行: 4,438行:
 
JISやEUCといったサポートされていない文字コードのテキストファイルの場合はバイナリモードでファイルを読み込む必要があり、1バイトづつ処理をして、文字列として変換したりすることで、文字列操作を行います。変換そのものは先に紹介した文字コード変換で対応することが可能ですので、とりこんだバイナリコードをどうやって変換関数のなかに収めるかというのが課題になると思います。その例はのちほど考えるとして、まずはオーソドックスなファイルの読み込みからやってみます。
 
JISやEUCといったサポートされていない文字コードのテキストファイルの場合はバイナリモードでファイルを読み込む必要があり、1バイトづつ処理をして、文字列として変換したりすることで、文字列操作を行います。変換そのものは先に紹介した文字コード変換で対応することが可能ですので、とりこんだバイナリコードをどうやって変換関数のなかに収めるかというのが課題になると思います。その例はのちほど考えるとして、まずはオーソドックスなファイルの読み込みからやってみます。
  
<syntaxhighlight lang="cpp" line start="1">
+
<syntaxhighlight2 lang="cpp" line start="1">
 
#pragma once
 
#pragma once
 
#include "stdafx.h"
 
#include "stdafx.h"
4,726行: 4,726行:
 
   return 0;
 
   return 0;
 
}
 
}
</syntaxhighlight>
+
</syntaxhighlight2>
 
出力結果
 
出力結果
<syntaxhighlight lang="text">
+
<syntaxhighlight2 lang="text">
 
★UTF8のBOM無しテキストの読み込み
 
★UTF8のBOM無しテキストの読み込み
 
Error?->0
 
Error?->0
4,807行: 4,807行:
 
それだけだよ。
 
それだけだよ。
  
</syntaxhighlight>
+
</syntaxhighlight2>
 
という感じです。ごはんを食べたよ それだけだよ。というサンプルの文字列に特に深い意味はありませんが、Windowsは改行コードにCR LFを使うのが一般的です。しかしながら、ファイルから取り込んできた文字列にでは\r 0x0dは無くなって\nにあたる0x0aだけが残る仕様になっています。これらの改行復帰コードを厳密に扱う場合には書き込みするときや、文字列操作時に工夫が必要になります。文字コードがどんなふうに扱われているのか、厳密にどうなっているのか調べるためにも、時々は文字コードそのものを出力して確かめるのも大事なのではないかと思います。人間様にわかる文字だけを出力していたのでは、コンピュータを正確にあやつることは難しいです。JISの変換ではファイルオープン時にバイナリで開いています。これをchar型の変数に格納して、ICUのJIS→UNICODE変換を実施しています。
 
という感じです。ごはんを食べたよ それだけだよ。というサンプルの文字列に特に深い意味はありませんが、Windowsは改行コードにCR LFを使うのが一般的です。しかしながら、ファイルから取り込んできた文字列にでは\r 0x0dは無くなって\nにあたる0x0aだけが残る仕様になっています。これらの改行復帰コードを厳密に扱う場合には書き込みするときや、文字列操作時に工夫が必要になります。文字コードがどんなふうに扱われているのか、厳密にどうなっているのか調べるためにも、時々は文字コードそのものを出力して確かめるのも大事なのではないかと思います。人間様にわかる文字だけを出力していたのでは、コンピュータを正確にあやつることは難しいです。JISの変換ではファイルオープン時にバイナリで開いています。これをchar型の変数に格納して、ICUのJIS→UNICODE変換を実施しています。
  
4,822行: 4,822行:
  
 
次はファイル出力にあたる書き込みですね。
 
次はファイル出力にあたる書き込みですね。
<syntaxhighlight lang="cpp" line start="1">
+
<syntaxhighlight2 lang="cpp" line start="1">
 
   //JISからUTF-16LEへの変換処理
 
   //JISからUTF-16LEへの変換処理
  
4,902行: 4,902行:
 
   fputs(stringCnvResult3.c_str(), pfileText);
 
   fputs(stringCnvResult3.c_str(), pfileText);
 
   fclose(pfileText);
 
   fclose(pfileText);
</syntaxhighlight>
+
</syntaxhighlight2>
 
先述の読み込み処理に続けてのプログラムになります。ファイルオープンモードでwを指定して、fputs関数でchar型の書き込み、fputwsでwchar_t型の書き込みをするような形式です。モードaで追記なのでファイル末尾から追記されます。ファイルの先頭に追加するときはBOMコードの後の所にファイルポジションをfsetpos関数で移動してからfputws/fputsで書き込むと良いでしょう。新規のファイル作成となるモードwのバイナリモードwbでは、BOMコードを付与しなければならないケースも出てきます。fputsでBOMコードを保持した文字列を引数にすると良いです。bを付けないテキストモードでの書き込みでは、ccs=UTF-8やccs=UTF-16LEを指定すると自動でBOMコードを追記してくれますので、そのままUTF-16ならwchar_t型の文字列を書き出せばよいです。但し、バイナリモードで読み込んだ文字列は\r\nがそのまま文字列になっているので、書き出し時に後ろの\nが\r\nに変換され、\r\r\nになってしまうので、バイナリモードで読み込んだ文字をテキストモードで書き出すのはやめた方がいいです。どうしても相互乗り換えするのであれば、改行コードの置換処理が必要です。UTF-8のテキストモード書き込みでもユニコードのUTF-16LE形式で書き込むことでUTF-8に変換されますので、プログラム内部ではUnicodeで文字列を扱った方が効率が良いと思います。テキストモードでサポートしない文字コードのような特殊な形式に変換する場合はバイナリモードで文字列を読み込んで、変換処理を実施し、char型に格納した文字コードをバイナリモードで書き出すと良いでしょう。サンプルプログラムではテキストモードで読み込んだJIS文字をUnicodeに変換しUTF-16テキストモードで書き込んだ失敗例をプログラムにしてあります。ファイルオープンモードをうまく使いこなすことと、Unicode以外の文字列はchar型でバイナリとして扱うところがポイントです。変換処理はICUに任せればかなり柔軟な入出力処理が作れると思います。
 
先述の読み込み処理に続けてのプログラムになります。ファイルオープンモードでwを指定して、fputs関数でchar型の書き込み、fputwsでwchar_t型の書き込みをするような形式です。モードaで追記なのでファイル末尾から追記されます。ファイルの先頭に追加するときはBOMコードの後の所にファイルポジションをfsetpos関数で移動してからfputws/fputsで書き込むと良いでしょう。新規のファイル作成となるモードwのバイナリモードwbでは、BOMコードを付与しなければならないケースも出てきます。fputsでBOMコードを保持した文字列を引数にすると良いです。bを付けないテキストモードでの書き込みでは、ccs=UTF-8やccs=UTF-16LEを指定すると自動でBOMコードを追記してくれますので、そのままUTF-16ならwchar_t型の文字列を書き出せばよいです。但し、バイナリモードで読み込んだ文字列は\r\nがそのまま文字列になっているので、書き出し時に後ろの\nが\r\nに変換され、\r\r\nになってしまうので、バイナリモードで読み込んだ文字をテキストモードで書き出すのはやめた方がいいです。どうしても相互乗り換えするのであれば、改行コードの置換処理が必要です。UTF-8のテキストモード書き込みでもユニコードのUTF-16LE形式で書き込むことでUTF-8に変換されますので、プログラム内部ではUnicodeで文字列を扱った方が効率が良いと思います。テキストモードでサポートしない文字コードのような特殊な形式に変換する場合はバイナリモードで文字列を読み込んで、変換処理を実施し、char型に格納した文字コードをバイナリモードで書き出すと良いでしょう。サンプルプログラムではテキストモードで読み込んだJIS文字をUnicodeに変換しUTF-16テキストモードで書き込んだ失敗例をプログラムにしてあります。ファイルオープンモードをうまく使いこなすことと、Unicode以外の文字列はchar型でバイナリとして扱うところがポイントです。変換処理はICUに任せればかなり柔軟な入出力処理が作れると思います。
  
4,913行: 4,913行:
  
 
ICUによる文字コード自動判定のプログラムは以下のとおりです。
 
ICUによる文字コード自動判定のプログラムは以下のとおりです。
<syntaxhighlight lang="cpp" line start="1">
+
<syntaxhighlight2 lang="cpp" line start="1">
 
#pragma once
 
#pragma once
 
#include "stdafx.h"
 
#include "stdafx.h"
5,086行: 5,086行:
 
   return 0;
 
   return 0;
 
}
 
}
</syntaxhighlight>
+
</syntaxhighlight2>
 
出力結果 utf16LEのテキストを指定した場合。
 
出力結果 utf16LEのテキストを指定した場合。
<syntaxhighlight lang="text">
+
<syntaxhighlight2 lang="text">
 
★テキストの読み込み
 
★テキストの読み込み
 
Error?->0
 
Error?->0
5,107行: 5,107行:
 
それだけだよ。
 
それだけだよ。
 
[EOF]
 
[EOF]
</syntaxhighlight>
+
</syntaxhighlight2>
 
出力結果 utf8のテキストを指定した場合。
 
出力結果 utf8のテキストを指定した場合。
<syntaxhighlight lang="text">
+
<syntaxhighlight2 lang="text">
 
★テキストの読み込み
 
★テキストの読み込み
 
Error?->0
 
Error?->0
5,128行: 5,128行:
 
それだけだよ。
 
それだけだよ。
 
[EOF]
 
[EOF]
</syntaxhighlight>
+
</syntaxhighlight2>
 
出力結果 JISのテキストを指定した場合。
 
出力結果 JISのテキストを指定した場合。
<syntaxhighlight lang="text">
+
<syntaxhighlight2 lang="text">
 
★テキストの読み込み
 
★テキストの読み込み
 
Error?->0
 
Error?->0
5,149行: 5,149行:
 
それだけだよ。
 
それだけだよ。
 
[EOF]
 
[EOF]
</syntaxhighlight>
+
</syntaxhighlight2>
 
出力結果 ShiftJISのテキストを指定した場合。
 
出力結果 ShiftJISのテキストを指定した場合。
<syntaxhighlight lang="text">
+
<syntaxhighlight2 lang="text">
 
★テキストの読み込み
 
★テキストの読み込み
 
Error?->0
 
Error?->0
5,170行: 5,170行:
 
それだけだよ。
 
それだけだよ。
 
[EOF]
 
[EOF]
</syntaxhighlight>
+
</syntaxhighlight2>
 
とこのような感じになります。書き出すときには文字コード別にBOMを付与する処理が必要になりますが、自動判別によって、かなりたくさんの文字コードのテキストファイルを自動で読み込むことができるようになります。やや便利なコンソールアプリになったのかもしれません。そんな得体の知れないテキストファイルが転がっているかどうかは知りませんが…。BOMコードの種類にはUTF-16BEもあるので、このあたりにも対応したプログラムにするともっといいかもしれませんね。
 
とこのような感じになります。書き出すときには文字コード別にBOMを付与する処理が必要になりますが、自動判別によって、かなりたくさんの文字コードのテキストファイルを自動で読み込むことができるようになります。やや便利なコンソールアプリになったのかもしれません。そんな得体の知れないテキストファイルが転がっているかどうかは知りませんが…。BOMコードの種類にはUTF-16BEもあるので、このあたりにも対応したプログラムにするともっといいかもしれませんね。
 
今回のサンプルでは完璧な変換をしてくれましたが、ややこしい文字構成ばかりのテキストファイルになってくると間違えることもあります。そのためICUでは文字コード一致率みたいなランキングを作ってくれる関数もありまして、ucsdet_detect関数の代わりにucsdet_detectAllという関数で UCharsetMatch**型を戻り値にするものがあります。ポインタのポインタってことは、配列ってことになります。ucsdete_getName関数で、引数のその配列の要素を渡せば、それぞれの文字コード名が一覧されます。具体的には以下のような要領になります。
 
今回のサンプルでは完璧な変換をしてくれましたが、ややこしい文字構成ばかりのテキストファイルになってくると間違えることもあります。そのためICUでは文字コード一致率みたいなランキングを作ってくれる関数もありまして、ucsdet_detect関数の代わりにucsdet_detectAllという関数で UCharsetMatch**型を戻り値にするものがあります。ポインタのポインタってことは、配列ってことになります。ucsdete_getName関数で、引数のその配列の要素を渡せば、それぞれの文字コード名が一覧されます。具体的には以下のような要領になります。
<syntaxhighlight lang="cpp" line start="1">
+
<syntaxhighlight2 lang="cpp" line start="1">
 
   int32_t int32FindCharSetCnt = 0;
 
   int32_t int32FindCharSetCnt = 0;
 
   int32_t int32Confidence = 0;
 
   int32_t int32Confidence = 0;
5,190行: 5,190行:
 
     printf("CodeLang->%s\n",cpcDetectStrCodeLanguage);//RFC3066コードを取得できる。
 
     printf("CodeLang->%s\n",cpcDetectStrCodeLanguage);//RFC3066コードを取得できる。
 
   }
 
   }
</syntaxhighlight>
+
</syntaxhighlight2>
 
のようにするとConfidenceの値が大きいほど一致率が高いものとして確認ができます。全部を一覧するにはfor文で0~int32FindCharSetCnt -1までの要素を確認するとよいです。
 
のようにするとConfidenceの値が大きいほど一致率が高いものとして確認ができます。全部を一覧するにはfor文で0~int32FindCharSetCnt -1までの要素を確認するとよいです。
 
出力結果 UTF-16LEのファイル。
 
出力結果 UTF-16LEのファイル。
<syntaxhighlight lang="text">
+
<syntaxhighlight2 lang="text">
 
CodeConf->100
 
CodeConf->100
 
CodeName->UTF-16LE
 
CodeName->UTF-16LE
5,206行: 5,206行:
 
CodeName->UTF-16BE
 
CodeName->UTF-16BE
 
CodeLang->
 
CodeLang->
</syntaxhighlight>
+
</syntaxhighlight2>
 
となります。
 
となります。
  
5,215行: 5,215行:
  
 
では、以下がサンプルになります。
 
では、以下がサンプルになります。
<syntaxhighlight lang="cpp" line start="1">
+
<syntaxhighlight2 lang="cpp" line start="1">
 
#pragma once
 
#pragma once
 
#include "stdafx.h"
 
#include "stdafx.h"
5,325行: 5,325行:
 
   return 0;
 
   return 0;
 
}
 
}
</syntaxhighlight>
+
</syntaxhighlight2>
 
出力結果
 
出力結果
<syntaxhighlight lang="text">
+
<syntaxhighlight2 lang="text">
 
★文字列の数値化 型違いの場合
 
★文字列の数値化 型違いの場合
 
nInteger->-3
 
nInteger->-3
5,340行: 5,340行:
 
★数値を文字列 vsprintf関数を利用する場合
 
★数値を文字列 vsprintf関数を利用する場合
 
-3.14
 
-3.14
</syntaxhighlight>
+
</syntaxhighlight2>
  
 
=='''文字列と日付・日時・時間の変換'''==
 
=='''文字列と日付・日時・時間の変換'''==
5,354行: 5,354行:
 
これが時間処理の全般になると思います。この暦時間と非暦時間の特殊ケースとして1秒よりも小さい時間であるミリ秒の存在があるといったところでしょうか?そして、文字列として時間を表現する場合には国際社会を含めたルールに基づいて出力します。まずは標準時間からの差が最も重要な概念になります。日本なら+9時間です。あまり日本では関係の無い概念ですがサマータイムという表現もあります。グローバルな展開をするプログラムなら重要な概念かもしれません。相手の時間を思いやる必要のある双方向通信アプリとかなら、なおさら重要です。そして、曜日、午前、午後、24時間表現、表現習慣も国、地域、組織、個人によって異なります。ここでは、日付処理は別の場で考えるとして、システム時間から得られた時刻を文字列にする方法、網羅はできないですが、時刻文字列をシステム時間変数に設定し、歴時間変数として扱う方法について確認したいと思います。この日付の表現に関しても、文字コード変換でお世話になったICUはかなり手広くサポートしています。国際的な文字の変換処理に関する部分の処理系を強くしていっている印象です。たしかに個人では抱えきれないほど国際的な表現は複雑ですので、特化した組織があるというのは、ありがたいことです。
 
これが時間処理の全般になると思います。この暦時間と非暦時間の特殊ケースとして1秒よりも小さい時間であるミリ秒の存在があるといったところでしょうか?そして、文字列として時間を表現する場合には国際社会を含めたルールに基づいて出力します。まずは標準時間からの差が最も重要な概念になります。日本なら+9時間です。あまり日本では関係の無い概念ですがサマータイムという表現もあります。グローバルな展開をするプログラムなら重要な概念かもしれません。相手の時間を思いやる必要のある双方向通信アプリとかなら、なおさら重要です。そして、曜日、午前、午後、24時間表現、表現習慣も国、地域、組織、個人によって異なります。ここでは、日付処理は別の場で考えるとして、システム時間から得られた時刻を文字列にする方法、網羅はできないですが、時刻文字列をシステム時間変数に設定し、歴時間変数として扱う方法について確認したいと思います。この日付の表現に関しても、文字コード変換でお世話になったICUはかなり手広くサポートしています。国際的な文字の変換処理に関する部分の処理系を強くしていっている印象です。たしかに個人では抱えきれないほど国際的な表現は複雑ですので、特化した組織があるというのは、ありがたいことです。
  
<syntaxhighlight lang="cpp" line start="1">
+
<syntaxhighlight2 lang="cpp" line start="1">
 
#pragma once
 
#pragma once
 
#include "stdafx.h"
 
#include "stdafx.h"
5,546行: 5,546行:
 
   return 0;
 
   return 0;
 
}
 
}
</syntaxhighlight>
+
</syntaxhighlight2>
  
  
5,578行: 5,578行:
  
 
まずは、UCalendarを使ったサンプル。
 
まずは、UCalendarを使ったサンプル。
<syntaxhighlight lang="cpp" line start="1">
+
<syntaxhighlight2 lang="cpp" line start="1">
 
#pragma once
 
#pragma once
 
#include "stdafx.h"
 
#include "stdafx.h"
5,761行: 5,761行:
 
   return 0;
 
   return 0;
 
}
 
}
</syntaxhighlight>
+
</syntaxhighlight2>
 
出力 大体こんな感じ
 
出力 大体こんな感じ
<syntaxhighlight lang="text">
+
<syntaxhighlight2 lang="text">
 
★現在のオープンしているZoneIDの各種属性値を取得する関数。
 
★現在のオープンしているZoneIDの各種属性値を取得する関数。
 
Attrbute->1
 
Attrbute->1
5,785行: 5,785行:
 
Time->2:45:26:519
 
Time->2:45:26:519
 
Othr->1:0:32400000:0
 
Othr->1:0:32400000:0
</syntaxhighlight>
+
</syntaxhighlight2>
 
そして、Calendar+SimpleFormatクラスを使うサンプルは以下のような感じ。上記のプログラムの続きなので、インクルードとか飛ばします。
 
そして、Calendar+SimpleFormatクラスを使うサンプルは以下のような感じ。上記のプログラムの続きなので、インクルードとか飛ばします。
<syntaxhighlight lang="cpp" line start="1">
+
<syntaxhighlight2 lang="cpp" line start="1">
 
   UErrorCode status = U_ZERO_ERROR;
 
   UErrorCode status = U_ZERO_ERROR;
 
   //Calendar *cals = Calendar::createInstance(status);//日本語カレンダーロケールは ja_JP@calendar=japanese ja_JP_TRADITIONAL ja_JP ja japaneseが指定可能
 
   //Calendar *cals = Calendar::createInstance(status);//日本語カレンダーロケールは ja_JP@calendar=japanese ja_JP_TRADITIONAL ja_JP ja japaneseが指定可能
5,860行: 5,860行:
 
   }
 
   }
 
   delete fmt;
 
   delete fmt;
</syntaxhighlight>
+
</syntaxhighlight2>
 
出力 いろんな種類の出力をがっつり記述したので、わけわからないことになってますが
 
出力 いろんな種類の出力をがっつり記述したので、わけわからないことになってますが
<syntaxhighlight lang="text">
+
<syntaxhighlight2 lang="text">
 
2014-274 2 26 4 4 3 42 6 3 290 日本標準時 JST JST JST 金 金 金 2014 2014 14 2014 0026 026 26 JST 平成 平成 26.10.17  14:00:00 日本標準時 2:00 午後  02:00 2:0 02:00  14:0 午後 00026.10.17 平成
 
2014-274 2 26 4 4 3 42 6 3 290 日本標準時 JST JST JST 金 金 金 2014 2014 14 2014 0026 026 26 JST 平成 平成 26.10.17  14:00:00 日本標準時 2:00 午後  02:00 2:0 02:00  14:0 午後 00026.10.17 平成
</syntaxhighlight>
+
</syntaxhighlight2>
 
あとのほうのプログラムの方がタイムゾーン名を各国語で表示できる分、国際化には向いているかもしれませんが、そんなプログラム組む人いるのかなぁ。
 
あとのほうのプログラムの方がタイムゾーン名を各国語で表示できる分、国際化には向いているかもしれませんが、そんなプログラム組む人いるのかなぁ。
 
ロケール名一覧は後で示す日本語タイムゾーンの各ロケールごとの表示一覧に、タイムゾーン名一覧は各タイムゾーンの日本語表記一覧に記載しました。
 
ロケール名一覧は後で示す日本語タイムゾーンの各ロケールごとの表示一覧に、タイムゾーン名一覧は各タイムゾーンの日本語表記一覧に記載しました。
5,878行: 5,878行:
 
プログラムでUNICODE文字を出力してますが、コンソール表示のときにはSJISに変換されるため、SJISで表現できない文字は文字化け?というか変換先がないため正しく表示されません。正しく表示させたい場合は先の項目で説明したとおり、ファイル入出力をつかってUNICODE形式でテキストファイルに出力するといいです。Unicode対応のメモ帳で閲覧できます。Terapadは無理。自分は今回の機会にサクラエディタを導入しました。Unicodeも対応している優秀なエディタであることに気付かされました。UNICODEフォントですが、Windows標準のフォントファイルは実はUnicodeフォントになっています。すごいです。
 
プログラムでUNICODE文字を出力してますが、コンソール表示のときにはSJISに変換されるため、SJISで表現できない文字は文字化け?というか変換先がないため正しく表示されません。正しく表示させたい場合は先の項目で説明したとおり、ファイル入出力をつかってUNICODE形式でテキストファイルに出力するといいです。Unicode対応のメモ帳で閲覧できます。Terapadは無理。自分は今回の機会にサクラエディタを導入しました。Unicodeも対応している優秀なエディタであることに気付かされました。UNICODEフォントですが、Windows標準のフォントファイルは実はUnicodeフォントになっています。すごいです。
  
年号サンプル <syntaxhighlight lang="text">
+
年号サンプル <syntaxhighlight2 lang="text">
 
645-大化1:646-大化2:647-大化3:648-大化4:649-大化5:650-白雉1:651-白雉2:652-白雉3:653-白雉4:654-白雉5:655-白雉6:656-白雉7:657-白雉8:658-白雉9:659-白雉10:660-白雉11:661-白雉12:662-白雉13:663-白雉14:664-白雉15:665-白雉16:666-白雉17:667-白雉18:668-白雉19:669-白雉20:670-白雉21:671-白雉22:672-白鳳1:673-白鳳2:674-白鳳3:675-白鳳4:676-白鳳5:677-白鳳6:678-白鳳7:679-白鳳8:680-白鳳9:681-白鳳10:682-白鳳11:683-白鳳12:684-白鳳13:685-白鳳14:686-朱鳥1:687-朱鳥2:688-朱鳥3:689-朱鳥4:690-朱鳥5:691-朱鳥6:692-朱鳥7:693-朱鳥8:694-朱鳥9:695-朱鳥10:696-朱鳥11:697-朱鳥12:698-朱鳥13:699-朱鳥14:700-朱鳥15:701-大宝1:702-大宝2:703-大宝3:704-慶雲1:705-慶雲2:706-慶雲3:707-慶雲4:708-和銅1:709-和銅2:710-和銅3:711-和銅4:712-和銅5:713-和銅6:714-和銅7:715-霊亀1:716-霊亀2:717-霊亀3:718-養老2:719-養老3:720-養老4:721-養老5:722-養老6:723-養老7:724-神亀1:725-神亀2:726-神亀3:727-神亀4:728-神亀5:729-天平1:730-天平2:731-天平3:732-天平4:733-天平5:734-天平6:735-天平7:736-天平8:737-天平9:738-天平10:739-天平11:740-天平12:741-天平13:742-天平14:743-天平15:744-天平16:745-天平17:746-天平18:747-天平19:748-天平20:749-天平勝宝1:750-天平勝宝2:751-天平勝宝3:752-天平勝宝4:753-天平勝宝5:754-天平勝宝6:755-天平勝宝7:756-天平勝宝8:757-天平宝字1:758-天平宝字2:759-天平宝字3:760-天平宝字4:761-天平宝字5:762-天平宝字6:763-天平宝字7:764-天平宝字8:765-天平神護1:766-天平神護2:767-神護景雲1:768-神護景雲2:769-神護景雲3:770-宝亀1:771-宝亀2:772-宝亀3:773-宝亀4:774-宝亀5:775-宝亀6:776-宝亀7:777-宝亀8:778-宝亀9:779-宝亀10:780-宝亀11:781-天応1:782-延暦1:783-延暦2:784-延暦3:785-延暦4:786-延暦5:787-延暦6:788-延暦7:789-延暦8:790-延暦9:791-延暦10:792-延暦11:793-延暦12:794-延暦13:795-延暦14:796-延暦15:797-延暦16:798-延暦17:799-延暦18:800-延暦19:801-延暦20:802-延暦21:803-延暦22:804-延暦23:805-延暦24:806-大同1:807-大同2:808-大同3:809-大同4:810-弘仁1:811-弘仁2:812-弘仁3:813-弘仁4:814-弘仁5:815-弘仁6:816-弘仁7:817-弘仁8:818-弘仁9:819-弘仁10:820-弘仁11:821-弘仁12:822-弘仁13:823-弘仁14:824-天長1:825-天長2:826-天長3:827-天長4:828-天長5:829-天長6:830-天長7:831-天長8:832-天長9:833-天長10:834-承和1:835-承和2:836-承和3:837-承和4:838-承和5:839-承和6:840-承和7:841-承和8:842-承和9:843-承和10:844-承和11:845-承和12:846-承和13:847-承和14:848-嘉祥1:849-嘉祥2:850-嘉祥3:851-仁寿1:852-仁寿2:853-仁寿3:854-仁寿4:855-斉衡2:856-斉衡3:857-天安1:858-天安2:859-貞観1:860-貞観2:861-貞観3:862-貞観4:863-貞観5:864-貞観6:865-貞観7:866-貞観8:867-貞観9:868-貞観10:869-貞観11:870-貞観12:871-貞観13:872-貞観14:873-貞観15:874-貞観16:875-貞観17:876-貞観18:877-元慶1:878-元慶2:879-元慶3:880-元慶4:881-元慶5:882-元慶6:883-元慶7:884-元慶8:885-仁和1:886-仁和2:887-仁和3:888-仁和4:889-寛平1:890-寛平2:891-寛平3:892-寛平4:893-寛平5:894-寛平6:895-寛平7:896-寛平8:897-寛平9:898-昌泰1:899-昌泰2:900-昌泰3:901-延喜1:902-延喜2:903-延喜3:904-延喜4:905-延喜5:906-延喜6:907-延喜7:908-延喜8:909-延喜9:910-延喜10:911-延喜11:912-延喜12:913-延喜13:914-延喜14:915-延喜15:916-延喜16:917-延喜17:918-延喜18:919-延喜19:920-延喜20:921-延喜21:922-延喜22:923-延長1:924-延長2:925-延長3:926-延長4:927-延長5:928-延長6:929-延長7:930-延長8:931-承平1:932-承平2:933-承平3:934-承平4:935-承平5:936-承平6:937-承平7:938-天慶1:939-天慶2:940-天慶3:941-天慶4:942-天慶5:943-天慶6:944-天慶7:945-天慶8:946-天慶9:947-天暦1:948-天暦2:949-天暦3:950-天暦4:951-天暦5:952-天暦6:953-天暦7:954-天暦8:955-天暦9:956-天暦10:957-天暦11:958-天徳2:959-天徳3:960-天徳4:961-応和1:962-応和2:963-応和3:964-康保1:965-康保2:966-康保3:967-康保4:968-安和1:969-安和2:970-天禄1:971-天禄2:972-天禄3:973-天禄4:974-天延2:975-天延3:976-貞元1:977-貞元2:978-貞元3:979-天元2:980-天元3:981-天元4:982-天元5:983-永観1:984-永観2:985-寛和1:986-寛和2:987-永延1:988-永延2:989-永祚1:990-永祚2:991-正暦2:992-正暦3:993-正暦4:994-正暦5:995-長徳1:996-長徳2:997-長徳3:998-長徳4:999-長保1:1000-長保2:1001-長保3:1002-長保4:1003-長保5:1004-寛弘1:1005-寛弘2:1006-寛弘3:1007-寛弘4:1008-寛弘5:1009-寛弘6:1010-寛弘7:1011-寛弘8:1012-寛弘9:1013-長和2:1014-長和3:1015-長和4:1016-長和5:1017-寛仁1:1018-寛仁2:1019-寛仁3:1020-寛仁4:1021-治安1:1022-治安2:1023-治安3:1024-万寿1:1025-万寿2:1026-万寿3:1027-万寿4:1028-長元1:1029-長元2:1030-長元3:1031-長元4:1032-長元5:1033-長元6:1034-長元7:1035-長元8:1036-長元9:1037-長暦1:1038-長暦2:1039-長暦3:1040-長暦4:1041-長久2:1042-長久3:1043-長久4:1044-長久5:1045-寛徳2:1046-永承1:1047-永承2:1048-永承3:1049-永承4:1050-永承5:1051-永承6:1052-永承7:1053-天喜1:1054-天喜2:1055-天喜3:1056-天喜4:1057-天喜5:1058-康平1:1059-康平2:1060-康平3:1061-康平4:1062-康平5:1063-康平6:1064-康平7:1065-治暦1:1066-治暦2:1067-治暦3:1068-治暦4:1069-延久1:1070-延久2:1071-延久3:1072-延久4:1073-延久5:1074-承保1:1075-承保2:1076-承保3:1077-承保4:1078-承暦2:1079-承暦3:1080-承暦4:1081-永保1:1082-永保2:1083-永保3:1084-応徳1:1085-応徳2:1086-応徳3:1087-寛治1:1088-寛治2:1089-寛治3:1090-寛治4:1091-寛治5:1092-寛治6:1093-寛治7:1094-寛治8:1095-嘉保2:1096-嘉保3:1097-永長2:1098-承徳2:1099-康和1:1100-康和2:1101-康和3:1102-康和4:1103-康和5:1104-長治1:1105-長治2:1106-嘉承1:1107-嘉承2:1108-天仁1:1109-天仁2:1110-天永1:1111-天永2:1112-天永3:1113-永久1:1114-永久2:1115-永久3:1116-永久4:1117-永久5:1118-元永1:1119-元永2:1120-保安1:1121-保安2:1122-保安3:1123-保安4:1124-天治1:1125-天治2:1126-大治1:1127-大治2:1128-大治3:1129-大治4:1130-大治5:1131-天承1:1132-長承1:1133-長承2:1134-長承3:1135-保延1:1136-保延2:1137-保延3:1138-保延4:1139-保延5:1140-保延6:1141-永治1:1142-康治1:1143-康治2:1144-天養1:1145-久安1:1146-久安2:1147-久安3:1148-久安4:1149-久安5:1150-久安6:1151-仁平1:1152-仁平2:1153-仁平3:1154-仁平4:1155-久寿2:1156-保元1:1157-保元2:1158-保元3:1159-平治1:1160-永暦1:1161-応保1:1162-応保2:1163-長寛1:1164-長寛2:1165-永万1:1166-仁安1:1167-仁安2:1168-仁安3:1169-嘉応1:1170-嘉応2:1171-承安1:1172-承安2:1173-承安3:1174-承安4:1175-安元1:1176-安元2:1177-治承1:1178-治承2:1179-治承3:1180-治承4:1181-養和1:1182-寿永1:1183-寿永2:1184-元暦1:1185-文治1:1186-文治2:1187-文治3:1188-文治4:1189-文治5:1190-建久1:1191-建久2:1192-建久3:1193-建久4:1194-建久5:1195-建久6:1196-建久7:1197-建久8:1198-建久9:1199-正治1:1200-正治2:1201-建仁1:1202-建仁2:1203-建仁3:1204-元久1:1205-元久2:1206-建永1:1207-建永2:1208-承元2:1209-承元3:1210-承元4:1211-建暦1:1212-建暦2:1213-建暦3:1214-建保2:1215-建保3:1216-建保4:1217-建保5:1218-建保6:1219-承久1:1220-承久2:1221-承久3:1222-貞応1:1223-貞応2:1224-貞応3:1225-嘉禄1:1226-嘉禄2:1227-嘉禄3:1228-安貞2:1229-寛喜1:1230-寛喜2:1231-寛喜3:1232-貞永1:1233-天福1:1234-天福2:1235-嘉禎1:1236-嘉禎2:1237-嘉禎3:1238-嘉禎4:1239-延応1:1240-仁治1:1241-仁治2:1242-仁治3:1243-寛元1:1244-寛元2:1245-寛元3:1246-寛元4:1247-宝治1:1248-宝治2:1249-建長1:1250-建長2:1251-建長3:1252-建長4:1253-建長5:1254-建長6:1255-建長7:1256-康元1:1257-正嘉1:1258-正嘉2:1259-正元1:1260-文応1:1261-弘長1:1262-弘長2:1263-弘長3:1264-文永1:1265-文永2:1266-文永3:1267-文永4:1268-文永5:1269-文永6:1270-文永7:1271-文永8:1272-文永9:1273-文永10:1274-文永11:1275-建治1:1276-建治2:1277-建治3:1278-弘安1:1279-弘安2:1280-弘安3:1281-弘安4:1282-弘安5:1283-弘安6:1284-弘安7:1285-弘安8:1286-弘安9:1287-弘安10:1288-正応1:1289-正応2:1290-正応3:1291-正応4:1292-正応5:1293-永仁1:1294-永仁2:1295-永仁3:1296-永仁4:1297-永仁5:1298-永仁6:1299-正安1:1300-正安2:1301-正安3:1302-正安4:1303-嘉元1:1304-嘉元2:1305-嘉元3:1306-嘉元4:1307-徳治2:1308-延慶1:1309-延慶2:1310-延慶3:1311-応長1:1312-正和1:1313-正和2:1314-正和3:1315-正和4:1316-正和5:1317-文保1:1318-文保2:1319-元応1:1320-元応2:1321-元亨1:1322-元亨2:1323-元亨3:1324-元亨4:1325-正中2:1326-嘉暦1:1327-嘉暦2:1328-嘉暦3:1329-元徳1:1330-元徳2:1331-元弘1:1332-元弘2:1333-元弘3:1334-建武1:1335-建武2:1336-延元1:1337-延元2:1338-延元3:1339-延元4:1340-興国1:1341-興国2:1342-興国3:1343-興国4:1344-興国5:1345-興国6:1346-興国7:1347-正平2:1348-正平3:1349-正平4:1350-正平5:1351-正平6:1352-正平7:1353-正平8:1354-正平9:1355-正平10:1356-正平11:1357-正平12:1358-正平13:1359-正平14:1360-正平15:1361-正平16:1362-正平17:1363-正平18:1364-正平19:1365-正平20:1366-正平21:1367-正平22:1368-正平23:1369-正平24:1370-建徳1:1371-建徳2:1372-文中1:1373-文中2:1374-文中3:1375-天授1:1376-天授2:1377-天授3:1378-天授4:1379-康暦1:1380-康暦2:1381-弘和1:1382-弘和2:1383-弘和3:1384-至徳1:1385-至徳2:1386-至徳3:1387-嘉慶1:1388-嘉慶2:1389-康応1:1390-明徳1:1391-明徳2:1392-明徳3:1393-明徳4:1394-応永1:1395-応永2:1396-応永3:1397-応永4:1398-応永5:1399-応永6:1400-応永7:1401-応永8:1402-応永9:1403-応永10:1404-応永11:1405-応永12:1406-応永13:1407-応永14:1408-応永15:1409-応永16:1410-応永17:1411-応永18:1412-応永19:1413-応永20:1414-応永21:1415-応永22:1416-応永23:1417-応永24:1418-応永25:1419-応永26:1420-応永27:1421-応永28:1422-応永29:1423-応永30:1424-応永31:1425-応永32:1426-応永33:1427-応永34:1428-正長1:1429-永享1:1430-永享2:1431-永享3:1432-永享4:1433-永享5:1434-永享6:1435-永享7:1436-永享8:1437-永享9:1438-永享10:1439-永享11:1440-永享12:1441-嘉吉1:1442-嘉吉2:1443-嘉吉3:1444-文安1:1445-文安2:1446-文安3:1447-文安4:1448-文安5:1449-宝徳1:1450-宝徳2:1451-宝徳3:1452-享徳1:1453-享徳2:1454-享徳3:1455-康正1:1456-康正2:1457-長禄1:1458-長禄2:1459-長禄3:1460-長禄4:1461-寛正2:1462-寛正3:1463-寛正4:1464-寛正5:1465-寛正6:1466-文正1:1467-応仁1:1468-応仁2:1469-文明1:1470-文明2:1471-文明3:1472-文明4:1473-文明5:1474-文明6:1475-文明7:1476-文明8:1477-文明9:1478-文明10:1479-文明11:1480-文明12:1481-文明13:1482-文明14:1483-文明15:1484-文明16:1485-文明17:1486-文明18:1487-長享1:1488-長享2:1489-延徳1:1490-延徳2:1491-延徳3:1492-明応1:1493-明応2:1494-明応3:1495-明応4:1496-明応5:1497-明応6:1498-明応7:1499-明応8:1500-明応9:1501-文亀1:1502-文亀2:1503-文亀3:1504-永正1:1505-永正2:1506-永正3:1507-永正4:1508-永正5:1509-永正6:1510-永正7:1511-永正8:1512-永正9:1513-永正10:1514-永正11:1515-永正12:1516-永正13:1517-永正14:1518-永正15:1519-永正16:1520-永正17:1521-大永1:1522-大永2:1523-大永3:1524-大永4:1525-大永5:1526-大永6:1527-大永7:1528-享禄1:1529-享禄2:1530-享禄3:1531-享禄4:1532-天文1:1533-天文2:1534-天文3:1535-天文4:1536-天文5:1537-天文6:1538-天文7:1539-天文8:1540-天文9:1541-天文10:1542-天文11:1543-天文12:1544-天文13:1545-天文14:1546-天文15:1547-天文16:1548-天文17:1549-天文18:1550-天文19:1551-天文20:1552-天文21:1553-天文22:1554-天文23:1555-天文24:1556-弘治2:1557-弘治3:1558-永禄1:1559-永禄2:1560-永禄3:1561-永禄4:1562-永禄5:1563-永禄6:1564-永禄7:1565-永禄8:1566-永禄9:1567-永禄10:1568-永禄11:1569-永禄12:1570-元亀1:1571-元亀2:1572-元亀3:1573-天正1:1574-天正2:1575-天正3:1576-天正4:1577-天正5:1578-天正6:1579-天正7:1580-天正8:1581-天正9:1582-天正10:1583-天正11:1584-天正12:1585-天正13:1586-天正14:1587-天正15:1588-天正16:1589-天正17:1590-天正18:1591-天正19:1592-天正20:1593-文禄2:1594-文禄3:1595-文禄4:1596-文禄5:1597-慶長2:1598-慶長3:1599-慶長4:1600-慶長5:1601-慶長6:1602-慶長7:1603-慶長8:1604-慶長9:1605-慶長10:1606-慶長11:1607-慶長12:1608-慶長13:1609-慶長14:1610-慶長15:1611-慶長16:1612-慶長17:1613-慶長18:1614-慶長19:1615-元和1:1616-元和2:1617-元和3:1618-元和4:1619-元和5:1620-元和6:1621-元和7:1622-元和8:1623-元和9:1624-寛永1:1625-寛永2:1626-寛永3:1627-寛永4:1628-寛永5:1629-寛永6:1630-寛永7:1631-寛永8:1632-寛永9:1633-寛永10:1634-寛永11:1635-寛永12:1636-寛永13:1637-寛永14:1638-寛永15:1639-寛永16:1640-寛永17:1641-寛永18:1642-寛永19:1643-寛永20:1644-寛永21:1645-正保2:1646-正保3:1647-正保4:1648-慶安1:1649-慶安2:1650-慶安3:1651-慶安4:1652-承応1:1653-承応2:1654-承応3:1655-明暦1:1656-明暦2:1657-明暦3:1658-万治1:1659-万治2:1660-万治3:1661-寛文1:1662-寛文2:1663-寛文3:1664-寛文4:1665-寛文5:1666-寛文6:1667-寛文7:1668-寛文8:1669-寛文9:1670-寛文10:1671-寛文11:1672-寛文12:1673-延宝1:1674-延宝2:1675-延宝3:1676-延宝4:1677-延宝5:1678-延宝6:1679-延宝7:1680-延宝8:1681-天和1:1682-天和2:1683-天和3:1684-貞享1:1685-貞享2:1686-貞享3:1687-貞享4:1688-元禄1:1689-元禄2:1690-元禄3:1691-元禄4:1692-元禄5:1693-元禄6:1694-元禄7:1695-元禄8:1696-元禄9:1697-元禄10:1698-元禄11:1699-元禄12:1700-元禄13:1701-元禄14:1702-元禄15:1703-元禄16:1704-宝永1:1705-宝永2:1706-宝永3:1707-宝永4:1708-宝永5:1709-宝永6:1710-宝永7:1711-正徳1:1712-正徳2:1713-正徳3:1714-正徳4:1715-正徳5:1716-享保1:1717-享保2:1718-享保3:1719-享保4:1720-享保5:1721-享保6:1722-享保7:1723-享保8:1724-享保9:1725-享保10:1726-享保11:1727-享保12:1728-享保13:1729-享保14:1730-享保15:1731-享保16:1732-享保17:1733-享保18:1734-享保19:1735-享保20:1736-元文1:1737-元文2:1738-元文3:1739-元文4:1740-元文5:1741-寛保1:1742-寛保2:1743-寛保3:1744-延享1:1745-延享2:1746-延享3:1747-延享4:1748-寛延1:1749-寛延2:1750-寛延3:1751-寛延4:1752-宝暦2:1753-宝暦3:1754-宝暦4:1755-宝暦5:1756-宝暦6:1757-宝暦7:1758-宝暦8:1759-宝暦9:1760-宝暦10:1761-宝暦11:1762-宝暦12:1763-宝暦13:1764-明和1:1765-明和2:1766-明和3:1767-明和4:1768-明和5:1769-明和6:1770-明和7:1771-明和8:1772-明和9:1773-安永2:1774-安永3:1775-安永4:1776-安永5:1777-安永6:1778-安永7:1779-安永8:1780-安永9:1781-天明1:1782-天明2:1783-天明3:1784-天明4:1785-天明5:1786-天明6:1787-天明7:1788-天明8:1789-寛政1:1790-寛政2:1791-寛政3:1792-寛政4:1793-寛政5:1794-寛政6:1795-寛政7:1796-寛政8:1797-寛政9:1798-寛政10:1799-寛政11:1800-寛政12:1801-享和1:1802-享和2:1803-享和3:1804-文化1:1805-文化2:1806-文化3:1807-文化4:1808-文化5:1809-文化6:1810-文化7:1811-文化8:1812-文化9:1813-文化10:1814-文化11:1815-文化12:1816-文化13:1817-文化14:1818-文政1:1819-文政2:1820-文政3:1821-文政4:1822-文政5:1823-文政6:1824-文政7:1825-文政8:1826-文政9:1827-文政10:1828-文政11:1829-文政12:1830-文政13:1831-天保2:1832-天保3:1833-天保4:1834-天保5:1835-天保6:1836-天保7:1837-天保8:1838-天保9:1839-天保10:1840-天保11:1841-天保12:1842-天保13:1843-天保14:1844-天保15:1845-弘化2:1846-弘化3:1847-弘化4:1848-嘉永1:1849-嘉永2:1850-嘉永3:1851-嘉永4:1852-嘉永5:1853-嘉永6:1854-嘉永7:1855-安政2:1856-安政3:1857-安政4:1858-安政5:1859-安政6:1860-万延1:1861-文久1:1862-文久2:1863-文久3:1864-元治1:1865-慶応1:1866-慶応2:1867-慶応3:1868-明治1:1869-明治2:1870-明治3:1871-明治4:1872-明治5:1873-明治6:1874-明治7:1875-明治8:1876-明治9:1877-明治10:1878-明治11:1879-明治12:1880-明治13:1881-明治14:1882-明治15:1883-明治16:1884-明治17:1885-明治18:1886-明治19:1887-明治20:1888-明治21:1889-明治22:1890-明治23:1891-明治24:1892-明治25:1893-明治26:1894-明治27:1895-明治28:1896-明治29:1897-明治30:1898-明治31:1899-明治32:1900-明治33:1901-明治34:1902-明治35:1903-明治36:1904-明治37:1905-明治38:1906-明治39:1907-明治40:1908-明治41:1909-明治42:1910-明治43:1911-明治44:1912-大正1:1913-大正2:1914-大正3:1915-大正4:1916-大正5:1917-大正6:1918-大正7:1919-大正8:1920-大正9:1921-大正10:1922-大正11:1923-大正12:1924-大正13:1925-大正14:1926-大正15:1927-昭和2:1928-昭和3:1929-昭和4:1930-昭和5:1931-昭和6:1932-昭和7:1933-昭和8:1934-昭和9:1935-昭和10:1936-昭和11:1937-昭和12:1938-昭和13:1939-昭和14:1940-昭和15:1941-昭和16:1942-昭和17:1943-昭和18:1944-昭和19:1945-昭和20:1946-昭和21:1947-昭和22:1948-昭和23:1949-昭和24:1950-昭和25:1951-昭和26:1952-昭和27:1953-昭和28:1954-昭和29:1955-昭和30:1956-昭和31:1957-昭和32:1958-昭和33:1959-昭和34:1960-昭和35:1961-昭和36:1962-昭和37:1963-昭和38:1964-昭和39:1965-昭和40:1966-昭和41:1967-昭和42:1968-昭和43:1969-昭和44:1970-昭和45:1971-昭和46:1972-昭和47:1973-昭和48:1974-昭和49:1975-昭和50:1976-昭和51:1977-昭和52:1978-昭和53:1979-昭和54:1980-昭和55:1981-昭和56:1982-昭和57:1983-昭和58:1984-昭和59:1985-昭和60:1986-昭和61:1987-昭和62:1988-昭和63:1989-平成1:1990-平成2:1991-平成3:1992-平成4:1993-平成5:1994-平成6:1995-平成7:1996-平成8:1997-平成9:1998-平成10:1999-平成11:2000-平成12:2001-平成13:2002-平成14:2003-平成15:2004-平成16:2005-平成17:2006-平成18:2007-平成19:2008-平成20:2009-平成21:2010-平成22:2011-平成23:2012-平成24:2013-平成25:2014-平成26
 
645-大化1:646-大化2:647-大化3:648-大化4:649-大化5:650-白雉1:651-白雉2:652-白雉3:653-白雉4:654-白雉5:655-白雉6:656-白雉7:657-白雉8:658-白雉9:659-白雉10:660-白雉11:661-白雉12:662-白雉13:663-白雉14:664-白雉15:665-白雉16:666-白雉17:667-白雉18:668-白雉19:669-白雉20:670-白雉21:671-白雉22:672-白鳳1:673-白鳳2:674-白鳳3:675-白鳳4:676-白鳳5:677-白鳳6:678-白鳳7:679-白鳳8:680-白鳳9:681-白鳳10:682-白鳳11:683-白鳳12:684-白鳳13:685-白鳳14:686-朱鳥1:687-朱鳥2:688-朱鳥3:689-朱鳥4:690-朱鳥5:691-朱鳥6:692-朱鳥7:693-朱鳥8:694-朱鳥9:695-朱鳥10:696-朱鳥11:697-朱鳥12:698-朱鳥13:699-朱鳥14:700-朱鳥15:701-大宝1:702-大宝2:703-大宝3:704-慶雲1:705-慶雲2:706-慶雲3:707-慶雲4:708-和銅1:709-和銅2:710-和銅3:711-和銅4:712-和銅5:713-和銅6:714-和銅7:715-霊亀1:716-霊亀2:717-霊亀3:718-養老2:719-養老3:720-養老4:721-養老5:722-養老6:723-養老7:724-神亀1:725-神亀2:726-神亀3:727-神亀4:728-神亀5:729-天平1:730-天平2:731-天平3:732-天平4:733-天平5:734-天平6:735-天平7:736-天平8:737-天平9:738-天平10:739-天平11:740-天平12:741-天平13:742-天平14:743-天平15:744-天平16:745-天平17:746-天平18:747-天平19:748-天平20:749-天平勝宝1:750-天平勝宝2:751-天平勝宝3:752-天平勝宝4:753-天平勝宝5:754-天平勝宝6:755-天平勝宝7:756-天平勝宝8:757-天平宝字1:758-天平宝字2:759-天平宝字3:760-天平宝字4:761-天平宝字5:762-天平宝字6:763-天平宝字7:764-天平宝字8:765-天平神護1:766-天平神護2:767-神護景雲1:768-神護景雲2:769-神護景雲3:770-宝亀1:771-宝亀2:772-宝亀3:773-宝亀4:774-宝亀5:775-宝亀6:776-宝亀7:777-宝亀8:778-宝亀9:779-宝亀10:780-宝亀11:781-天応1:782-延暦1:783-延暦2:784-延暦3:785-延暦4:786-延暦5:787-延暦6:788-延暦7:789-延暦8:790-延暦9:791-延暦10:792-延暦11:793-延暦12:794-延暦13:795-延暦14:796-延暦15:797-延暦16:798-延暦17:799-延暦18:800-延暦19:801-延暦20:802-延暦21:803-延暦22:804-延暦23:805-延暦24:806-大同1:807-大同2:808-大同3:809-大同4:810-弘仁1:811-弘仁2:812-弘仁3:813-弘仁4:814-弘仁5:815-弘仁6:816-弘仁7:817-弘仁8:818-弘仁9:819-弘仁10:820-弘仁11:821-弘仁12:822-弘仁13:823-弘仁14:824-天長1:825-天長2:826-天長3:827-天長4:828-天長5:829-天長6:830-天長7:831-天長8:832-天長9:833-天長10:834-承和1:835-承和2:836-承和3:837-承和4:838-承和5:839-承和6:840-承和7:841-承和8:842-承和9:843-承和10:844-承和11:845-承和12:846-承和13:847-承和14:848-嘉祥1:849-嘉祥2:850-嘉祥3:851-仁寿1:852-仁寿2:853-仁寿3:854-仁寿4:855-斉衡2:856-斉衡3:857-天安1:858-天安2:859-貞観1:860-貞観2:861-貞観3:862-貞観4:863-貞観5:864-貞観6:865-貞観7:866-貞観8:867-貞観9:868-貞観10:869-貞観11:870-貞観12:871-貞観13:872-貞観14:873-貞観15:874-貞観16:875-貞観17:876-貞観18:877-元慶1:878-元慶2:879-元慶3:880-元慶4:881-元慶5:882-元慶6:883-元慶7:884-元慶8:885-仁和1:886-仁和2:887-仁和3:888-仁和4:889-寛平1:890-寛平2:891-寛平3:892-寛平4:893-寛平5:894-寛平6:895-寛平7:896-寛平8:897-寛平9:898-昌泰1:899-昌泰2:900-昌泰3:901-延喜1:902-延喜2:903-延喜3:904-延喜4:905-延喜5:906-延喜6:907-延喜7:908-延喜8:909-延喜9:910-延喜10:911-延喜11:912-延喜12:913-延喜13:914-延喜14:915-延喜15:916-延喜16:917-延喜17:918-延喜18:919-延喜19:920-延喜20:921-延喜21:922-延喜22:923-延長1:924-延長2:925-延長3:926-延長4:927-延長5:928-延長6:929-延長7:930-延長8:931-承平1:932-承平2:933-承平3:934-承平4:935-承平5:936-承平6:937-承平7:938-天慶1:939-天慶2:940-天慶3:941-天慶4:942-天慶5:943-天慶6:944-天慶7:945-天慶8:946-天慶9:947-天暦1:948-天暦2:949-天暦3:950-天暦4:951-天暦5:952-天暦6:953-天暦7:954-天暦8:955-天暦9:956-天暦10:957-天暦11:958-天徳2:959-天徳3:960-天徳4:961-応和1:962-応和2:963-応和3:964-康保1:965-康保2:966-康保3:967-康保4:968-安和1:969-安和2:970-天禄1:971-天禄2:972-天禄3:973-天禄4:974-天延2:975-天延3:976-貞元1:977-貞元2:978-貞元3:979-天元2:980-天元3:981-天元4:982-天元5:983-永観1:984-永観2:985-寛和1:986-寛和2:987-永延1:988-永延2:989-永祚1:990-永祚2:991-正暦2:992-正暦3:993-正暦4:994-正暦5:995-長徳1:996-長徳2:997-長徳3:998-長徳4:999-長保1:1000-長保2:1001-長保3:1002-長保4:1003-長保5:1004-寛弘1:1005-寛弘2:1006-寛弘3:1007-寛弘4:1008-寛弘5:1009-寛弘6:1010-寛弘7:1011-寛弘8:1012-寛弘9:1013-長和2:1014-長和3:1015-長和4:1016-長和5:1017-寛仁1:1018-寛仁2:1019-寛仁3:1020-寛仁4:1021-治安1:1022-治安2:1023-治安3:1024-万寿1:1025-万寿2:1026-万寿3:1027-万寿4:1028-長元1:1029-長元2:1030-長元3:1031-長元4:1032-長元5:1033-長元6:1034-長元7:1035-長元8:1036-長元9:1037-長暦1:1038-長暦2:1039-長暦3:1040-長暦4:1041-長久2:1042-長久3:1043-長久4:1044-長久5:1045-寛徳2:1046-永承1:1047-永承2:1048-永承3:1049-永承4:1050-永承5:1051-永承6:1052-永承7:1053-天喜1:1054-天喜2:1055-天喜3:1056-天喜4:1057-天喜5:1058-康平1:1059-康平2:1060-康平3:1061-康平4:1062-康平5:1063-康平6:1064-康平7:1065-治暦1:1066-治暦2:1067-治暦3:1068-治暦4:1069-延久1:1070-延久2:1071-延久3:1072-延久4:1073-延久5:1074-承保1:1075-承保2:1076-承保3:1077-承保4:1078-承暦2:1079-承暦3:1080-承暦4:1081-永保1:1082-永保2:1083-永保3:1084-応徳1:1085-応徳2:1086-応徳3:1087-寛治1:1088-寛治2:1089-寛治3:1090-寛治4:1091-寛治5:1092-寛治6:1093-寛治7:1094-寛治8:1095-嘉保2:1096-嘉保3:1097-永長2:1098-承徳2:1099-康和1:1100-康和2:1101-康和3:1102-康和4:1103-康和5:1104-長治1:1105-長治2:1106-嘉承1:1107-嘉承2:1108-天仁1:1109-天仁2:1110-天永1:1111-天永2:1112-天永3:1113-永久1:1114-永久2:1115-永久3:1116-永久4:1117-永久5:1118-元永1:1119-元永2:1120-保安1:1121-保安2:1122-保安3:1123-保安4:1124-天治1:1125-天治2:1126-大治1:1127-大治2:1128-大治3:1129-大治4:1130-大治5:1131-天承1:1132-長承1:1133-長承2:1134-長承3:1135-保延1:1136-保延2:1137-保延3:1138-保延4:1139-保延5:1140-保延6:1141-永治1:1142-康治1:1143-康治2:1144-天養1:1145-久安1:1146-久安2:1147-久安3:1148-久安4:1149-久安5:1150-久安6:1151-仁平1:1152-仁平2:1153-仁平3:1154-仁平4:1155-久寿2:1156-保元1:1157-保元2:1158-保元3:1159-平治1:1160-永暦1:1161-応保1:1162-応保2:1163-長寛1:1164-長寛2:1165-永万1:1166-仁安1:1167-仁安2:1168-仁安3:1169-嘉応1:1170-嘉応2:1171-承安1:1172-承安2:1173-承安3:1174-承安4:1175-安元1:1176-安元2:1177-治承1:1178-治承2:1179-治承3:1180-治承4:1181-養和1:1182-寿永1:1183-寿永2:1184-元暦1:1185-文治1:1186-文治2:1187-文治3:1188-文治4:1189-文治5:1190-建久1:1191-建久2:1192-建久3:1193-建久4:1194-建久5:1195-建久6:1196-建久7:1197-建久8:1198-建久9:1199-正治1:1200-正治2:1201-建仁1:1202-建仁2:1203-建仁3:1204-元久1:1205-元久2:1206-建永1:1207-建永2:1208-承元2:1209-承元3:1210-承元4:1211-建暦1:1212-建暦2:1213-建暦3:1214-建保2:1215-建保3:1216-建保4:1217-建保5:1218-建保6:1219-承久1:1220-承久2:1221-承久3:1222-貞応1:1223-貞応2:1224-貞応3:1225-嘉禄1:1226-嘉禄2:1227-嘉禄3:1228-安貞2:1229-寛喜1:1230-寛喜2:1231-寛喜3:1232-貞永1:1233-天福1:1234-天福2:1235-嘉禎1:1236-嘉禎2:1237-嘉禎3:1238-嘉禎4:1239-延応1:1240-仁治1:1241-仁治2:1242-仁治3:1243-寛元1:1244-寛元2:1245-寛元3:1246-寛元4:1247-宝治1:1248-宝治2:1249-建長1:1250-建長2:1251-建長3:1252-建長4:1253-建長5:1254-建長6:1255-建長7:1256-康元1:1257-正嘉1:1258-正嘉2:1259-正元1:1260-文応1:1261-弘長1:1262-弘長2:1263-弘長3:1264-文永1:1265-文永2:1266-文永3:1267-文永4:1268-文永5:1269-文永6:1270-文永7:1271-文永8:1272-文永9:1273-文永10:1274-文永11:1275-建治1:1276-建治2:1277-建治3:1278-弘安1:1279-弘安2:1280-弘安3:1281-弘安4:1282-弘安5:1283-弘安6:1284-弘安7:1285-弘安8:1286-弘安9:1287-弘安10:1288-正応1:1289-正応2:1290-正応3:1291-正応4:1292-正応5:1293-永仁1:1294-永仁2:1295-永仁3:1296-永仁4:1297-永仁5:1298-永仁6:1299-正安1:1300-正安2:1301-正安3:1302-正安4:1303-嘉元1:1304-嘉元2:1305-嘉元3:1306-嘉元4:1307-徳治2:1308-延慶1:1309-延慶2:1310-延慶3:1311-応長1:1312-正和1:1313-正和2:1314-正和3:1315-正和4:1316-正和5:1317-文保1:1318-文保2:1319-元応1:1320-元応2:1321-元亨1:1322-元亨2:1323-元亨3:1324-元亨4:1325-正中2:1326-嘉暦1:1327-嘉暦2:1328-嘉暦3:1329-元徳1:1330-元徳2:1331-元弘1:1332-元弘2:1333-元弘3:1334-建武1:1335-建武2:1336-延元1:1337-延元2:1338-延元3:1339-延元4:1340-興国1:1341-興国2:1342-興国3:1343-興国4:1344-興国5:1345-興国6:1346-興国7:1347-正平2:1348-正平3:1349-正平4:1350-正平5:1351-正平6:1352-正平7:1353-正平8:1354-正平9:1355-正平10:1356-正平11:1357-正平12:1358-正平13:1359-正平14:1360-正平15:1361-正平16:1362-正平17:1363-正平18:1364-正平19:1365-正平20:1366-正平21:1367-正平22:1368-正平23:1369-正平24:1370-建徳1:1371-建徳2:1372-文中1:1373-文中2:1374-文中3:1375-天授1:1376-天授2:1377-天授3:1378-天授4:1379-康暦1:1380-康暦2:1381-弘和1:1382-弘和2:1383-弘和3:1384-至徳1:1385-至徳2:1386-至徳3:1387-嘉慶1:1388-嘉慶2:1389-康応1:1390-明徳1:1391-明徳2:1392-明徳3:1393-明徳4:1394-応永1:1395-応永2:1396-応永3:1397-応永4:1398-応永5:1399-応永6:1400-応永7:1401-応永8:1402-応永9:1403-応永10:1404-応永11:1405-応永12:1406-応永13:1407-応永14:1408-応永15:1409-応永16:1410-応永17:1411-応永18:1412-応永19:1413-応永20:1414-応永21:1415-応永22:1416-応永23:1417-応永24:1418-応永25:1419-応永26:1420-応永27:1421-応永28:1422-応永29:1423-応永30:1424-応永31:1425-応永32:1426-応永33:1427-応永34:1428-正長1:1429-永享1:1430-永享2:1431-永享3:1432-永享4:1433-永享5:1434-永享6:1435-永享7:1436-永享8:1437-永享9:1438-永享10:1439-永享11:1440-永享12:1441-嘉吉1:1442-嘉吉2:1443-嘉吉3:1444-文安1:1445-文安2:1446-文安3:1447-文安4:1448-文安5:1449-宝徳1:1450-宝徳2:1451-宝徳3:1452-享徳1:1453-享徳2:1454-享徳3:1455-康正1:1456-康正2:1457-長禄1:1458-長禄2:1459-長禄3:1460-長禄4:1461-寛正2:1462-寛正3:1463-寛正4:1464-寛正5:1465-寛正6:1466-文正1:1467-応仁1:1468-応仁2:1469-文明1:1470-文明2:1471-文明3:1472-文明4:1473-文明5:1474-文明6:1475-文明7:1476-文明8:1477-文明9:1478-文明10:1479-文明11:1480-文明12:1481-文明13:1482-文明14:1483-文明15:1484-文明16:1485-文明17:1486-文明18:1487-長享1:1488-長享2:1489-延徳1:1490-延徳2:1491-延徳3:1492-明応1:1493-明応2:1494-明応3:1495-明応4:1496-明応5:1497-明応6:1498-明応7:1499-明応8:1500-明応9:1501-文亀1:1502-文亀2:1503-文亀3:1504-永正1:1505-永正2:1506-永正3:1507-永正4:1508-永正5:1509-永正6:1510-永正7:1511-永正8:1512-永正9:1513-永正10:1514-永正11:1515-永正12:1516-永正13:1517-永正14:1518-永正15:1519-永正16:1520-永正17:1521-大永1:1522-大永2:1523-大永3:1524-大永4:1525-大永5:1526-大永6:1527-大永7:1528-享禄1:1529-享禄2:1530-享禄3:1531-享禄4:1532-天文1:1533-天文2:1534-天文3:1535-天文4:1536-天文5:1537-天文6:1538-天文7:1539-天文8:1540-天文9:1541-天文10:1542-天文11:1543-天文12:1544-天文13:1545-天文14:1546-天文15:1547-天文16:1548-天文17:1549-天文18:1550-天文19:1551-天文20:1552-天文21:1553-天文22:1554-天文23:1555-天文24:1556-弘治2:1557-弘治3:1558-永禄1:1559-永禄2:1560-永禄3:1561-永禄4:1562-永禄5:1563-永禄6:1564-永禄7:1565-永禄8:1566-永禄9:1567-永禄10:1568-永禄11:1569-永禄12:1570-元亀1:1571-元亀2:1572-元亀3:1573-天正1:1574-天正2:1575-天正3:1576-天正4:1577-天正5:1578-天正6:1579-天正7:1580-天正8:1581-天正9:1582-天正10:1583-天正11:1584-天正12:1585-天正13:1586-天正14:1587-天正15:1588-天正16:1589-天正17:1590-天正18:1591-天正19:1592-天正20:1593-文禄2:1594-文禄3:1595-文禄4:1596-文禄5:1597-慶長2:1598-慶長3:1599-慶長4:1600-慶長5:1601-慶長6:1602-慶長7:1603-慶長8:1604-慶長9:1605-慶長10:1606-慶長11:1607-慶長12:1608-慶長13:1609-慶長14:1610-慶長15:1611-慶長16:1612-慶長17:1613-慶長18:1614-慶長19:1615-元和1:1616-元和2:1617-元和3:1618-元和4:1619-元和5:1620-元和6:1621-元和7:1622-元和8:1623-元和9:1624-寛永1:1625-寛永2:1626-寛永3:1627-寛永4:1628-寛永5:1629-寛永6:1630-寛永7:1631-寛永8:1632-寛永9:1633-寛永10:1634-寛永11:1635-寛永12:1636-寛永13:1637-寛永14:1638-寛永15:1639-寛永16:1640-寛永17:1641-寛永18:1642-寛永19:1643-寛永20:1644-寛永21:1645-正保2:1646-正保3:1647-正保4:1648-慶安1:1649-慶安2:1650-慶安3:1651-慶安4:1652-承応1:1653-承応2:1654-承応3:1655-明暦1:1656-明暦2:1657-明暦3:1658-万治1:1659-万治2:1660-万治3:1661-寛文1:1662-寛文2:1663-寛文3:1664-寛文4:1665-寛文5:1666-寛文6:1667-寛文7:1668-寛文8:1669-寛文9:1670-寛文10:1671-寛文11:1672-寛文12:1673-延宝1:1674-延宝2:1675-延宝3:1676-延宝4:1677-延宝5:1678-延宝6:1679-延宝7:1680-延宝8:1681-天和1:1682-天和2:1683-天和3:1684-貞享1:1685-貞享2:1686-貞享3:1687-貞享4:1688-元禄1:1689-元禄2:1690-元禄3:1691-元禄4:1692-元禄5:1693-元禄6:1694-元禄7:1695-元禄8:1696-元禄9:1697-元禄10:1698-元禄11:1699-元禄12:1700-元禄13:1701-元禄14:1702-元禄15:1703-元禄16:1704-宝永1:1705-宝永2:1706-宝永3:1707-宝永4:1708-宝永5:1709-宝永6:1710-宝永7:1711-正徳1:1712-正徳2:1713-正徳3:1714-正徳4:1715-正徳5:1716-享保1:1717-享保2:1718-享保3:1719-享保4:1720-享保5:1721-享保6:1722-享保7:1723-享保8:1724-享保9:1725-享保10:1726-享保11:1727-享保12:1728-享保13:1729-享保14:1730-享保15:1731-享保16:1732-享保17:1733-享保18:1734-享保19:1735-享保20:1736-元文1:1737-元文2:1738-元文3:1739-元文4:1740-元文5:1741-寛保1:1742-寛保2:1743-寛保3:1744-延享1:1745-延享2:1746-延享3:1747-延享4:1748-寛延1:1749-寛延2:1750-寛延3:1751-寛延4:1752-宝暦2:1753-宝暦3:1754-宝暦4:1755-宝暦5:1756-宝暦6:1757-宝暦7:1758-宝暦8:1759-宝暦9:1760-宝暦10:1761-宝暦11:1762-宝暦12:1763-宝暦13:1764-明和1:1765-明和2:1766-明和3:1767-明和4:1768-明和5:1769-明和6:1770-明和7:1771-明和8:1772-明和9:1773-安永2:1774-安永3:1775-安永4:1776-安永5:1777-安永6:1778-安永7:1779-安永8:1780-安永9:1781-天明1:1782-天明2:1783-天明3:1784-天明4:1785-天明5:1786-天明6:1787-天明7:1788-天明8:1789-寛政1:1790-寛政2:1791-寛政3:1792-寛政4:1793-寛政5:1794-寛政6:1795-寛政7:1796-寛政8:1797-寛政9:1798-寛政10:1799-寛政11:1800-寛政12:1801-享和1:1802-享和2:1803-享和3:1804-文化1:1805-文化2:1806-文化3:1807-文化4:1808-文化5:1809-文化6:1810-文化7:1811-文化8:1812-文化9:1813-文化10:1814-文化11:1815-文化12:1816-文化13:1817-文化14:1818-文政1:1819-文政2:1820-文政3:1821-文政4:1822-文政5:1823-文政6:1824-文政7:1825-文政8:1826-文政9:1827-文政10:1828-文政11:1829-文政12:1830-文政13:1831-天保2:1832-天保3:1833-天保4:1834-天保5:1835-天保6:1836-天保7:1837-天保8:1838-天保9:1839-天保10:1840-天保11:1841-天保12:1842-天保13:1843-天保14:1844-天保15:1845-弘化2:1846-弘化3:1847-弘化4:1848-嘉永1:1849-嘉永2:1850-嘉永3:1851-嘉永4:1852-嘉永5:1853-嘉永6:1854-嘉永7:1855-安政2:1856-安政3:1857-安政4:1858-安政5:1859-安政6:1860-万延1:1861-文久1:1862-文久2:1863-文久3:1864-元治1:1865-慶応1:1866-慶応2:1867-慶応3:1868-明治1:1869-明治2:1870-明治3:1871-明治4:1872-明治5:1873-明治6:1874-明治7:1875-明治8:1876-明治9:1877-明治10:1878-明治11:1879-明治12:1880-明治13:1881-明治14:1882-明治15:1883-明治16:1884-明治17:1885-明治18:1886-明治19:1887-明治20:1888-明治21:1889-明治22:1890-明治23:1891-明治24:1892-明治25:1893-明治26:1894-明治27:1895-明治28:1896-明治29:1897-明治30:1898-明治31:1899-明治32:1900-明治33:1901-明治34:1902-明治35:1903-明治36:1904-明治37:1905-明治38:1906-明治39:1907-明治40:1908-明治41:1909-明治42:1910-明治43:1911-明治44:1912-大正1:1913-大正2:1914-大正3:1915-大正4:1916-大正5:1917-大正6:1918-大正7:1919-大正8:1920-大正9:1921-大正10:1922-大正11:1923-大正12:1924-大正13:1925-大正14:1926-大正15:1927-昭和2:1928-昭和3:1929-昭和4:1930-昭和5:1931-昭和6:1932-昭和7:1933-昭和8:1934-昭和9:1935-昭和10:1936-昭和11:1937-昭和12:1938-昭和13:1939-昭和14:1940-昭和15:1941-昭和16:1942-昭和17:1943-昭和18:1944-昭和19:1945-昭和20:1946-昭和21:1947-昭和22:1948-昭和23:1949-昭和24:1950-昭和25:1951-昭和26:1952-昭和27:1953-昭和28:1954-昭和29:1955-昭和30:1956-昭和31:1957-昭和32:1958-昭和33:1959-昭和34:1960-昭和35:1961-昭和36:1962-昭和37:1963-昭和38:1964-昭和39:1965-昭和40:1966-昭和41:1967-昭和42:1968-昭和43:1969-昭和44:1970-昭和45:1971-昭和46:1972-昭和47:1973-昭和48:1974-昭和49:1975-昭和50:1976-昭和51:1977-昭和52:1978-昭和53:1979-昭和54:1980-昭和55:1981-昭和56:1982-昭和57:1983-昭和58:1984-昭和59:1985-昭和60:1986-昭和61:1987-昭和62:1988-昭和63:1989-平成1:1990-平成2:1991-平成3:1992-平成4:1993-平成5:1994-平成6:1995-平成7:1996-平成8:1997-平成9:1998-平成10:1999-平成11:2000-平成12:2001-平成13:2002-平成14:2003-平成15:2004-平成16:2005-平成17:2006-平成18:2007-平成19:2008-平成20:2009-平成21:2010-平成22:2011-平成23:2012-平成24:2013-平成25:2014-平成26
</syntaxhighlight>
+
</syntaxhighlight2>
  
 
タイムゾーン名
 
タイムゾーン名
<syntaxhighlight lang="text">
+
<syntaxhighlight2 lang="text">
 
ACT                              オーストラリア中部標準時
 
ACT                              オーストラリア中部標準時
 
AET                              オーストラリア東部標準時
 
AET                              オーストラリア東部標準時
6,505行: 6,505行:
 
Zulu                            GMT
 
Zulu                            GMT
  
</syntaxhighlight>
+
</syntaxhighlight2>
  
 
各言語での日本時間の表記
 
各言語での日本時間の表記
<syntaxhighlight lang="text">
+
<syntaxhighlight2 lang="text">
 
Asia/Tokyo af          Japan-standaardtyd
 
Asia/Tokyo af          Japan-standaardtyd
 
Asia/Tokyo af_NA      Japan-standaardtyd
 
Asia/Tokyo af_NA      Japan-standaardtyd
7,193行: 7,193行:
 
Asia/Tokyo zu          Isikhathi esivamile sase-Japan
 
Asia/Tokyo zu          Isikhathi esivamile sase-Japan
 
Asia/Tokyo zu_ZA      Isikhathi esivamile sase-Japan
 
Asia/Tokyo zu_ZA      Isikhathi esivamile sase-Japan
</syntaxhighlight>
+
</syntaxhighlight2>
  
 
=='''文字列の抽出'''==
 
=='''文字列の抽出'''==
7,200行: 7,200行:
  
 
とにかく文字を数えて、文字列ポインタを移動させ、サロゲートペアなら4バイト、通常のワイド文字範囲なら2byteってなかんじで数えます。面倒ですが、サロゲートペアのことを考えると文字数での抽出はこのような気遣いが必要です。マルチバイト文字でやるときは、また違った対応が必要になります。仕組みとしては文字数とバイト数をきちんと数えて、先頭文字にポインタを合わせる。***ncpy系の関数でそこから必要なバイト数をコピーするという感じになります。コンソール画面ではShiftJISなので文字化けしますから、Unicode文字としてテキストに出力するプログラムになっています。今回のプログラムでは対応しませんでしたが、異体字セレクタに対応すると、2バイト文字にはさらに DB40 DD00 の4バイトが付与されていますので、次の4バイトの値がDB40 DD**になっていないか確認をする必要があり、そのようになっている場合は+4バイトするような計算も必要です。テキストエディタを作成する場合にはフォントを異体字セレクタにしたがって切り替える試みが必要になります。フォントが対応していなければ切り替えることはできないので、処理としては元の文字を表示するだけになります。DB40 DD** のような異体字補助番号は文字コードとして使われないことになっています。
 
とにかく文字を数えて、文字列ポインタを移動させ、サロゲートペアなら4バイト、通常のワイド文字範囲なら2byteってなかんじで数えます。面倒ですが、サロゲートペアのことを考えると文字数での抽出はこのような気遣いが必要です。マルチバイト文字でやるときは、また違った対応が必要になります。仕組みとしては文字数とバイト数をきちんと数えて、先頭文字にポインタを合わせる。***ncpy系の関数でそこから必要なバイト数をコピーするという感じになります。コンソール画面ではShiftJISなので文字化けしますから、Unicode文字としてテキストに出力するプログラムになっています。今回のプログラムでは対応しませんでしたが、異体字セレクタに対応すると、2バイト文字にはさらに DB40 DD00 の4バイトが付与されていますので、次の4バイトの値がDB40 DD**になっていないか確認をする必要があり、そのようになっている場合は+4バイトするような計算も必要です。テキストエディタを作成する場合にはフォントを異体字セレクタにしたがって切り替える試みが必要になります。フォントが対応していなければ切り替えることはできないので、処理としては元の文字を表示するだけになります。DB40 DD** のような異体字補助番号は文字コードとして使われないことになっています。
<syntaxhighlight lang="cpp" line start="1">
+
<syntaxhighlight2 lang="cpp" line start="1">
 
#pragma once
 
#pragma once
 
#include "stdafx.h"
 
#include "stdafx.h"
7,361行: 7,361行:
 
   return 0;
 
   return 0;
 
}
 
}
</syntaxhighlight>
+
</syntaxhighlight2>
 
コンソール側出力
 
コンソール側出力
<syntaxhighlight lang="text">
+
<syntaxhighlight2 lang="text">
 
18
 
18
 
d840:d842:
 
d840:d842:
7,373行: 7,373行:
 
★テキストの新規書き込み
 
★テキストの新規書き込み
 
Error?->0
 
Error?->0
</syntaxhighlight>
+
</syntaxhighlight2>
 
テキスト出力
 
テキスト出力
<syntaxhighlight lang="text">
+
<syntaxhighlight2 lang="text">
 
𠀋𩸽ごはん𠀋𠮷を食べたYo。
 
𠀋𩸽ごはん𠀋𠮷を食べたYo。
 
ごはん𠀋𠮷を食べたYo。
 
ごはん𠀋𠮷を食べたYo。
 
を食べたYo。
 
を食べたYo。
 
ごはん𠀋𠮷
 
ごはん𠀋𠮷
</syntaxhighlight>
+
</syntaxhighlight2>
  
  

2021年8月2日 (月) 00:00時点における版



個人用ツール
名前空間

変種
操作
案内
ツールボックス