dnjiro’s 9VAe blog

誰でもアニメが作れる無料ソフト9VAeきゅうべえ開発者のブログ

外部コントロールできる9VAeのフランス語版がおかしかった理由

外部プログラムからアニメーションをコントロールできるフリーソフト9VAeきゅうべえラズベリーパイ版を公開した。ダウンロードはこちら そのフランス語版の動作がおかしかったので、原因追及した顛末を紹介している。なお、今、公開されているバージョンは正しく動作します。(0.6.13dで修正しました。)

最初につくったバージョンは、日本語、英語では正しく動作するのに、フランス語ではアニメの顔がでかくなるという現象が発生。以下のような感じ。

  • 言語設定をフランス語にすると、オーバーレイの上に描いたアニメキャストの顔が、ばかでかくなってる。不思議なのは、日本語、英語、中国語は問題なくて、フランス語だけ顔がでかい。
  • 9VAeきゅうべえ本体は正常に動いているので、CSV命令を読み込んで、座標値や倍率を取得する部分がおかしいのか。
  • CSVテキストから数値を読み込むには、 sscanf 関数を使ってるのだが、フランス語と英語で数字のコードが違うのか?、そういえば、フランス語で、数字の9をうつと、へんな文字がはいる(これは単にキーボード配列の違いと思うが)フランス語版 9VAeきゅうべえは、フランスの方(こちら) の翻訳のおかげである。なぜフランス語だけおかしくなるのだろうか。

対応方針、どうデバッグするか

  • どんな細かいことでも、原因を追究すると、大きなバグを発見することがある。 というのは今まで何回も正しかった。これを見過ごしてはいけない。
  • 開発環境をいれてデバッガーで値をみるのがてっとり早い。ただフランス語でデバッガが使えるのか・・・

ラズベリーパイ Buster で、Geanyのデバッガーが動作しない

フランス語の小数点はなんと「,」らしい

  • 問題の部分はマウスカーソルにアニメキャストを割り当てる「setM」命令で「setM,1,2,15,"face"」と書いてある。1は設定、2は倍率、15が角度。このパラメータを「sscanf ",%f,%f,%f」で3つの変数に読み込んでいる。sscanf はC言語の文字、数値入力関数。
  • デバッガでみると sscanf の結果、最初の数字が「1.2」、2番目の倍率が「15」、3番目が0になっていた。倍率2が15になったので顔(face)が7倍でかくなった。「1,2」が「1.2」になってるのが問題。
  • ネットで検索すると、なんとフランス語の小数点は「,」らしい。
  • そうすると、CSVファイルのコンマ区切りはどうするのか?と思って検索すると、以下の記事を発見
  • ヨーロッパでCSVファイルが開けない

イタリア、ドイツ、フランスなどでは、小数は「,」、CSVの区切りは「;」らしい

  • とすると、サンプルのCSVデータをフランスのエクセルで開くと、正しく開くことができないのでは?と思って LibreOffice Calc で開いてみると、最初に区切りを指定する画面が表示された。単純テキストと解釈されたもようである。
  • さらに、LibreOffice Calc フランス語で、CSV保存すると「,」区切りで保存された。「;」にはしてないみたい。たしかにそんなものが出回ると迷惑だ。
  • ということで、小数点は「.」CSV区切りは「,」で決定とし、それをフランス語でも正しく動くようにしたい。
  • 対策として、フランス語、イタリア語、ドイツ語の場合、「.」と「,」、「,」と「;」を入れ替えてから、sscanf を使うようにするのが考えられる。しかし sscanf の動作は、Windows / Mac / Android / iOS もみな同じ動作なのか。また、フランスの sscanf がコンマを小数点と解釈するのなら、もっと問題が出るのでは・・・

フランスの sscanf が「,」を小数点にするなら、SVGの解釈に失敗するのでは?

  • ベクトル形式で図形SVGファイルの座標値はピリオドの小数点で、コンマで区切られている。SVG読み込みが全滅しているのではないか?さらに、9VAeの保存をバイナリからSVGに変更しているのだが、大丈夫なのか。
  • フランス語9VAeでSVGファイルを開いてみると、ちゃんと動作しているみたいだ。ソースを調べてみると「,」の分割は自力でやっていて、小数入力だけ sscanf %f を使っていた。フランスでは整数部分だけ正しくよんでいて、小数以下が無視されている可能性がある。うーむ。9VAeのSVG保存については、独自情報も保存しているので大丈夫だった。
  • 英国と米国は、小数の位の表示にピリオドを使用する、世界でも数少ない国という記事を発見。小数点が点なのはマイナーだったのか! -ロケールの設定という記事を発見。これで、sscanf の動作を切り替えられるか、と思ってプログラムでロケールを切り替えてみたが、動作は変わらなかった。
  • 結局、「.」と「,」、「,」と「;」の入れ替え前と後の2通りを行って、正しそうな方を選ぶことにした。言語によって処理を切り替えるということはしない。結果で判断する。例えば、Windows版9VAeきゅうべえは、フランス語でも正常に動作しており、sscanfの小数点はピリオドみたいだ。ただ日本で入手できるWindowsをフランス語設定にしたということなので、フランスでどうなっているかわからん。

言語によって sscanf %f の動作がかわるのは、ラズパイだけだった

あらためて、Windows / Macintosh / Raspberry Pi / Ubuntu の動作を調べてみると、フランス語にして顔が大きくなるのはラズベリーパイだけだった。言語設定によって、sscanf %f の動作がかわるライブラリはあまり採用されていないのかも。SVG入力、データ保存に問題ないということなのでひと安心である。

9VAeきゅうべえに関する問い合わせ