2010-08-31 5 views
4

Regardez, je suis essayerHaskell IO avec des caractères non anglais

appendFile "out" $ show 'д' 

'д' est le caractère de l'alphabet russe. Après ce fichier "out" contient:

'\1076' 

Comment je comprends est le code numérique unicode de caractère 'д'. Pourquoi cela arrive-t-il? Et comment puis-je obtenir la représentation normale de mon personnage?

Pour plus d'informations, il est fonctionne bien:

appendFile "out" "д" 

Merci.

Répondre

3

Après avoir lu votre réponse à mon commentaire, je pense que votre situation est que vous avez une structure de données, peut-être avec le type [(String,String)], et vous Si vous souhaitez l'utiliser pour déboguer, utilisez show pour éviter les caractères non-ASCII,

Le problème h Bien que ce ne soit pas avec l'Unicode, vous avez besoin d'une fonction qui formatera correctement vos données pour l'affichage. Je ne pense pas que show soit le bon choix, en partie à cause des problèmes d'échappement de certains caractères. Ce dont vous avez besoin, c'est d'une classe de type comme Show, mais celle qui affiche les données à lire au lieu d'échapper les caractères. Autrement dit, vous avez besoin d'une imprimante jolie, qui est une bibliothèque qui fournit des fonctions pour formater les données pour l'affichage. Il y a plusieurs jolies imprimantes disponibles sur Hackage, je regarderais uulib ou wl-pprint pour commencer. Je pense que l'un ou l'autre conviendrait sans trop de travail.

Voici un exemple avec les outils uulib. La classe de type Pretty est utilisée à la place de Show, la bibliothèque contient de nombreuses instances utiles.

import UU.PPrint 

-- | Write each item to StdOut 
logger :: Pretty a => a -> IO() 
logger x = putDoc $ pretty x <+> line 

dans l'exécution de ce ghci:

Prelude UU.PPrint> logger 'Д' 
Д 
Prelude UU.PPrint> logger ('Д', "other text", 54) 
(Д,other text,54) 
Prelude UU.PPrint> 

Si vous voulez afficher un fichier au lieu de la console, vous pouvez utiliser la fonction hPutDoc à la sortie d'une poignée. Vous pouvez également appeler renderSimple pour produire un SimpleDoc, puis appliquer une correspondance de modèle aux constructeurs pour traiter la sortie, mais cela pose probablement plus de problèmes.Quoi que vous fassiez, évitez show:

Prelude UU.PPrint> show $ pretty 'Д' 
"\1044" 

Vous pouvez aussi écrire votre propre classe de type similaire à montrer, mais au format que vous le souhaitez. Le module Text.Printf peut être utile si vous suivez cette route.

+0

merci. Je vais essayer – Anton

+0

pourriez-vous obtenir conseil comment jolie-imprimantes peuvent m'aider – Anton

+0

J'ai ajouté un exemple qui devrait rendre cela clair. Notez que la façon habituelle d'utiliser une imprimante jolie serait de rassembler toutes vos données à la fois et de rendre le document en une fois. J'ai fait cette ligne-par-ligne parce que c'est plus utile pour le débogage; vous obtiendrez plus de sortie partielle dans votre programme se bloque ou se bloque. –

0

Une recherche rapide sur le Web pour "UTF Haskell" devrait vous donner de bons liens. Probablement le paquet le plus recommandé est le paquet text.

import Data.Text.IO as UTF 
import Data.Text as T 

main = UTF.appendFile "out" (T.pack "д") 
4

show échappe tous les caractères en dehors de la plage ASCII (et certains à l'intérieur de la plage ASCII), donc ne pas utiliser show.

Puisque "д" fonctionne bien, utilisez-le. Si vous ne pouvez pas parce que le д est réellement dans une variable, vous pouvez utiliser [c] (où c est la variable contenant le caractère.) Si vous devez l'entourer de guillemets simples (comme le fait show), vous pouvez utiliser ['\'', c, '\'']

+6

