Closed yutotakano closed 3 years ago
やはり何かしらのエンコーディングエラーですね、、、AozoraEpub3を直接呼んでみたところ、ヘルプ画面が完全にクエスチョンマークで埋まってしまいました。こちらはUTF-8で表示しているのですが、元が違うということは自分でコンパイルする必要があるのでしょうか、、、
OSの言語が英語だと動かないらしいです(数年前に指摘されたことがありました)
そうですか、ありがとうございます、、、
調べたところ、英語環境ではJavaプログラムへASCII以外の引数がそもそも渡せないらしいです。20年ほど前からバグとして申請されていますが全く相手にされてないようです。
代わりにですが、https://blogs.osdn.jp/2020/05/20/java-unicode.html こちらのブログでexewrap
を使用してEXEに変換したら日本語の引数も受け入れるようになったということが書かれていたので早速やってみたところ、成功いたしました。
> exewrap -a "-Dfile.encoding=UTF-8" -M AozoraEpub3 AozoraEpub3.jar
> AozoraEpub3.exe -enc UTF-8 -of -ext .kepub.epub "G:\Documents\Novels\小説データ\小説家になろう\n9669bk 無職転生 - 異世界行ったら本気だす -\[理不尽な孫の手] 無職転生 - 異世界行ったら本気だす -.txt"
呼び出し方が変わるのでローカルでlib/novelconverter.rb
を編集しようとおもったのですが、なにせRuby経験皆無なもので、インストールされたGemの改変方法が分からない状態です。もし差支えなければ今後誰かが同じ問題にぶつかった時のためも考え、ここで教えてもらってもよろしいでしょうか。
@yutotakano まず、narou がどこにインストールされたかを探す必要がありそうです。gem env
で分かるかもしれません。
narou/lib/novelconverter.rb
を探し、実行部分を改変する必要があります。
が java
のコマンド呼び出しをしているのですが、なんとなく読めますでしょうか。
ここを AozoraEpub3.exe
の呼び出しに変えれば、ひとまずは動くと思います。(ここまで成功した時点で共有して頂くのが良さそう?)
上手くいきそうなら、「java
経由か、exewrap
後かを切り替えるフラグ」みたいなのを用意して頂いて、フラグによって分岐したコードを書ければ取り込みまでいけると思います。
横から失礼しました。
gem env
ありがとうございます!C:\Ruby27-x64\lib\ruby\gems\2.7.0\gems\narou-3.5.1\lib\novelconverter.rb
にて発見できました。場所的にgem update
の際に上書きされそうですが、その時はその時でまた改変しますね。
- command = %!java #{java_encoding} -cp #{aozoraepub3_basename} AozoraEpub3 -enc UTF-8 -of #{device_option} ! +
- %!#{cover_option} #{dst_option} #{ext_option} #{yokogaki_option} "#{abs_srcpath}"!
+ command = %!AozoraEpub3.exe -enc UTF-8 -of #{device_option} ! +
+ %!#{cover_option} #{dst_option} #{ext_option} #{yokogaki_option} "#{abs_srcpath}"!
これで無事narou convert 0
ができるようになりました!
切り替えのフラグについてですが、数年間需要が無かったものですからまずは @whiteleaf7 さんに判断を任せたいと思います。exewrapで包むという過程がエンドユーザーに増えるので、導入がちょっと難しくなる懸念があります(まぁそもそも不可能だったので可能なだけいいのですが)。フラグが別にあっても問題無いようでしたらフォークでちょっと弄ってプルリクしてみますね。
@yutotakano 素早い…良かったですね。
@whiteleaf7 init
処理の追記を何か考えるか、narou setting convert.epub-use-exe
(初期 false 変数)のようなものを増やしていただくのはいかがでしょうか。
java コマンドを偽装すれば良いと思いますが。
windows は bat ファイルを拡張子省略で実行できるので、パスが通ってるところに java.bat を作ってその中で AozoraEpub3.exe を実行すれば良いと思われます (Narou.rb を実行するときだけ偽装したいだろうと思うので、narou コマンドも bat 作ってそこでパス通せばいいんじゃないかなと)
あ!凄いです思いつきもしませんでした! やってみたところ、Gemに変更を施すことなく問題なく使用できることを確認できました、ありがとうございます。
AozoraEpub3のあるフォルダにて、java.bat (または java.cmd)を作成、中身は以下の通りです。
@echo off
rem 最初の 0「java」 1「-Dfile.encoding」 2「UTF-8」 3「-cp」 4「AozoraEpub3.jar」 5「AozoraEpub3」 を消す。イコールサインはスペースとみなされる。
shift && shift && shift && shift && shift
rem 残りを全てくっつけるためのループ
set params=%1
:loop
shift
if [%1]==[] goto launch
set params=%params% %1
goto loop
:launch
AozoraEpub3.exe %params%
narouの時だけ偽装ということについては今のところ特に問題ないのでとりあえず見送らせていただきます。
@whiteleaf7 さんも @takotakot さんも、本当に夜分遅くまでありがとうございました!
まず掲示板ではなくこちらに書き込んでいることをお許しください。海外にいるためか、掲示板に投稿しようとしたところ「逆引きできないホストからの書き込みは禁止されています」と言われてしまいました。日本サーバーのVPN使用でも同様です。
Narou.rb のバージョン: 3.5.1
OS のバージョン: Windows 10 20H2
その他環境情報(任意):
AozoraEpub3-1.1.1b6Q Windows Terminal 使用
何が起きたのか: narou convert 0 の際にFile Not Existエラーが出る。AozoraEpub3のエラーかもしれないが検索しても原因が分からない。 エンコーディングに関係してそうだが細かいことは分からない。パソコン言語は英語で、Windows Terminal表示はUTF-8です。 ファイルは確かに存在する。
再現方法(何をやったら起こったのか詳細に): 新規インストール後: