2010-08-05 24 views
26

Đối với loại dữ liệu Char, làm cách nào để xác định rằng tôi muốn sử dụng tiếng Thổ Nhĩ Kỳ thay vì tiếng Anh i cho các hàm toLower và toUpper?Haskell, Char, Unicode và Thổ Nhĩ Kỳ

+7

Được yêu thích. Thổ Nhĩ Kỳ là khó khăn do dotless tôi vấn đề. Đây là trường hợp thử nghiệm tốt nhất cho các chức năng như vậy. –

+12

Hiểu biết về monads là một bước chơi bánh so với xử lý Unicode chính xác. –

+4

@Alex: Thổ Nhĩ Kỳ? Không đề cập đến chữ hoa chữ thường ß -> SS của Đức và chữ thường phụ thuộc vào ngữ cảnh của Hy Lạp Σ -> σ/ς. – kennytm

Trả lời

16

văn bản và gói text-ICU

Tính đến năm 2011, đặt cược tốt nhất của bạn là sử dụng các gói text, và toLower chức năng của the Text ICU package, mà hỗ trợ Char hoạt động tham số của một miền địa phương,

Từ 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 

Chạy này:

> toLower ÇIİĞÖŞÜ gives çıiğöşü 

trong khi ví dụ này chuyển đổi giữa String, bạn cũng có thể để dữ liệu ở định dạng text.

0

có thể thử đặt ngôn ngữ của bạn? không chắc chắn

+5

Ngôn ngữ không ảnh hưởng đến thư viện 'Data.Char' mặc định. Tuy nhiên, – grddev

+0

Miền địa phương ảnh hưởng đến gói 'Data.Text.ICU'. –

15

Thư viện Data.Char trong Haskell không phụ thuộc vào ngôn ngữ. Nó hoạt động cho tất cả các ký tự Unicode, nhưng có lẽ không theo cách bạn mong đợi. Trong the corresponding Unicode chart bạn có thể xem các ánh xạ cho "chấm"/"không có dấu chấm" của tôi.

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

Như vậy, rõ ràng là không ai trong số hai biến đổi có thể đảo ngược . Nếu bạn muốn xử lý đảo ngược các ký tự Thổ Nhĩ Kỳ, có vẻ như bạn phải sử dụng thư viện C hoặc cuộn thư của riêng bạn.

UPDATE: Các Haskell 98 report làm cho điều này khá rõ ràng, trong khi Haskell 2010 report chỉ nói rằng Char tương ứng với một ký tự Unicode, và không định nghĩa một cách rõ ràng ngữ nghĩa của toLowertoUpper.

+0

'toLower 'Tôi nên đưa ra một dấu chấm' i'. –

+2

@ Alexandre: Tôi đã ghi lại cách hoạt động của Haskell và đặc tả Unicode (liên kết) nói gì. Nếu bạn muốn hành vi khác, bạn cần phải thực hiện của riêng bạn (như trong trả lời của jrockway). – grddev

7

Một vấn đề đơn giản Lập trình:

import qualified Data.Char as Char 

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

Sau đó

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

Bạn có thực sự nói với tôi rằng tôi phải hack mọi thư viện gọi Char.toLower để hỗ trợ quốc tế hóa không? –

+4

@ Jonathan: Có, vì đặc tả Haskell chỉ nói tuân theo tiêu chuẩn Unicode, cung cấp các quy tắc tôi đã nêu ở trên. Do đó, bất kỳ thư viện nào sử dụng 'Char.toLower' đều không được chuẩn bị cho việc quốc tế hóa. – grddev

+1

@ Jonathan Allen: Nếu bạn không muốn có hành vi Unicode chuẩn, thì không, bạn không thể sử dụng thư viện theo tiêu chuẩn Unicode. Thật không may, nhưng khá rõ ràng như vậy. – Chuck

1

Bạn có thể kiểm tra this post, sử dụng thư viện văn bản.

Các vấn đề liên quan