日本語を含むパス名の問題

Choreonodのインストール先のファルダのパス名に日本語が含まれていると,choreonoid.exeを起動時にdllがロードできないエラーになり,うまく使えません.メッセージビューに以下のようなエラーメッセージが多数表示されます.

プラグインファイル"C:\Users\masutani\Documents\����������\Choreonoid\lib\choreonoid-1.8\CnoidAssimpPlugin.dll"を検出しました.
Error: Cannot load library C:\Users\masutani\Documents\����������\Choreonoid\lib\choreonoid-1.8\CnoidAssimpPlugin.dll: 指定されたモジュールが見つかりません。
Error: プラグインの読み込みができませんでした.

エラーメッセージでおわかりのようにWindowsで使った場合です.

(以下付け足し)
今年度も大学2年生向けの学生実験でChoreonoidを使っています.遠隔授業のため実ロボットが使えないため,Choreonoidを使ったシミュレーション実験に切り替えました.パスの問題は前からわかっていましたので,日本語を含むパスに入れないように注意しているのですが,それでも1割ぐらいの学生はやらかしてくれます.

こんばんは.
確信は持てませんが,OSのファイルシステムのエンコードの問題に見えますね.

もしかしたらですが,Windowsのデフォルトエンコードを変更することで解決するかもしれません.

ご指摘ありがとうございます。

Yuki_Onishiさんのご提案も含めて、今後調査したいと思います。

Windowsで日本語を含むファイルやディレクトリを扱えるよう改良しました。

この改良により、インストール先が日本語を含むディレクトリでも動作するようになりました。

なお、この対応にあたってはChoreonoidのソースコードでファイルやディレクトリを扱っている全ての箇所に対して、内部で使用しているUTF-8の文字コードとWindowsのローカルコードページ(Shift JISなど)との文字コードの変換が必要となりました。これについて上記のコミットでひととおり修正したつもりなのですが、まだ漏れがあるかもしれません。もし使用されていてまだうまく動かない部分がありましたら、お知らせいただけるとうれしいです。(日本語が使えそうなところをひととおり使ってみて不具合がないかテストしていただけると更にうれしいです。。。)

補足です。

Yuki_Onishiさんにご提示いただいた「Windows10のシステムロケールをUTF-8に変更する方法」についても、機能することを確認しました。そちらは上記の修正前のバージョンであっても、ひととおり問題なく動作するようです。有益な情報をありがとうございました。

ただしこの方法は現時点ではやめておいた方が無難です。上記のようにChoreonoidは今回の改良でWindowsの設定を変更しなくても日本語のディレクトリなどを使えるようになりましたので、特に理由がなければ設定変更は行わないようにしてください。

このことも含めて、以下では補足として今回の修正の背景について説明します。

そもそもChoreonoidは内部の文字コードとしてUTF-8を前提とした実装をしています。これは最近のOSでは標準的な方法となっていて、例えばLinuxで多国語対応で動作するアプリケーションの多くもこの方法で実装されていると思われます。UTF-8自体世界的にも普及が進んでいますし、ASCIIコードの延長で実装ができるので、とても扱いやすいです。

これにより、最近のLinuxをはじめとして、UTF-8に対応した環境であれば、Choreonoidは日本語を含む多言語に問題なく対応できているはずです。

しかしそうでもないOSがWindowsです。歴史的経緯もあるかと思いますが、Windowsでは標準では選択したロケールに特有の文字コード(コードページ)が使われることになります。日本語だとコードページCP932のShift JISになります。正確に言うと、Windowsでも内部の文字コードは全てUTF-16のUnicodeで処理されるようになっているのですが、それに対応するには基本的にUTF-16に対応したワイド文字型やAPIを使う必要があります。UTF-8で使用するchar型やそれに対応したAPIを使用すると、実際にはUTF-8ではない(Shift JISなどの)マルチバイト文字コードが使われることになります。

そして上記の「システムロケールをUTF-8に変更する」ことで、Windowsでもchar型の処理がUTF-8で処理されるようになります。この場合Linux等でUTF-8の環境で動かすのと同じ状況になるので、UTF-8を前提として実装されたソフトウェアもそのまま動くようになります。今回Windowsにもこのようなオプションがあることを初めて知ったのですが、これ自体はとてもよいものだと思います。早く標準になってほしいところです。

しかしながら「システムロケールをUTF-8に変更する」こと自体は、Windowsではまだベータ的な扱いとなっています。参考までにこのような意見もあります。

https://twitter.com/unagix/status/1198150413003837440

実際にここまで言うほどヤバいかは分かりませんが、日本語に対応している従来のWindows用ソフトウェアの多くがShift-JISを前提としていて、それらのソフトウェアの多くはUTF-8への設定変更によって正常に動作しなくなるようです。そのようなソフトウェアを使用している場合は、UTF-8への設定変更は問題となりますし、よく分からない場合も避けておいたほうがよいかと思います。

まあこのような状況で、いつになったらWindowsでUTF-8をデフォルトにできるかと言うと、まだもうしばらく時間がかかるのかもしれませんね。正直なところWindowsはいろいろとやっかいではあります。

なお文字コードについてはUTF-8がデファクトになりつつあるわけですが、ここまで至るにはいろいろとあったようですし、コーディングにおいてはまだ気をつけなければいけないところがあるようです。これに関わるC++の言語仕様も紆余曲折あってやっとC++20でひとつ決着が着くようです。そのあたりについて以下のドキュメントがよくまとまっていて興味深かったので、参考までにリンクしておきます。

C++20で導入されるchar8_t型はChoreonoidでも導入したいところですが、C++20がロボット業界で問題なく使えるようになる時期というと、まだまだ先になりそうですね。。。