Ubuntu 为什么俄文字符显示不正确?

Ubuntu 为什么俄文字符显示不正确?,ubuntu,haskell,terminal,Ubuntu,Haskell,Terminal,当我运行程序时,我看到以下内容: λ ashot Weather → λ git master* → stack exec Weather-exe Пожалуйста, укажите дату для прогноза в формате ГГГГ-ММ-ДД: 2018-11-07 Пожалуйста, укажите один из этих марзов: [Aragatsotn,Ararat,Armavir,Dilijan,Gegharkunik,Gyumri,Kotayk,Shi

当我运行程序时,我看到以下内容:

λ ashot Weather → λ git master* → stack exec Weather-exe
Пожалуйста, укажите дату для прогноза в формате ГГГГ-ММ-ДД:
2018-11-07
Пожалуйста, укажите один из этих марзов: [Aragatsotn,Ararat,Armavir,Dilijan,Gegharkunik,Gyumri,Kotayk,Shirak,Syunik,Vanadzor,Yerevan]
Yerevan 
一切正常。 但当我输入错误的内容时,我会得到:

InvalidDate“\1058\1077\1082\1089\1090\1082\1086\1090\1086\1088\1099\1081\1074\1099\1074\1074\1077\1083\1080-\1101\1090\1086\1082\1072\1103-\1090\1086\1073\1077\1083\1083\1080\1073\1077\1088\1076\1072!”

但不是这些数字1072/1052。。。我应该会收到俄语文本。
如何解决此问题以正确显示俄语字符?

您可能正在对字符串调用
show
。这也可能隐式发生,例如通过
打印
,或通过要求GHCi打印字符串

考虑本次GHCi会议:

> str = "Пожалуйста"                                           
> str                                                          
"\1055\1086\1078\1072\1083\1091\1081\1089\1090\1072"                  
变量
str
包含正确的字符串。当我们要求GHCi打印它时,它隐式地调用
print str
,它调用
show

show
依次将字符串转换为ASCII转义形式,将所有不可打印字符转换为转义序列

我强调字符串
str
确实是预期的字符串:如果使用
putStrLn
,我们可以正确打印它,例如:

> putStrLn str
Пожалуйста
请注意,如果对内部包含
字符串的数据类型调用
show
(例如,在构造函数内部,如
InvalidDate
),则会依次调用字符串上的
show
,产生不需要的转义


我建议为您的类型编写一个定制的漂亮打印机,并使用它,这样字符串就不会因为这个转义而损坏。

Show
实例的行为需要大修。。。我不认为Unicode字符在任何地方都会造成太大的问题。@LeftArounda我同意。转义符只能用于不可打印或其他“有趣”字符。(在调试过程中,有时还可以看到转义,以区分相似但不同的字符)至少,对于这样一个函数(只转义“有趣”字符的函数)是很好的存在于
base
@leftaround关于使用
System.IO
中的函数在Windows上打印非ascii字符仍然是危险的。@Jeremy从
System.IO
中列出函数只需将字符串编码为UTF-8即可。这在任何具有8位字节的系统上都应该是安全的,即在任何系统上。这些字符是否真的可以显示是另一个问题,但无论如何应该可以安全地尝试。如果Windows控制台由于某种原因无法处理它(这将是非常可悲的),这意味着它已损坏,不应使用。