我来自德国,所以我使用变音符号,例如 ä、ö 和 ü。然而,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/
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
例如,我设置了这些:L=/[a-z,A-Z,ßäüöÄÖÜ]/V=/[äöüÄÖÜaeiouAEIOU]/K=/[ßb-zBZ&&[^#{V}]]/因此/(#{K}#{V}{2})/匹配"azAZßäÜ"中的"ßäÜ"。有没有更好的方法来处理它们?我能否将这些常量放在我的Ruby安装文件夹中某个文件中的模块中,这样我就可以在我在计算机上编写的任何新脚本中包含/要求它们?(我是新手,我知道我混淆了这个术语;请纠正我。)此外,我能否只获取元字符\L、\V和\K(或任何尚未在Ruby中设置)以在正则表达式中代表它们,所以我不必一直做字符串插值? 最佳答案
问题是: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
有一个很similarquestion已经。其中一种解决方案使用如下代码:string.mb_chars.normalize(:kd).gsub(/[^x00-\x7F]/n,'').to_s这会产生奇迹,直到您注意到它还删除了空格、点、破折号,谁知道还有什么。我不太确定第一个代码是如何工作的,但是它可以去除仅重音吗?或者至少得到一份要保留的字符列表?我对正则表达式的了解很少,但我尝试了(无济于事):/[^\-x00-\x7F]/n#Soitwouldleavethedashalone我将要做这样的事情:string.mb_chars.normalize(:kd).gsub('-','
我在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没有给出明确的答案,但他的链接让我找到了解决方案(谢
在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中,大多数未初始化
当我这样做时,我的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
我正在尝试使用momentjs解析字符串:letdate="19.Juli201605:00";该字符串包含用德语书写的7月,根据momentjs文档,它具有“LLL”格式。当我尝试用解析它时moment(date,'LLL');我弄错了日期。当我尝试用解析它时moment(date,'LLL','de');我收到错误信息:TypeError:config._localeisnull.如何正确解析这个字符串? 最佳答案 您应该使用相应的moment-locales依赖项才能识别其他语言的日期。您可以找到listoflocaleshe
我想匹配非洲约鲁巴语“ẹ́”中的这个字符。通常这是通过在点变音符号下组合'é'和'\u0323'来实现的。我发现:'é\u0323'.match(/[é]\u0323/)worksbut'ẹ́'.match(/[é]\u0323/)doesnotwork.我不只是想匹配e。我想匹配所有组合。现在,我的解决方案涉及枚举所有组合。像这样:/[ÁÀĀÉÈĒẸE̩Ẹ́É̩Ẹ̀È̩Ẹ̄Ē̩ÍÌĪÓÒŌỌO̩Ọ́Ó̩Ọ̀Ò̩Ọ̄Ō̩ÚÙŪṢS̩áàāéèēẹe̩ẹ́é̩ẹ̀è̩ẹ̄ē̩íìīóòōọo̩ọ́ó̩ọ̀ò̩ọ̄ō̩úùūṣs̩]/难道没有更短更好的方法来做到这一点,或者在unicode
Ifyourpagegetscalledusinghttpsprotocol,anyrelativepathtoanexternalcsswillbecalledusinghttpsprotocolaswell.Areyoureallyneedtoencrypt/decryptcsscontents?:DHowever,ifyouuseabsolutepathreferringtoanexternalcss,youcanspecifytheprotocoltouse,generallyhttpratherthanhttps.MaybeIamwrong!请让我知道我的心智模型是否完全错误