-1

下面的测试程序使用具有类似 \u00FC 的代码点的 DEFAULT 字符串,以及如果该类型的代码点在 prog. 从 cmd 行传递相同的字符串,例如: prog.exe -input="ABC\u00FC" 不会。我认为这是操作系统交互,所以尝试了其他引用,甚至像这样包装:“(ABC \ u00FC)”并修剪func NG内的括号。

对于转义值,“for _, 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。

4

2 回答 2

0

以防它帮助别人

显然,不同的操作系统和/或外壳(在我的情况下是 bash)对 unicode 字符的“\u”有问题。在 bash 的 cmd 行中,用户可以输入 $' the characters' 来保护 \u。有人建议,如果一个字符串与 strconv.Quote 可能是一个解决方案相同的问题,则在程序内。

因为我想要一个面向非计算机用户的操作系统/shell 独立解决方案,所以我做了一个稍微复杂的解决方法。

我告诉用户输入需要 \u 格式的 unicode 以使用 %FC 而不是 \u00FC。我从命令行解析字符串,即使用 rexexp 的 ABC%FC%F6123,在我的 GO 代码中,我将 %xx 替换为 unicode 符文,因为我最初期望得到它。通过几行代码,用户输入现在与操作系统无关。

于 2020-05-12T15:26:43.500 回答
0

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

^ 转义字符。

在命令符号前添加转义字符可以将其视为普通文本。当管道或重定向任何这些字符时,您应该使用转义字符作为前缀:& \ < > ^ |

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

所以你应该做

prog.exe -input="ABC^\u00FC"
于 2020-04-10T23:43:42.463 回答