第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Golang stdin 讀取德語(yǔ)變音符號(hào)錯(cuò)誤

Golang stdin 讀取德語(yǔ)變音符號(hào)錯(cuò)誤

Go
qq_遁去的一_1 2022-03-03 15:01:01
我來(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)中正確打印。
查看完整描述

1 回答

?
慕姐4208626

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超7個(gè)贊

因此,對(duì)于某些系統(tǒng)來(lái)說(shuō),這是 Golang 中的一個(gè)錯(cuò)誤,特別是針對(duì)整體使用的字符集和控制臺(tái)字符集不同的 Windows 系統(tǒng)(WinAPI 從哪里返回不同的東西)GetACP()。GetConsoleCP()例如,在德國(guó)(可能還有其他西歐國(guó)家),Windows 使用代碼頁(yè) 1252 作為整體字符集,但它使用代碼頁(yè) 850 作為控制臺(tái)cmd.exe。不知道為什么,但就是這樣。Golang 錯(cuò)誤地用于GetACP()將輸入解碼為 UTF-8,而它確實(shí)應(yīng)該使用GetConsoleCP()我們?cè)谖覄?chuàng)建的問(wèn)題中發(fā)現(xiàn)了問(wèn)題,我們希望看到該修復(fù)合并到 Golang 的下一個(gè)版本中。

我們還在 Windows 上發(fā)現(xiàn)了一個(gè)問(wèn)題,其中 Golang 將字符解碼為分解的 UTF-8字符(即它會(huì)讀取一個(gè)?字符a,然后是 COMBINING DIAERESIS ?),這可能會(huì)導(dǎo)致其他問(wèn)題,例如打印這些分解的字符會(huì)將它們分開(kāi)打印而不是一個(gè)組合字符。


查看完整回答
反對(duì) 回復(fù) 2022-03-03
  • 1 回答
  • 0 關(guān)注
  • 175 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)