Now I think I have a solution that conforms to the spirit of **Nim** :
* When input is taken from the terminal, it is regarded to / should be
**UTF-16 LE** encoded.
* When input is taken from a file, it is regarded to / should be **UTF-8**
encoded.
* **echo** does not have to be overloaded; output is **UTF-8** encoded.
This means piping should work in any case.
#console.nim
when defined(windows):
import system/widestrs
import terminal
proc setMode(fd: int, mode: int): int
{.importc: "_setmode", header: "io.h".}
proc fgetws(str: WideCString, numChars: int, stream: File): bool
{.importc, header: "stdio.h".}
proc consoleReadLine*(line: var string): bool =
if stdin.isatty:
discard stdin.getFileHandle.setMode(0x20000) #_O_U16TEXT
let buffer = newWideCString("", 256)
result = fgetws(buffer, 256, stdin)
let length = buffer.len
if length > 0 and buffer[length - 1].int == 10: #discard '\n'
buffer[length - 1] = Utf16Char(0)
let buffer2 = newWideCString("", 2) #discard extra '\n'
discard fgetws(buffer2, 2, stdin)
line = $buffer
discard stdin.getFileHandle.setMode(0x8000) #_O_BINARY
else:
result = stdin.readLine(line)
proc consoleReadLine*(): string =
discard consoleReadLine(result)
else:
proc consoleReadLine*(line: var string): bool =
result = stdin.readLine(line)
proc consoleReadLine*(): string =
result = stdin.readLine
Run