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

时间:2018-11-07 19:17:06

标签: ubuntu haskell terminal

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

T,H,E

一切正常。 但是当我输入错误时,我得到了:

λ ashot Weather → λ git master* → stack exec Weather-exe Пожалуйста, укажите дату для прогноза в формате ГГГГ-ММ-ДД: 2018-11-07 Пожалуйста, укажите один из этих марзов: [Aragatsotn,Ararat,Armavir,Dilijan,Gegharkunik,Gyumri,Kotayk,Shirak,Syunik,Vanadzor,Yerevan] Yerevan

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

1 个答案:

答案 0 :(得分:1)

您可能在字符串上调用show。这也可能隐式发生,例如print,或要求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的数据类型(例如,在String之类的构造函数中)调用InvalidDate,则依次调用show在字符串上,产生不需要的转义。

我建议为您的类型编写一个自定义的漂亮打印机并使用它,以免字符串被这种转义所破坏。