Windows 10 版のPharo で日本語のディレクトリ名を含んだフォルダから起動できるVMをビルドする件

(2022.8.11 追記)
manifest を修正すれば、新たなVMを作らなくても良いことがわかったので、この記事は不要となった。次の記事を見よ。

タイトル長い。

前回の記事にて、Windows 10 で日本語を含んだフォルダに格納されている Pharo システムを起動しようとすると、うまくいかない件について説明した。

要するに、素のWindows 10ではアプリへ引き渡す実行ファイルパスがShift JIS なのに対して、Pharo VM ではUTF-8が来ることを想定していることに起因する問題だった。
(CJK以外ではきっと問題にならないのでしょう)

いろいろ試した結果、VM を読み込む際にファイル名を Shift-JIS から UTF-8 に変更すれば万事解決することがわかった。

変更箇所は src/client.c だけ。diff したものを下に記載する。

*** src/client.c	2022-07-30 16:34:45.625821758 +0900
--- changes4/client.c	2022-08-10 17:03:13.256402934 +0900
***************
*** 207,213 ****
--- 207,227 ----
      sqImageFile imageFile = NULL;
      /* Open the image file. */
+ #ifdef _WIN32
+     size_t acpLength = strlen(fileName);
+     int utf16Length = MultiByteToWideChar(CP_ACP, 0, fileName, acpLength, NULL, 0);
+
+     WCHAR *utf16String = (WCHAR*)alloca((utf16Length + 1) * 2);
+     MultiByteToWideChar(CP_ACP, 0, fileName, acpLength, utf16String, utf16Length + 1);
+
+     int utf8Length = WideCharToMultiByte(CP_UTF8, 0, utf16String, utf16Length, NULL, 0, NULL, FALSE);
+     char *utf8filename = (char*)alloca(utf8Length + 1);
+     WideCharToMultiByte(CP_UTF8, 0, utf16String, utf16Length, utf8filename, utf8Length + 1, NULL, FALSE);
+
+     imageFile = sqImageFileOpen(utf8filename, "rb");
+ #else
      imageFile = sqImageFileOpen(fileName, "rb");
+ #endif
      if(!imageFile)
  	{
      	logErrorFromErrno("Opening Image");
***************
*** 223,229 ****
      sqImageFileClose(imageFile);
      char* fullImageName = alloca(FILENAME_MAX);
! 	fullImageName = getFullPath(fileName, fullImageName, FILENAME_MAX);
      setImageName(fullImageName);
--- 237,247 ----
      sqImageFileClose(imageFile);
      char* fullImageName = alloca(FILENAME_MAX);
! #ifdef _WIN32
!     fullImageName = getFullPath(utf8filename, fullImageName, FILENAME_MAX);
! #else /* _WIN32 */
!     fullImageName = getFullPath(fileName, fullImageName, FILENAME_MAX);
! #endif /* _WIN32 */
      setImageName(fullImageName);
 

たぶんこれでOKなはず。お盆開けたらいろいろな環境で試してみるつもり。

2件のコメント

  1. こんなの(manifest)があるんですね。全然知りませんでした。
    盆明けにターゲット環境で動作するか確かめてみます。
    コメントありがとうございました。

現在コメントは受け付けていません。