【问题标题】:Why Russian characters are displayed incorrectly? [duplicate]为什么俄语字符显示不正确? [复制]
【发布时间】:2018-11-07 19:17:06
【问题描述】:

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

λ 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\1082\1072\1103-\1090\1086 \1073\1077\1083\1080\1073\1077\1088\1076\1072!"

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

【问题讨论】:

    标签: ubuntu haskell terminal


    【解决方案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
    Пожалуйста
    

    请注意,如果您在内部包含 String 的数据类型上调用 show(例如,在像 InvalidDate 这样的构造函数内),那么这将反过来在字符串上调用 show,从而产生不需要的转义.

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

    【讨论】:

    • Show 实例的这种行为需要进行大修......我认为 Unicode 字符在任何地方都不会再造成太大问题了。
    • @leftaroundabout 我同意。转义只能用于不可打印或其他“有趣”的字符。 (在调试过程中,有时查看转义仍然很有用,可以区分相似但不同的字符)
    • 至少,在base 中存在这样一个函数(只转义“有趣”字符的函数)会很好。
    • @leftaroundabout 在 Windows 上使用 System.IO 中的函数打印非 ascii 字符仍然很危险。
    • @JeremyList System.IO 中的函数只是将字符串编码为 UTF-8。这在任何具有 8 位字节的系统上应该是安全的,即在任何系统上。这些字符是否可以真正显示是另一个问题,但无论如何尝试应该是安全的。如果 Windows 控制台由于某种原因无法处理它(这将是完全可悲的),这意味着它已损坏并且不应该使用。
    猜你喜欢
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 2019-07-29
    相关资源
    最近更新 更多