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控制台由于某种原因无法处理它(这将是非常可悲的),这意味着它已损坏,不应使用。