草庐IT

Golang stdin 读错了德语变音符号

coder 2024-07-06 原文

我来自德国,所以我使用变音符号,例如 äöü。然而,Golang 无法从标准输入中正确读取它们。

当我执行这个简单的程序时:

package main

import (
    "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 0x9E

E2 80 9E 不是 UTF-8 中 ä 的正确字节序列(this tool 告诉我这是一个“DOUBLE LOW-9 QUOTATION MARK” -> ),当我打印出我读过的内容时,它打印出 "。我写了一个小的“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()
}

然后打印出来:

C:\dev\golang>go run test.go
ä
0xC3 0xA4 0xA

C3 A4ä 的正确字节序列(0A 是换行符,我的 hack 没有去掉)所以看起来,从 CP850 读取并转换为正如我所料,UTF-8 完成了这项工作,但为什么当我使用 Go 的功能而不是 cgo 阅读该行时,Go 会给我乱码? Go 有什么问题,它给了我这些值,它不会将输入字节解释为 CP850 而是另一个字符集吗?有没有更好的 Go-only 方法来处理这个问题?

此问题仅在从标准输入读取 时出现。当我将 UTF-8 ä 打印到标准输出时,它会在控制台中正确打印。

最佳答案

所以对于某些系统来说,这是 Golang 中的一个错误,特别是对于 Windows 系统,在这些系统中,总体使用的字符集和控制台字符集是不同的(其中 GetACP()GetConsoleCP() 来自 WinAPI 返回不同的东西)。例如,在德国(可能还有其他西欧国家),Windows 使用代码页 1252 作为整体字符集,但它使用代码页 850 作为控制台 cmd.exe。不知道为什么,但事实就是如此。 Golang 错误地使用 GetACP() 将输入解码为 UTF-8,而实际上它本应使用 GetConsoleCP() 返回的代码页。我们在 Issue 中发现了问题我创建了,我们希望看到为下一版本的 Golang 合并的修复程序。

我们还在 Windows 上发现了一个问题,其中 Golang 将字符解码为分解的 UTF-8 字符(即它会将 ä 读取为字符 a 后跟 COMBINING DIAERESIS ̈),这可能会导致其他问题,例如,打印那些分解的字符会将它们分开打印,而不是打印一个组合字符。

关于Golang stdin 读错了德语变音符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39111624/

