2010-08-05 10 views
26

चार डेटा-प्रकार के लिए, मैं कैसे निर्दिष्ट करूं कि मैं अंग्रेजी के बजाए तुर्की के बजाय मैं लोअर और टॉपर फ़ंक्शंस के लिए तुर्की का उपयोग करना चाहता हूं?हास्केल, चार, यूनिकोड, और तुर्की

+7

पसंदीदा। डॉटलेस I मुद्दों के कारण तुर्की मुश्किल है। यह ऐसे कार्यों के लिए सबसे अच्छा परीक्षण-मामला है। –

+12

मोनैड को समझना यूनिकोड को सही तरीके से संभालने की तुलना में एक कैकवॉक है। –

+4

@Alex: तुर्की? जर्मन के मल्टी-अक्षर अपरकेस ß -> एसएस और ग्रीक के संदर्भ-निर्भर लोअरकेस Σ -> σ/ς का उल्लेख नहीं करना है। – kennytm

उत्तर

16

पाठ और पाठ-आईसीयू पैकेज

2011 से, आपका सर्वश्रेष्ठ दांव text पैकेज का उपयोग करने के लिए है, और the Text ICU package की toLower समारोह है, जो Char संचालन के लिए कोई स्थान द्वारा parameterized का समर्थन करता है,

this example से:

import Data.Text (pack, unpack) 
import Data.Text.ICU (LocaleName(Locale), toLower) 

main = do 
    let trLocale = Locale "tr-TR" 
     upStr = "ÇIİĞÖŞÜ" 
     lowStr = unpack $ toLower trLocale $ pack upStr 
    putStrLn $ "toLower " ++ upStr ++ " gives " ++ lowStr 

इस चल रहा है:

+०१२३५१६४१०६१
> toLower ÇIİĞÖŞÜ gives çıiğöşü 

जबकि यह उदाहरण String के बीच परिवर्तित हो जाता है, तो आप डेटा को text प्रारूप में भी छोड़ सकते हैं।

0

शायद अपना लोकेल सेट करने का प्रयास करें? सुनिश्चित नहीं है

+5

लोकेल का डिफ़ॉल्ट 'Data.har' लाइब्रेरी पर कोई प्रभाव नहीं पड़ता है। – grddev

+0

लोकेल हालांकि 'Data.Text.ICU' पैकेज को प्रभावित करता है। –

15

Data.Char हास्केल में लाइब्रेरी लोकेल निर्भर नहीं है। यह सभी यूनिकोड पात्रों के लिए काम करता है, लेकिन शायद आप जिस तरह से उम्मीद करेंगे उसमें नहीं। the corresponding Unicode chart में आप "बिंदीदार"/"dotless" i के लिए मैपिंग देख सकते हैं।

  • toUpper 'i' =>'I'
  • toUpper 'ı' =>'I'
  • toLower 'I' =>'i'
  • toLower 'İ' =>'i'

इस प्रकार, यह स्पष्ट है कि दो रूपांतरण के न पूर्ववत किया जा सकता । यदि आप तुर्की पात्रों के उलटा संचालन चाहते हैं, तो ऐसा लगता है कि आपको या तो सी-लाइब्रेरी का उपयोग करना होगा या अपना खुद का रोल करना होगा।

अद्यतन:Haskell 98 report यह काफी स्पष्ट करता है, जबकि Haskell 2010 report केवल का कहना है कि Char यूनिकोड वर्ण से मेल खाती है, और के रूप में स्पष्ट रूप से toLower और toUpper के शब्दों नहीं परिभाषित करता है।

+0

'toLower' I'' को एक dotless 'i' देना चाहिए। –

+2

@ एलेक्सेंड्रे: मैंने दस्तावेज किया कि हास्केल कैसे काम करता है, और क्या (लिंक) यूनिकोड विनिर्देश कहता है। यदि आप अन्य व्यवहार चाहते हैं, तो आपको अपना खुद का कार्यान्वयन करने की आवश्यकता है (जैसा कि जॉकवे के जवाब में)। – grddev

7

प्रोग्रामिंग का एक सरल बात:

import qualified Data.Char as Char 

toLower 'I' = 'ı' 
toLower x = Char.toLower x 

फिर

toLower <$> "I AM LOWERCASE" == "ı am lowercase" 
+0

क्या आप वास्तव में मुझे बता रहे हैं कि मुझे अंतर्राष्ट्रीयकरण का समर्थन करने के लिए Char.toLower को कॉल करने वाली प्रत्येक लाइब्रेरी को हैक करना है? –

+4

@ जोनाथन: हां, क्योंकि हास्केल विनिर्देश केवल यूनिकोड मानक का पालन करने के लिए कहता है, जो मैंने ऊपर दिए गए नियम प्रदान करता है। इस प्रकार 'Char.toLower' का उपयोग करने वाली कोई भी लाइब्रेरी अंतर्राष्ट्रीयकरण के लिए तैयार नहीं है। – grddev

+1

@ जोनाथन एलन: यदि आप मानक यूनिकोड व्यवहार नहीं चाहते हैं, तो नहीं, आप यूनिकोड मानक का पालन करने वाले पुस्तकालयों का उपयोग नहीं कर सकते हैं। यह दुर्भाग्यपूर्ण है, लेकिन बहुत स्पष्ट रूप से ऐसा है। – Chuck

1

आप this post जाँच कर सकते हैं, पाठ लाइब्रेरी का उपयोग कर।

संबंधित मुद्दे