ICUで和暦

こちらのエントリからコードを拝借。コードページとか。
C++難しいなぁ…。ちゅーか元号変わったら、ICUバージョンアップするのかな?

#include <string>
#include <iostream>
#include "unicode/calendar.h"
#include "unicode/smpdtfmt.h"

void format(char *dst, const char *pattern, const char *codepage, int year, int month, int date, int hour, int minute, int second ){
  UErrorCode status = U_ZERO_ERROR;
  Calendar *cal = Calendar::createInstance("ja_JP_TRADITIONAL", status);
  SimpleDateFormat *fmt = new SimpleDateFormat(UnicodeString(pattern), status);
  fmt->adoptCalendar(cal);

  cal->set(year - 1988, month - 1, date, hour, minute, second);
  UDate now = cal->getTime(status);
  UnicodeString buf;
  fmt->format(now, buf);

  std::string conv(buf.extract(0, buf.length(), 0, codepage), '\0');
  buf.extract(0, buf.length(), &conv[0], "shift_jis");
  memcpy(dst, conv.c_str(), conv.size());
  delete fmt;
}

void puts(int year, int month, int date) {
  char dst[256];
  memset(dst, 0, sizeof(dst));
  format(dst, "Gy.M.d", "Shift_JIS", year, month, date, 0, 0, 0);
  std::cout << dst << std::endl;
}

int main() {
  puts(1800, 1, 1);
  puts(1900, 1, 1);
  puts(1988, 1, 1);
  puts(2008, 1, 1);
}


寛政12.1.1
明治33.1.1
昭和63.1.1
平成20.1.1
寛政とかでるのかー。