使用带有异常的UTF-8字符串将Ruby中的第一个字母大写

时间:2011-05-24 08:51:51

标签: ruby regex

我想将UTF-8字符串的每个单词大写。但是,我需要函数忽略单词开头的一些特殊字符,比如“( - 。,”。该函数将用于大写歌曲标题,如下所示:

marko,gabriel boni,简单杰克 - 回忆(原创混音)

...会输出:

Marko,Gabriel Boni,Simple Jack - Recall(Original Mix)

它也应该能够利用像“å”>这样的UTF-8字符。 “一个”。 “é”> “E”。

3 个答案:

答案 0 :(得分:8)

为什么来自unicode library的Unicode :: capitalize方法不适合您的需要?

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 
=> "-åäöéèí"

答案 1 :(得分:4)

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

<强> UPD

并且不要忽略任何单词chars:

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

答案 2 :(得分:1)

我这样做了,想要过滤很多东西。

我创建了一个常量文件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

您还可以检查unicode的值,但您需要知道范围或特定值。我用中文字符做了这个,所以这就是我得到我的价值观的地方。我会发布一些代码只是为了给你一个想法:

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

当然,您需要知道具体的值。