2011-05-24 35 views
3

我想大寫一個UTF-8字符串的每個單詞。但是,我需要的功能是忽略一些開頭的特殊字符,如「( - 。,」。該功能將用於大寫歌曲標題,如下所示:用UTF-8字符串在異常情況下大寫Ruby的第一個字母

marko,gabriel boni,simple傑克 - 召回(原混合)

...將輸出:

馬爾科,加布裏埃爾·博尼,簡單的傑克 - 召回(原件混合)

還應該能夠充分利用UTF-8字符樣「Å」。「é」>「É」。

+0

你的意思是使用羅馬字符,正確的語言嗎?不把UTF-8字符串「ご飯を食べた」分成「ご飯」,「を」,「食べた」。 – sawa 2011-05-24 09:04:55

+0

對不起,是的,這是正確的。我不確定如何描述它。但像「åäöéèí」等字符 – Johan 2011-05-24 09:07:35

回答

3
"åbc".mb_chars.capitalize 
#=> "Åbc" 
"ébc".mb_chars.capitalize.to_s 
#=> "Ébc" 

UPD

,而忽略無字字符:

string = "-åbc" 
str = string.match(/^(\W*)(.*)/) 
str[1] + str[2].mb_chars.capitalize.to_s 
#=> "-Åbc" 
+0

似乎mb_char是RoR的一部分。 – 2017-03-09 15:17:20

+0

@MateuszKonieczny權利 – fl00r 2017-03-09 16:18:54

1

I d身份證,並想過濾很多東西。

我創建了一個常量文件initializers/constants.rb

letters = ("a".."z").collect 
numbers = ("1".."9").collect 
symbols = %w[! @ # $ %^& * () _ - + = | \] { } : ; ' " ?/> . < , ] 
FILTER = letters + numbers + symbols 

然後只是做了檢查,看是否有人在我的過濾器:

if !FILTER.include?(c) 
    #no 
else 
    #yes 
end 

您還可以檢查編碼,它的價值,但你需要知道範圍或具體的數值。我用中文字符做了這個,所以這是我得到我的價值的地方。我會發布一些代碼來給你一個想法:

def check(char) 
    char = char.unpack('U*').first 
    if char >= 0x4E00 && char <= 0x9FFF 
    return true 
    end 
    if char >= 0x3400 && char <= 0x4DBF 
    return true 
    end 
    if char >= 0x20000 && char <= 0x2A6DF 
    return true 
    end 
    if char >= 0x2A700 && char <= 0x2B73F 
    return true 
    end 
    return false 
end 

你當然需要知道這裏的具體數值。

8

爲什麼Unicode :: capitalize方法從unicode library不適合您的需求是否有某些東西?

irb(main):013:0> require 'unicode' 
=> true 
irb(main):014:0> begin Unicode::capitalize 'åäöéèí' rescue $stderr.print "unicode error\n" end 
=> "Åäöéèí" 
irb(main):015:0> begin Unicode::capitalize '-åäöéèí' rescue $stderr.print "unicode error\n" end 
=> "-åäöéèí" 
+0

這應該是正確的答案 – Nerian 2013-01-22 00:16:38

相關問題