Je pense que 'show' est fortement surutilisé par de nombreux programmeurs Haskell. Il ne convient pas à la joliment impression car il est destiné à être utilisé pour la sérialisation (par exemple, 'read. Show' devrait être égal à' id'), mais les performances sont trop faibles pour la plupart des applications de sérialisation. C'est pratique pour les tests et le prototypage, mais au-delà, j'y réfléchirais à deux fois avant d'utiliser 'show'. –

+0

Je veux utiliser show pour le débogage. 'show' convertit la 'structure de données' en chaîne. Par exemple j'ai [(String, String)] et je souhaite le voir. Bien sûr, le meilleur moyen de sortir de la console Mais ce n'est pas possible. Parce que j'utilise le fichier. – Anton

+0

Je serais d'accord que le débogage est l'une des bonnes utilisations les plus courantes pour le spectacle. Cela devient difficile pour des situations comme la vôtre à cause de l'échappement de caractères en dehors de l'ASCII (et de l'échappement de newline, ce qui est particulièrement ennuyeux pour moi). –

2

Utilisez data.text. Il fournit des IO avec locale de sensibilisation et de soutien de l'encodage.

+2

Data.Text est génial, mais le système d'E/S intégré fournit également une prise en charge des paramètres régionaux et de l'encodage (depuis GHC 6.12). –

0

Pour afficher les caractères nationaux en spectacle, mis dans votre code:

{-# LANGUAGE FlexibleInstances #-} 

instance {-# OVERLAPPING #-} Show String where 
    show = id 

Vous pouvez alors:

*Main> show "ł" 
ł 
*Main> show "ą" 
ą 
*Main> show "ę" 
ę 
*Main> show ['ę'] 
ę 
*Main> show ["chleb", "masło"] 
[chleb,masło] 
*Main> data T = T String deriving (Show) 
*Main> t = T "Chleb z masłem" 
*Main> t 
T Chleb z masłem 
*Main> show t 
T Chleb z masłem 
0

Il n'y avait pas les guillemets dans ma précédente solution. De plus, je mets le code dans le module maintenant et le module doit être importé dans votre programme.

{-# LANGUAGE FlexibleInstances #-} 

module M where 

instance {-# OVERLAPPING #-} Show String where 
    show x = ['"'] ++ x ++ ['"'] 

Informations pour les débutants: rappelez-vous que l'émission n'affiche rien. show convertit les données en chaîne avec des caractères de mise en forme supplémentaires.

Nous pouvons essayer de WinGHCi: par WinGHCi automaticaly

*M> "ł" 
"ł" 
*M> "ą" 
"ą" 
*M> "ę" 
"ę" 
*M> ['ę'] 
"ę" 
*M> ["chleb", "masło"] 
["chleb","masło"] 
*M> data T = T String deriving (Show) 
*M> t = T "Chleb z masłem" 

ou manualy

*M> (putStrLn . show) "ł" 
"ł" 
*M> (putStrLn . show) "ą" 
"ą" 
*M> (putStrLn . show) "ę" 
"ę" 
*M> (putStrLn . show) ['ę'] 
"ę" 
*M> (putStrLn . show) ["chleb", "masło"] 
["chleb","masło"] 
*M> data T = T String deriving (Show) 
*M> t = T "Chleb z masłem" 
*M> (putStrLn . show) t 
T "Chleb z masłem" 

Dans le code à l'affichage:

putStrLn "ł" 
putStrLn "ą" 
putStrLn "ę" 
putStrLn "masło" 
(putStrLn . show) ['ę'] 
(putStrLn . show) ["chleb", "masło"] 
data T = T String deriving (Show) 
t = T "Chleb z masłem" 
(putStrLn . show) t 

J'ajoute tag « Polskie znaki haskell "pour Google.

+0

La dernière ligne du code T "Chleb z masłem" est par erreur. Ne l'utilisez pas. – Egon

+0

Vous pouvez modifier votre réponse pour résoudre ce problème –

Questions connexes