はじめに
組み込みソフトであっても、日本国外で使用される可能性がある場合は、国際化対応というものをある程度考えておく必要があります。これがパソコンやスマートフォンのOS上で動くソフトウェアなら、OSから設定を読み出して処理できますが、組み込みソフトなら自ら選択肢を設けて処理する必要があります。国際化対応で最低限気を付けなければならないのは、下記の3点です。
- 日付のフォーマット
- 時間のフォーマット
- 小数点の記号
日付のフォーマット
日付の国際化対応で気を付けなければならないのは、年月日の並びと区切り記号です。
項目 | 選択肢 |
---|---|
年月日の並び | yyyy mm dd(年、月、日) mm dd yyyy(月、日、年) dd mm yyy(日、月、年) |
年月日の区切り記号 | /(スラッシュ) -(ハイフン) .(ピリオド) |
特に注意が必要なのは年月日の並びで、月と日の並びが国によって変わります。これにより「02/11/2000」という日付をみたとき、「11月2日」と認識する国と、「2月11日」と認識する国があるのです。
時間のフォーマット
時間の国際化対応で気を付けなければならないのは、時間の並びと区切り記号です。
項目 | 選択肢 |
---|---|
時間の並び | hh mm ss(時、分、秒) hh mm ss tt(時、分、秒、午前午後) tt hh mm ss tt(午前午後、時、分、秒) |
時間の区切り記号 | :(コロン) -(ハイフン) .(ピリオド) |
時間の並びは「午前午後」の有無があります。しかし時間は24時間制とし、12時間制の対応は考えません。午前午後の表記は国ごとに異なる文字が使われ、対応が困難だからです。このため時間の並びについては、実質選択肢は「時、分、秒」の1択です。
小数点の記号
国際化対応を考えるうえでもっとも障害となるのが、この小数点の記号です。
項目 | 選択肢 |
---|---|
小数点の記号 | .(ピリオド)[イギリス式] ,(コンマ)[フランス式] その他 |
日本ではピリオドが用いられていますが、世界の半分はコンマです。そしてこれが思わぬ障害となります。データをコンマで区切れなくなるのです。これにより昔からよく用いられてきた簡易データフォーマットであるCSV(character-separated values)を使う場合が注意が必要な他、電文のフォーマットにコンマを用いるのも避ける必要があります。なお小数点の記号にはその他という例外もありますが、そこまでは対応しません。
printf関数の小数点の記号を変更する
C言語でよく用いられるprintf系関数は、(日本においては?)デフォルトの小数点記号がピリオドになっています。これをコンマにするには、setlocale関数でロケール(国情報)を変更します。
#include <locale.h>
#include <stdio.h>
void func(void)
{
char *s1, *s2;
// 小数点の記号をピリオドにする
setlocale(LC_NUMERIC, "JPN"); // 日本式
sprintf(s1, "%5.3f", 1.234); // s1 = "1.234"
// 小数点の記号をコンマにする
setlocale(LC_NUMERIC, "FRA"); // フランス式
sprintf(s2, "%5.3f", 1.234); // s2 = "1,234"
}
処理系によっては国の選択肢がJPNしかないなど、「locale.h」にまともに対応していないものもあります。そのような場合は文字列に変換したあとにコンマに置き換えるか、下記のように自作することを考えてください。
CSV(character-separated values)
簡易的なデータフォーマットとしてよく用いられるCSV(comma-separated values)ですが、先のとおり小数点の記号がコンマの国では使えません。この代替手段として、コンマ以外の記号で区切る必要があります。代表的な区切り記号としては下記表のものがあり、これらをまとめてCSV(character-separated values)と呼ぶこともあります。
区切り記号 | 略称 | 正称 |
---|---|---|
コンマ | CSV | comma-separated values |
タブ | TSV | tab-separated values |
セミコロン | SSV | semicolon-separated values |
スペース | SSV | space-separated values |
コメント