Pergunta

É possível fornecer dados Unicode para um aplicativo de console, e ler o Unicode caractere / string via Console.ReadKey ()?

Eu sei Unicode funciona ao ler a entrada através de outros métodos, mas infelizmente eu preciso para usar o recurso de 'interceptação' fornecido pelo ReadKey.

Update:

Ao colar um caractere Unicode como U + 03BB (?) para o console, 3 chaves são lidos.

  1. Alt + NumPad1
  2. Alt + NumPad1
  3. Alt + NumPad8

Eu tentei ver se isso é algum tipo de codificação, mas não pode ver nada.

Foi útil?

Solução 3

Agora, este apenas estranho. IIRC meu teste foi em 32-bit, provavelmente Vista.

Agora testado o mesmo em Win7 64 bits, a coisa sangrenta obras!

Assim, ou um Vista ou 32 bits bug.

Por favor alguém pode confirmar isso?

Outras dicas

Infelizmente, Console.ReadKey só é capaz de processar eventos de teclado. eventos de teclado só pode representar coisas que podem ser digitados no teclado (usando as teclas "virtuais" definidos na enumeração ConsoleKey real e). Então, quando usando ReadKey você só vai conseguir duas coisas: um código de chave cru, o que corresponde a uma tecla no teclado, e o caráter traduzido, que é o de caracteres Unicode que o código de chave cru mapeia no página de código de entrada do console (e cada página de código pode mapear um máximo de 256 caracteres). Você não pode ler qualquer outro tipo de dados (ou seja, caracteres que não podem ser diretamente digitados e / ou não possuem um mapeamento na página de código de entrada) com ReadKey.

Além disso, quando você colar um caractere Unicode para o console, a API usada por tentativas ReadKey para traduzir o personagem em um + seqüência nnn do Windows ALT (ou seja, mantenha a tecla Alt e digitar o número do ponto de código no teclado). Infelizmente, ele traduz o caráter primeiro, usando as regras definidas para a página de código de entrada, por isso mesmo se você reconstituir o número ponto de código que você não terá o personagem real que foi colado, você vai conseguir tudo o personagem a página de código mapeia a.

A razão tudo funciona ao usar Read ou ReadLine é que estes são baseados em fluxo, em vez de baseadas no teclado, métodos. Obviamente qualquer personalidade qualquer pode entrar através do fluxo de entrada, já que não há teclado e página de código acontecimento tradução. Mas você não pode chegar ao fluxo de entrada directamente utilizando ReadKey, apenas o teclado (e se o fluxo de entrada foi redirecionada de algum lugar que não seja o teclado, ReadKey vão falhar inteiramente).

Pode haver alguma maneira de replicar a funcionalidade "interceptação" de ReadKey usando o fluxo de entrada se você usar manualmente a API console com P / Invoke, mas seria trivial, e o console não é realmente concebido para fazer isso tipo de coisa que você provavelmente estaria lutando por todo o caminho.


Edit: Tudo o que disse, você ainda pode implementar suas próprias combinações de teclas para permitir caracteres Unicode para ser introduzido através do teclado - tais como o tipo CTRL + ALT + L e depois dígitos hexadecimais de quatro - sua rotina ReadKey poderia detectar a CTRL + ALT + L e em seguida, pegue os próximos quatro teclas e fazer um int fora deles e convertê-lo em um char -. mas é claro que isso não permitiria colar

O objecto ConsoleKeyInfo retornado por Console.ReadKey () tem uma propriedade chamada KeyChar contendo o caractere de Unicode da tecla pressionada ou combinação de teclas (se a chave ou combinação de teclas tem uma Unicode equivalente). Então ...

char c = Console.ReadKey().KeyChar;

Você vai ter um '\ 0' char se a chave não tem um Unicode equivalente (por exemplo, uma tecla de função).

Você pode usar um StringBuilder para concatenar esses caracteres juntos em uma seqüência de caracteres Unicode, se necessário.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top