Kabuk çağrılırken yanlış kodlama


9

Bir DOT diyagramı deniyordum ve aşağıdakileri yapmaya çalıştım:

:! dot -Tpng -oFab.png %

Dosya óadımın özel bir karakteri ( "Fabricación" da ") olduğu için bir hata aldım :

C:\windows\system32\cmd.exe /c ( dot -Tpng -oFab.png Fabricaci├│n.gv)
Error: dot: can't open Fabricaci├│n.gv
shell returned 2
Hit any key to close this window...

Gördüğünüz gibi, " ├│" için özel karakter değiştiriliyor . Bu Win7 ve NTFS altında vim ve gVim 7.4 ile, bu yüzden dosya adının UTF16 olduğunu varsayalım . Ayrıca, kabuk / cmd'yi çağırırken dosya adının başka bir kodlama olarak yorumlandığını da varsayıyorum ( Carpetsmoker sayesinde varsayılan olarak kod sayfası 850'ye işaret ediyor ).

Bunu nasıl düzeltebilirim?

Elbette, dosyayı yeniden adlandırabilirim, ancak bunun neden olduğunu ve nasıl düzeltileceğini bilmek istiyorum.

Güncelleme : Bu soruyu superuser'da buldum.SE (@ ChristianBrabandt'ın geri bildirimi sayesinde ), ancak yardımcı da görünmüyor.


1
Cygwin veya MobaXterm (Windows için taşınabilir Unix benzeri ortamlar) altındaki komut satırında Vim kullanarak aynı hatayı alıp alamayacağınızı merak ediyorum. Sanmıyorum. Bunu düzeltmenin bir yolu olabilir, böylece Windows cmddosya adını kabul eder, ancak Unix benzeri bir ortam kurmak benim tercih ettiğim işlem olacaktır.
Wildcard

2
Okuduğum kadarıyla, varsayılan olarak cmd.exeunicode değil, kod sayfası 850 . Ayrıca bu cevaba bakınız .
Martin Tournoij

Teşekkürler @Carpetsmoker. Sorumu verdiğiniz bilgilerle güncelleme özgürlüğünü aldım.
Roflo

Tamamen emin değilim, ancak 'termencoding' seçeneğini değiştirmek isteyebilirsiniz.
Christian Brabandt

@ChristianBrabandt Yanlış bir şey yapmadıkça bu işe yaramıyor gibi görünüyor. Tenc'i latin1, utf8 ve cp850 olarak ayarlamayı denedim. Hiçbiri hile yapmıyor gibi görünüyor.
Roflo

Yanıtlar:


2

Kısa cevap

Sorun yatıyor dot.exe. GraphViz, Visual Studio 2005 ile derlenmedikçe (belki de) Linux'ta Unicode yolları olan dosyaları açabilir, ancak Windows'da açamaz.

Araştırma

Kod sayfası 850, Vim kodlaması olarak ayarlanır UTF-8.

resim açıklamasını buraya girin

Aynı hatayı vermiyor, ancak dot.exeyanlış bir argüman alıyor gibi görünüyor. Aynı dosya adını diğer programa aktarmayı denedim.

resim açıklamasını buraya girin

Ve doğru çalıştı. Hem yürütme dot.exeve typedoğrudan gelen cmd.exeaynı sonucu verir Windows Konsol ne de Vim yüzden ne bir sorun. Bu hataya neden olabilecek bir sonraki şey dot.exekendisiydi. Şüphem, Unicode kodlu argümanların nasıl düzgün bir şekilde ele alınacağını bilmemesi, tüm konsol komutlarının bile yapmamasıydı:

https://ss64.com/nt/chcp.html

Tam Unicode desteğine ihtiyacınız varsa PowerShell kullanın. CMD kabuğunda Unicode için hala ÇOK sınırlı destek var, borular, yönlendirme ve çoğu komut hala sadece ANSI. Çalışan tek komut DIR, FOR / F ve TYPE'dir, bu da (UTF-16LE / BOM) dosyalarının ve dosya adlarının okunmasına ve yazılmasına izin verir, ancak başka bir şey yapmaz.

GraphViz'de Unicode desteği varsa web'de arama yaptım ve Unicode dosyalarını desteklediğini ancak dosya adları için Unicode desteği hakkında hiçbir şey olmadığını buldum . Ne GraphViz hata izci hakkında herhangi bir rapor buldum ne de Unicode adlı dosyayı okumak isteyen herkes hakkında forumda mesajlar. Bu yüzden kaynağa baktım. İşte dot.exegiriş noktası neye benziyor:

graphviz-2.40.1\cmd\dot\dot.c

int main(int argc, char **argv)
{
    . . .

/* --------------------> ARGS ARE BEING PASSED HERE */
    gvParseArgs(Gvc, argc, argv);

    . . .

Aşağıdaki argvtavşan deliğine: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];
    }

Ve son olarak 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'nin belirttiği gibi:

Fopen fonksiyonu dosya adına göre belirtilen dosyayı açar. _wfopen geniş karakterli versiyonudur Fopen ; _wfopen argümanları geniş karakterli dizelerdir. _wfopen ve fopen aynı şekilde davranırlar. Sadece _wfopen kullanmanın dosya akışında kullanılan kodlanmış karakter kümesi üzerinde hiçbir etkisi yoktur.

Visual C ++ 2005'te, fopen Unicode dosya akışlarını destekler.

Ne yazık ki, orada tek seçenek dosyayı yeniden adlandırmaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.