如何将控制序列与输入字符串分开

时间:2016-08-26 23:09:40

标签: go

我有一个示例程序在我的终端上接受密码,并且我使用终端软件包。但是,当我在输入密码时错误地按下任何箭头键时,我得到了一些奇怪的错误。

我想分开输入密码,然后只使用它进行授权。以下是我的尝试。

我的输入字符串是

// Accept password using terminal.ReadPassword() which returns []byte
// password entered is "\x1b[Aabcd"
// where \x1b[A is the up arrow key and abcd is my input entry. 

for _, c := range bytes.Runes(password) {
                if !unicode.IsPrint(c) {
                    fmt.Printf("\nINVALID PWD ")
                } else {
                    d = append(d, c)
                }
            }
fmt.Println("\n\n", fmt.Sprintf("%c", d))

这里最后打印[Aabcd

无论如何我只能在没有[A这里?]的情况下捕获/打印输入字符?

由于

1 个答案:

答案 0 :(得分:0)

1-如果您需要将控制序列与输入字符串分开,可以使用unicode.IsControl(r)

  

IsControl报告符文是否为控制角色。 C   (其他)Unicode类别包括更多代码点,例如   代理人;使用Is(C,r)来测试它们。

2-另见:getpasswd functionality in Go?

package main

import "fmt"
import "github.com/howeyc/gopass"

func main() {
    fmt.Printf("Password: ")
    pass := gopass.GetPasswd()
    // Do something with pass
}
您可以使用

3-而不是for _, c := range bytes.Runes(password) {for _, r := range password {,如下代码:

d := make([]rune, 0, utf8.RuneCount([]byte(password)))
for _, r := range password {
    if !unicode.IsControl(r) {
        d = append(d, r)
    }
}
fmt.Println(string(d))

4-您也可以将strings.Replace用于VT100代码:

password = strings.Replace(password, "\x1b[A", "", -1)

请参阅:http://www.ccs.neu.edu/research/gpc/MSim/vona/terminal/VT100_Escape_Codes.html