1

異なるロケールで C++ を使用してタイムスタンプを出力したいのですが、ある特定のホストで fr_FR に対して奇妙な出力が得られます。

ここにコードがあります、

#include <time.h>       /* time_t, struct tm, time, localtime, strftime */
#include <stdlib.h>
#include <locale.h>
#include <clocale>

#include <iostream>
using namespace std;

int main()
{
  time_t rawtime;
    struct tm * timeinfo;
      char buffer [32];

      setlocale(LC_ALL, "");
      cout << "LC_ALL: " << setlocale(LC_ALL, NULL) << endl;
      cout << "LC_CTYPE: " << setlocale(LC_CTYPE, NULL) << endl;


      time (&rawtime);
      timeinfo = localtime (&rawtime);

      strftime (buffer,sizeof(buffer),"%a %b %d %H:%M:%S %Y %Z",timeinfo);
      puts (buffer);

      return 0;
}

上記のプログラムを実行する前に、私は

export LANG=fr_FR.ISO8859-1

それは出力を与えます、

LC_ALL: fr_FR.ISO8859-1
LC_CTYPE: fr_FR.ISO8859-1
ven. avril 12 08:49:55 2013 UTC

%b と %B の両方で同じ出力が得られます。別のマシンをチェックインすると、期待どおりに動作します。出力、

LC_ALL: fr_FR.ISO8859-1
LC_CTYPE: fr_FR.ISO8859-1
jeu avr 11 23:26:24 2013 PDT

1台のマシンで、

$date +%b
avr
$date +%B
avril

問題のあるマシンでは、

$date +%b
avril
$date +%B
avril

この問題を解決するために私を助けてください。

4

1 に答える 1

0

出力は正しく表示されます。

「アヴリル」は、「アヴリル」リファレンスの正当な略語です。

「アヴル」は「アヴリル」の略語でもあります。フランスの月 "juin" と "juillet" は、どちらも同じ 3 文字で始まりますが、最初の 3 文字を使用しても常に機能するとは限りません。

C++ では、デフォルトのロケール以外で月名を短縮する方法を指定していません。したがって、略語が短いと仮定すると、ロケール内で同じ長さ、または世界中のさまざまな OS で同じ長さを実装することには問題があります。

の戻り値を確認することをお勧めしますstrftime()

于 2013-08-25T03:37:41.693 に答える