GO флаг pkg, читающий строку параметров, содержащую экранированные руны, такие как \ u00F C, не будет читаться - PullRequest
0 голосов
/ 11 апреля 2020

Тестовая программа, приведенная ниже, работает как нужно, используя строку DEFAULT, имеющую кодовые точки, такие как \ u00F C, а также если код этого типа кодируется как строка в программе. Передача той же строки из строки cmd, например: prog.exe -input = "ABC \ u00F C" не выполняется. Я предполагал, что это взаимодействие с ОС, поэтому попробовал другие цитаты, даже обернув их, например: «(ABC \ u00F C)» и обрезав парены внутри забавного c NG.

Является ли «для _», runeRead : = range [] rune "Неверно для экранированных значений?

package main

import (
        "fmt"
        "flag"
        "os"
)

var input string
var m = make(map[rune]struct{})

func init() {
        flag.StringVar(&input, "input", "A7\u00FC", "string of runes")
        m['A'] = struct{}{}
        m['\u00FC'] = struct{}{}
        m['7'] = struct{}{}
}

func main() {
        flag.Parse()
        ck(input)      // cmd line - with default OK
        ck("A\u00FC")  // hard code - OK
}

func ck(in string) {
        for _, runeRead := range []rune(in)  {
                fmt.Printf("DEBUG: Testing rune: %v %v\n", string(runeRead), byte(runeRead))

                if _, ok := m[runeRead]; ! ok {
                        fmt.Printf("\nERROR: Invalid entry <%v>, in string <%s>.\n", string(runeRead), in)
                        os.Exit(9)
                }
        }
}

Решение должно работать windows и linux.

1 Ответ

0 голосов
/ 11 апреля 2020

https://ss64.com/nt/syntax-esc.html

^ Escape-символ.

Добавление escape-символа перед символом команды позволяет обрабатывать его как обычный текст. При добавлении или перенаправлении любого из этих символов вы должны использовать префикс перед escape-символом: & \ < > ^ |

e.g.  ^\  ^&  ^|  ^>  ^<  ^^ 

Таким образом, вы должны сделать

prog.exe -input="ABC^\u00FC"
...