Golang stdin 讀取德語(yǔ)變音符號(hào)錯(cuò)誤
我來(lái)自德國(guó),所以我使用變音符號(hào),如?,?和ü. 然而,Golang 不能從標(biāo)準(zhǔn)輸入正確讀取它們。當(dāng)我執(zhí)行這個(gè)簡(jiǎn)單的程序時(shí):package mainimport ( "bufio" "fmt" "os")func main() { for { b, _, _ := bufio.NewReader(os.Stdin).ReadLine() printBytes(b) }}func printBytes(bytes []byte) { for _, b := range bytes { fmt.Printf("0x%X ", b) } fmt.Println()}我得到輸出:C:\dev\golang>go run test.go?0xE2 0x80 0x9EE2 80 9E不是?UTF-8 中的正確字節(jié)序列(這個(gè)工具告訴我它是一個(gè)“雙低 9 引號(hào)”-> ?),當(dāng)我打印出我讀過(guò)的內(nèi)容時(shí),它會(huì)打印出來(lái)"。我寫了一個(gè)小“hack”,似乎可以正確讀取字符:package main/*#include <stdio.h>#include <stdlib.h>char * getline(void) { char * line = malloc(100), * linep = line; size_t lenmax = 100, len = lenmax; int c; if(line == NULL) return NULL; for(;;) { c = fgetc(stdin); if(c == EOF) break; if(--len == 0) { len = lenmax; char * linen = realloc(linep, lenmax *= 2); if(linen == NULL) { free(linep); return NULL; } line = linen + (line - linep); linep = linen; } if((*line++ = c) == '\n') break; } *line = '\0'; return linep;}void freeline(char* ptr) { free(ptr);}*/import "C"import ( "fmt" "golang.org/x/text/encoding/charmap")func getLineFromCp850() string { line := C.getline() goline := C.GoString(line) C.freeline(line) b := []byte(goline) ub, _ := charmap.CodePage850.NewDecoder().Bytes(b) return string(ub)}func main() { for { line := getLineFromCp850() printBytes([]byte(line)) }}func printBytes(bytes []byte) { for _, b := range bytes { fmt.Printf("0x%X ", b) } fmt.Println()}它打印出來(lái):C:\dev\golang>go run test.go?0xC3 0xA4 0xAC3 A4是正確的字節(jié)序列?(0A 是我的 hack 沒(méi)有剝離的換行符)所以看起來(lái),從 CP850 讀取和轉(zhuǎn)換為 UTF-8 完成了這項(xiàng)工作,正如我所料,但是為什么 Go 會(huì)給我胡言亂語(yǔ)當(dāng)我使用 Go 的功能而不是 cgo 讀取該行?Go 有什么問(wèn)題,它給了我這些值,它不是將輸入字節(jié)解釋為 CP850 而是另一個(gè)字符集?有沒(méi)有更好的 Go-only 方法來(lái)處理這個(gè)問(wèn)題?此問(wèn)題僅在從標(biāo)準(zhǔn)輸入讀取時(shí)出現(xiàn)。當(dāng)我將 UTF-8?打印到標(biāo)準(zhǔn)輸出時(shí),它會(huì)在控制臺(tái)中正確打印。
查看完整描述