有关Golang stdin 读错了德语变音符号的更多相关文章

  1. ruby - 我的 Ruby IRC 机器人没有连接到 IRC 服务器。我究竟做错了什么? - 2

    require"socket"server="irc.rizon.net"port="6667"nick="RubyIRCBot"channel="#0x40"s=TCPSocket.open(server,port)s.print("USERTesting",0)s.print("NICK#{nick}",0)s.print("JOIN#{channel}",0)这个IRC机器人没有连接到IRC服务器,我做错了什么? 最佳答案 失败并显示此消息::irc.shakeababy.net461*USER:Notenoughparame

  2. ruby - 如何为字母、元音和辅音等德语字符类编写正则表达式? - 2

    例如,我设置了这些:L=/[a-z,A-Z,ßäüöÄÖÜ]/V=/[äöüÄÖÜaeiouAEIOU]/K=/[ßb-zBZ&&[^#{V}]]/因此/(#{K}#{V}{2})/匹配"azAZßäÜ"中的"ßäÜ"。有没有更好的方法来处理它们?我能否将这些常量放在我的Ruby安装文件夹中某个文件中的模块中,这样我就可以在我在计算机上编写的任何新脚本中包含/要求它们?(我是新手,我知道我混淆了这个术语;请纠正我。)此外,我能否只获取元字符\L、\V和\K(或任何尚未在Ruby中设置)以在正则表达式中代表它们,所以我不必一直做字符串插值? 最佳答案

  3. ruby - 如何在 ruby​​ 的 URI 库中使用变音符号 - 2

    问题是:Ruby的URI库不处理元音变音;即irb>require"uri"irb*URI("http://abc.de/äöü")URI::InvalidURIError:badURI(isnotURI?):http://abc.de/äöü我该如何处理?这是Ruby1.9.2,顺便说一下。 最佳答案 调用URI.encode解析前:require'uri'uri=URI(URI.encode("http://abc.de/äöü"))作为旁注,请注意,如果URL包含哈希片段(#something),您将必须手动拆分它:requi

  4. ruby-on-rails - 从字符串中删除重音符号/变音符号,同时保留其他特殊字符(尝试过 mb_chars.normalize 和 iconv) - 2

    有一个很similarquestion已经。其中一种解决方案使用如下代码:string.mb_chars.normalize(:kd).gsub(/[^x00-\x7F]/n,'').to_s这会产生奇迹,直到您注意到它还删除了空格、点、破折号,谁知道还有什么。我不太确定第一个代码是如何工作的,但是它可以去除仅重音吗?或者至少得到一份要保留的字符列表?我对正则表达式的了解很少,但我尝试了(无济于事):/[^\-x00-\x7F]/n#Soitwouldleavethedashalone我将要做这样的事情:string.mb_chars.normalize(:kd).gsub('-','

  5. ruby - 无法在 Ruby 1.9.3 IRB 中输入变音符号 - 2

    我在Ruby1.9.3的IRB和MacOS10.7.3中遇到了非常奇怪的行为当我尝试输入变音符号时,它在提示符中被转义,看起来像这样(我在键盘上输入了"ü")irb(main):001:0>"\U+FFC3\U+FFBC"最奇怪的是:irb(main):001:0>"\U+FFC3\U+FFBC".length=>0当然,字符也不显示:irb(main):001:0>"\U+FFC3\U+FFBC"=>""有谁知道这里发生了什么或如何解决这个问题? 最佳答案 VictorMoroz没有给出明确的答案,但他的链接让我找到了解决方案(谢

  6. ruby - 在 Ruby 中,为什么在启动 irb 之后出现 foo.nil?说未定义的错误,@foo.nil?给出 "true"和 @@wah.nil?又报错了? - 2

    在Ruby1.8.7和1.9.2中相同:$irbruby-1.8.7-p302>foo.nil?NameError:undefinedlocalvariableormethod`foo'for#from(irb):1ruby-1.8.7-p302>@bar.nil?=>trueruby-1.8.7-p302>@@wah.nil?NameError:uninitializedclassvariable@@wahinObjectfrom(irb):3为什么实例变量与局部变量和类变量的处理方式不同? 最佳答案 在Ruby中,大多数未初始化

  7. ruby - DateTime.strptime 我做错了什么? - 2

    当我这样做时,我的ruby​​程序说我的日期无效:format="%D/%M/%Y%H:%M:%S:3N"date="21/03/201116:39:11.642"DateTime.strptime(time,format)这个我也试过:format="%D/%M/%Y%H:%M:%S:3"我得到的是这个:ArgumentError:invaliddatefrom/usr/local/lib/ruby/1.9.1/date.rb:1688:in`new_by_frags'from/usr/local/lib/ruby/1.9.1/date.rb:1713:in`strptime'fro

  8. javascript - momentjs 解析德语日期字符串 - 2

    我正在尝试使用momentjs解析字符串:letdate="19.Juli201605:00";该字符串包含用德语书写的7月,根据momentjs文档,它具有“LLL”格式。当我尝试用解析它时moment(date,'LLL');我弄错了日期。当我尝试用解析它时moment(date,'LLL','de');我收到错误信息:TypeError:config._localeisnull.如何正确解析这个字符串? 最佳答案 您应该使用相应的moment-locales依赖项才能识别其他语言的日期。您可以找到listoflocaleshe

  9. Javascript 正则表达式 + Unicode 变音符号组合字符` - 2

    我想匹配非洲约鲁巴语“ẹ́”中的这个字符。通常这是通过在点变音符号下组合'é'和'\u0323'来实现的。我发现:'é\u0323'.match(/[é]\u0323/)worksbut'ẹ́'.match(/[é]\u0323/)doesnotwork.我不只是想匹配e。我想匹配所有组合。现在,我的解决方案涉及枚举所有组合。像这样:/[ÁÀĀÉÈĒẸE̩Ẹ́É̩Ẹ̀È̩Ẹ̄Ē̩ÍÌĪÓÒŌỌO̩Ọ́Ó̩Ọ̀Ò̩Ọ̄Ō̩ÚÙŪṢS̩áàāéèēẹe̩ẹ́é̩ẹ̀è̩ẹ̄ē̩íìīóòōọo̩ọ́ó̩ọ̀ò̩ọ̄ō̩úùūṣs̩]/难道没有更短更好的方法来做到这一点,或者在unicode

  10. javascript - 我的心智模型错了吗?如果使用 https 调用页面,则将使用 https 调用相对 css 路径 - 2

    Ifyourpagegetscalledusinghttpsprotocol,anyrelativepathtoanexternalcsswillbecalledusinghttpsprotocolaswell.Areyoureallyneedtoencrypt/decryptcsscontents?:DHowever,ifyouuseabsolutepathreferringtoanexternalcss,youcanspecifytheprotocoltouse,generallyhttpratherthanhttps.MaybeIamwrong!请让我知道我的心智模型是否完全错误

随机推荐