使用UTF-8字符串大写Ruby中的第一个字母,但有例外

使用UTF-8字符串大写Ruby中的第一个字母,但有例外,ruby,regex,Ruby,Regex,我想将UTF-8字符串的每个单词大写。但是,我需要该函数忽略单词开头的一些特殊字符,如“(.,”。该函数将用于大写歌曲标题,如下所示: marko,gabriel boni,简单杰克回忆(原创混音) …将输出: Marko,Gabriel Boni,简单杰克回忆(原创混音) 它还应该能够大写UTF-8字符,比如“å”>“Å”.“ê”>“ê”.我这样做了,想过滤很多东西 我创建了一个常量文件initializers/constants.rb letters = ("a".."z").collect

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

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

…将输出:

Marko,Gabriel Boni,简单杰克回忆(原创混音)


它还应该能够大写UTF-8字符,比如“å”>“Å”.“ê”>“ê”.

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

我创建了一个常量文件
initializers/constants.rb

letters = ("a".."z").collect
numbers = ("1".."9").collect
symbols = %w[! @ # $ % ^ & * ( ) _ - + = | \] { } : ; ' " ? / > . < , ]
FILTER = letters + numbers + symbols
您也可以检查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
def检查(char)
char=char.unpack('U*')。首先

如果char>=0x4E00&&char=0x3400&&char=0x20000&&char=0x2A700&&char是否存在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 
=> "-åäöéèí"
UPD

要忽略非单词字符:

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

你的意思是使用罗马字符的语言,对吗?不分割UTF-8字符串“ご飯を食べた" 进入“ご飯", "を", "食べた对不起,是的,这是正确的。我不知道如何描述它。但是像“åäèèèèèèè”等字符。看起来mbèu字符是RoR的一部分。
"åbc".mb_chars.capitalize
#=> "Åbc" 
"ébc".mb_chars.capitalize.to_s
#=> "Ébc"
string = "-åbc"
str = string.match(/^(\W*)(.*)/)
str[1] + str[2].mb_chars.capitalize.to_s
#=> "-Åbc"