簡潔な答え
問題はにありますdot.exe
。GraphVizは、Visual Studio 2005でコンパイルした場合を除いて、LinuxではUnicodeパスを持つファイルを開くことができますが、Windowsではできません。
研究
コードページはに850
、Vimエンコーディングはに設定されUTF-8
ます。
まったく同じエラーは表示されませんが、dot.exe
は間違った引数を受け取るようです。同じファイル名を他のプログラムに渡してみました。
そして、それはちょうどうまくいきました。両方dot.exe
をtype
直接実行してもcmd.exe
同じ結果が得られるため、WindowsコンソールもVimも問題ありません。そのエラーを引き起こす可能性がある次のことはdot.exe
それ自体でした。私の疑いは、すべてのコンソールコマンドでさえもそうではないように、Unicodeでコード化された引数を適切に処理する方法がわからないことです。
https://ss64.com/nt/chcp.html
完全なUnicodeサポートが必要な場合は、PowerShellを使用してください。CMDシェル、パイピング、リダイレクトではUnicodeのサポートが非常に限定されており、ほとんどのコマンドはANSIのみです。動作するコマンドはDIR、FOR / F、およびTYPEのみです。これにより、ファイル(UTF-16LE / BOM)とファイル名の読み取りと書き込みが可能になりますが、それ以外のことはできません。
GraphVizでUnicodeがサポートされているかどうかをウェブで検索したところ、Unicode ファイルはサポートされていますが、ファイル名のUnicodeサポートについては何も見つかりませんでした。私は、GraphVizバグトラッカーに関する報告も、Unicodeという名前のファイルの読み取りに関心のある他の人に関するフォーラムへの投稿も見つかりませんでした。だから私はソースでそれを調べました。ここでは何であるdot.exe
エントリポイントのルックスが好き:
graphviz-2.40.1\cmd\dot\dot.c
int main(int argc, char **argv)
{
. . .
/* --------------------> ARGS ARE BEING PASSED HERE */
gvParseArgs(Gvc, argc, argv);
. . .
以下のargv
ウサギの穴の下:graphviz-2.40.1\lib\common\args.c
int gvParseArgs(GVC_t *gvc, int argc, char** argv)
{
int rv;
if ((argc = neato_extra_args(gvc, argc, argv)) < 0) return (1-argc);
if ((argc = fdp_extra_args(gvc, argc, argv)) < 0) return (1-argc);
if ((argc = memtest_extra_args(gvc, argc, argv)) < 0) return (1-argc);
if ((argc = config_extra_args(gvc, argc, argv)) < 0) return (1-argc);
/* --------------------> HERE GO ALL NON-FLAG ARTUMENTS */
if ((rv = dotneato_args_initialize(gvc, argc, argv))) return rv;
if (Verbose) gvplugin_write_status(gvc);
return 0;
}
graphviz-2.40.1\lib\common\input.c
int dotneato_args_initialize(GVC_t * gvc, int argc, char **argv)
{
for (i = 1; i < argc; i++) {
if (argv[i] && argv[i][0] == '-') {
. . .
/* --------------------> JUST CASUALLY COPYING CHAR POINTERS */
} else if (argv[i])
gvc->input_filenames[nfiles++] = argv[i];
}
そして最後に graphviz-2.40.1\lib\common\input.c
graph_t *gvNextInputGraph(GVC_t *gvc)
{
. . . .
/* --------------------> OPENING THE FILES FOR READ WITH FOPEN */
while ((fn = gvc->input_filenames[fidx++]) && !(fp = fopen(fn, "r"))) {
. . .
}
MDSNが述べるように:
fopen関数は、filenameで指定されたファイルを開きます。_wfopenはfopenのワイド文字バージョンです。_wfopenの引数はワイド文字列です。それ以外の場合、_wfopenとfopenの動作は同じです。_wfopenを単に使用しても、ファイルストリームで使用されるコード化文字セットには影響しません。
Visual C ++ 2005では、fopenはUnicodeファイルストリームをサポートしています。
悲しいことに、ファイルの名前を変更するしかありません。
cmd
がファイル名を受け入れる方法があるかもしれませんが、Unixのような環境をインストールすることは、私自身の優先する処理です。